主题更换

博客已将主题更换至 WP 官方的 2015。

可能会有一些错位问题,请尝试 Ctrl+F5;另外如果新主题有错位什么的请务必告知。

因为这个主题不会显示文章摘要,装了个「Advanced Excerpt」,感觉有点蠢,如果文章比较短也会显示唔…

总之,新的一年里也请多多指教啦~ .. 閱讀全文

DLL 劫持代码生成器 [易语言]

代码生成器向导

界面就是这个样子了。

对于 winmm.dll 这种有很多 API 函数的动态链接库,请务必勾选「导出为文本格式源码」,否则易语言会爆炸 (无误)。

直接从易向导生成的代码,记得按一次 F5 然后贴到源码的顶部。因为易语言的限制,不能直接生成代码,所以 /w\

DLL 劫持代码生成向导.rar

25K

2015.05.28

原创

易语言开发

.. 閱讀全文

强行爆破 Multicraft 本地 & 网络验证

嘛 首发是在 吾爱破解,这里姑且算是重新排了下版面吧。

【软件名称】: Multicraft 1.8.2
【下载地址】: http://www.multicraft.org/site/page?view=download
【验证方式】: 本地+联网序列号验证
【开发语言】: Python 2.7
【破解目的】: 绕过序号检查、去除联网验证,实现无码注册。
【作者声明】: 
只是出于对破解感兴趣,请勿用于商业用途;如果你喜欢该软件请购买支持正版。
可能有的地方有错,还请各位看官指出修正,谢谢。

前言

以前尝试过一次破解,但是那时候对脚本语言认识不多,也不怎么会用搜索引擎,自然不知道从何下手。

现在学会了爬文,在论坛也看到了这篇帖子「[本地+网络双验证]破解 Multicraft 控制面板 过本地验证+山寨网络验证全过程」,遂尝试破解。

准备

首先就是手动提取相关文件。文件数据是贴在 exe 末端的“PKZ”字符开始的数据。

最开始我还以为只是一个 PKZ 包,结果搞了半天才发现,这东西是 PyInstaller 自创的 CArchive 格式 (识别代码在文件结尾)… 有兴趣可以去自己看看相关源码。

于是跑到官方拖一份最新的 PyInstaller 源码下来,然后根据源码逆推相关提取/打包代码。

提取、打包脚本

4K

2015.05.24

原创

需要安装 Python 2.7

CArchive 解出来的文件名大概是这样的:

001_0zout00-PYZ.pyz
002_1miu
003_1mstruct
004_1marchive
005_1s_pyi_bootstrap
006_1scarchive
007_1spyi_rth_encodings
008_1smulticraft
009_0oO

解释一下文件名的含义

首先最开始的是文件的序号,确保打包后的顺序不变。

然后就是下划线,连着一个数字。0 表示数据不会被压缩,1 则表示在打包的时候会被压缩。

后面会连着一个字符,其含义请参见源码。目前只需要知道 s 表示的是会被直接执行的脚本。

然后就是开工了,没错,就是 008_1smulticraft 这个文件。

其实我试过直接对 pyz 包进行处理去掉相关验证代码,但是打包出来的会提示找不到 AES 模组… 怀疑打包出来的 pyz 有点问题, 求指导

破解开始

在此之前,前言的帖子里已经给出了破解需要注意的函数位置,所以现在可以直接开工了。

首先在最上面插入一个破解内容的函数,避免命名冲突,然后立马调用:

def loader_patch():
    # 序号检查函数, 尽可能模拟原版
    def custom_load(self):
        self.key = '1111-2222-3333-4444'
        return True
 
    def custom_parse(self):
        self.serial = 9999
        self.customer = 9999
        self.edition = 62
        self.valid = True
        self.licenseOk = True
        return True
 
    license.License.load = custom_load
    license.License.parse = custom_parse
 
    # 破解网络验证 (+ 远端版本检查)
    import threaded
 
    def custom_read(self, params, sendTime, url):
        Global.disabled = False
        return (True, False, '<p>Cracked By Jixun :)</p>')
 
    threaded.PeriodicQuery.read = custom_read
 
loader_patch()

然后调试的时候发现,这破解没用啊,还是读取原来的函数 orz

然后就是偶然间发现了一个可疑的地方 (更改前的 586 行):

sys.modules[Parser.decode('bGljZW5zZQ==')].__dict__[Parser.decode('TGljZW5zZQ==')] = \
sys.modules[Parser.decode('X19tYWluX18=')].__dict__[Parser.decode('UGFyc2Vy')]

文字是 base64 加密,解开看看:

sys.modules["license"].__dict__["License"] = sys.modules['__main__'].__dict__['Parser']

大概是和授权方面有关系,不管他,直接干掉 (求指导,这句我也没怎么懂 orz)。

重新打包,果然可以了。扔张图上来 /w\

Multicraft Dynamic License

需要注意的地方

  • 提取脚本需要确保输出目录存在
  • 打包脚本不会检查输出文件是否已经存在,记得备份
  • 提取脚本不能直接从 exe 提取数据,逻辑没写好 orz

破解后的文件

10M

2014.xx.xx

来源 (可选)

直接覆盖原始文件 // 提取码: 6666

.. 閱讀全文

TreeDBNotes Pro 4 逆向手记

看雪乱逛,看到这个小东西:「【翻译】R4ndom破解教程全文翻译(For新手):第十三章」,其中的实战就是本次的目标。

如果你只是想去找个补丁的话,可以翻到最后面就是了。

首先就是用 DiE 查一查,发现是 Delphi 7 编译的软件。

查壳

没有壳,立马扔到 IDA 然后看字串索引。结果,什么都找不到 orz

于是跑到 IDR 下了一份主程序和 Delphi 7 的裤子,把程序扔进去慢慢分析。


找不到相关内容,只好祭出 OD 动态寻找字符串,基本上参考的教程里做的,找到了关键位置:

// 原 sub_ABE558
int __usercall reWriteRegStatus@(int self@, char regStatus@
) { if ( regStatus != *(_BYTE *)(self + 0x1618) ) *(_BYTE *)(self + 0x1618) = regStatus; return self; }

[self + 0x1618] 这个位置应该就是储存是否为注册版的标记。

查询引用,发现之前的调用

  if ( !a2 )
  {
    reWriteRegStatus(a1, 0);
    sub_AC0F64((int)&v13, 0);
    sub_405020(v4, v13);
    if ( strLen_0(v9, v10, v11) 0xA )
    {
      LOBYTE(v5) = 1;
      v6 = sub_A458F0(a3, v5);
      v7 = bIsProgromRegistered(v6, v14); // 00A4598C
      reWriteRegStatus(v3, v7);           // 00ABE558
      sub_403F08();
    }
  }

推断出位于 00A4598C 的函数就是检测注册码是否有效的。扔到 OD 下断,果然如此;参数2就是输入的注册码。

然后,函数将序列号前4位删掉,然后计算 SHA1 值并与内置的一串 SHA1 进行对比:

00A459AF   .
.. 閱讀全文

巧用 js 对象的属性进行文本去重

需要过滤一段文本,只取得重复内容。

文本不是很大,于是就用 js 的对象做了。

首先是建立一个输入框到当前页面或空白页面;

var jxx = document.createElement('textarea');
document.body.appendChild(jxx);

把文本贴进去,然后执行去重代码:

var o = {};
jxx.value.split('\n').forEach(function(_line){
    o[_line] = 1;
});
jxx.value = Object.keys(o).join('\n');

文本框的内容就会换成没有重复的了。 .. 閱讀全文

Glype – render 函数完全解密

Glype 是一个很出名的网页代理,现在很多网上流传的在线代理都是采用这个脚本的。

render 函数是程序首页调用的一个小代码。

嘛,解密后也就这样啦~

function render($b) {
    /*Removal or alteration of this function is prohibited. Glype vigorously protects and defends its rights.*/
    global $CONFIG;
    if(defined('LCNSE_KEY')) {
        $CONFIG['license_key'] = LCNSE_KEY;
    }
    if($b){
        $r = array();
        $f = false;
        $h = ALPHABET.'~!@#$%^&*()_+-';
        $d = 'proxy';
        $k = 'license_key';
        $g = 'glype';
        $G = 'Glype';
        $p = 'proxif';
        $P = 'Proxify';
        $s = $_SERVER['HTTP_HOST'];
        $y = 'nofollow';
        $w = 'www';
        $o = 'href';
        $e = 'http';
        if(preg_match_all('#(<a[^>]*href\s*=\s*["\']([^"\']*)["\'][^>]*>(.+?)</a>)#si',$b,$m,PREG_SET_ORDER)){
            $c = 0;
            foreach($m AS $a){
                $t = $a[1];
                $u = $a[2];
                $x = $a[3];
                // 检查是否包含 glype 字串
                if(stripos($u, 'glype') !== false){
                    if(stripos($t,'nofollow') !== false || !preg_match('#^http://(www\.)?glype\.com/#',$u)) {
                        $u = $e.'://www.glype.com/';
                        $x = $G;
                    }
                    $b = str_replace($t,'<a href="'.$u.'">'.$x.'</a>', $b);
                    $f = true;
                } elseif (stripos($u,'proxify') !== false||stripos($u,'proxifier') !== false) {
                    if(stripos($t, 'nofollow') !== false||!preg_match('#^http[s]?://(www\.)?proxify\.(com|net|org|info|biz|us)/#',$u)){
                        $u = $e.'s://proxify.com/';
                        $x = $P;
                    }
                    $b = str_replace($t,'<!--RRR-'.$c.'-->',$b);
                    $r[] = '<a href="'.$u.'">'.$x.'</a>';
                    $c++;
                } elseif(stripos($u,'freeproxy.ca') !== false||stripos($u,'www.proxy.org') !== false||stripos($u,'://proxy.org') !== false){
                    if(stripos($t,$y) !== false){
                        $b = str_replace($t,'<a href="'.$u.'">'.$x.'</a>',$b);
                    }
                }
            }
        }
        $b = preg_replace('#proxif#i','prox',$b);
        if(count($r) >= 1){
            if(preg_match_all('#<\!--RRR-(\d+)-->#i',$b,$m,PREG_SET_ORDER)){
                foreach($m AS $n){
                    $b = str_replace('<!--RRR-'.$n[1].'-->',$r[$n[1]],$b);
                }
            }
        }
        $j = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>Error</title></head><body style = "font-size:large;">This installation of the <a href = "http://www.glype.com/">Glype</a>&trade; software is being used ';
        // 检查输出数据是否包含 glype, 如果真的话则检查序号是否为 17 字节且有两个 '-' 且包含数字及字母
        if(!$f && (empty($CONFIG[$k])||strlen($CONFIG[$k]) != 17||substr_count($CONFIG[$k],'-') != 2||!preg_match('#[0-9]#',$CONFIG[$k])||!preg_match('#[a-z]#i',$CONFIG[$k]))){
            $b = ($j).('without a proper copyright attribution notice to Glype (commonly referred to as the &quot;credit link&quot;).
.. 閱讀全文

去掉 WPS4Linux 的起始页面广告

首先,找到 WPS 的路径:

$ ps -Aeo args | grep wps
/bin/bash /usr/bin/wps
/opt/kingsoft/wps-office/office6/wps
grep --color=tty -d skip wps

得出二进制文件所在的路径: /opt/kingsoft/wps-office/office6/

然后就是更改起始页面的配置文件,位于 addins/homepage 目录:
/opt/kingsoft/wps-office/office6/addins/homepage/config.ini

里面会有三个分类,其含义分别为:

  • 2052 – 简体中文,实际测试表示繁体中文也会归类到这里
  • 1041 – 日文
  • 1033 – 英文以及其它未知语言。和简体的页面很相像,但是无广告。

如果只是需要去掉广告,可以把 2052 和 1041 的节点全部删掉,就会回滚到英文的无广告版模板。也可以更改掉语言标识符,例如将 zh_CN 换成 ab_CD,就会回滚了。

预设的语言储存在 /opt/kingsoft/wps-office/office6/mui/ 里面,用户下载的语言则是在 ~/.kingsoft/office6/mui/<版本号>/ 里面。

英文在线模板如果完全不想看到,可以建立一个 blank.html 文件,放置于配置文件目录,内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Blank Page</title>
</head>
<body></body>
</html>

随后,在配置文件如此指向:

et="/opt/kingsoft/wps-office/office6/addins/homepage/blank.html"
wps="/opt/kingsoft/wps-office/office6/addins/homepage/blank.html"
wpp="/opt/kingsoft/wps-office/office6/addins/homepage/blank.html"

重启 WPS 后显示的就是一个空白页面了。

Docer-在线模板 - WPS 文字_014

.. 閱讀全文

油库里 HTML5 播放器

写了个「用户脚本」伪装成 ios 也播放不了视频,于是参考了页面的脚本自己写了个简单的。

手机正常播放油库里的 mp4

截图的时候才发现忘了加上 viewport 属性了 _(:з」∠)_

 

副作用就是,被发现的话封杀妥妥的吧…? 不过贴吧用的油库里 Flash 播放器爆炸到看不见视频已经无法忍了 /.\

欢迎试用:「油库里 html5 播放器」。 .. 閱讀全文

[FC] 「外星科技: 吞食天地 II」的一些研究小记

遇敌多,玩的有点不爽,于是准备开 FCEUX 去调试看看;结果一打开就灰屏…

首先怀疑是 Mapper 错了,于是去爬文看看怎么修,找到这个:「ubuntu fceux成功运行吞食天地2中文版。」。

照着文章,文件头第 8 字节的 43 00 改成了 63 c0 ,能打开了。

文章结尾提及需要手动启用 PAL 模拟制式,要知道我这人很懒 于是又是去爬文看 FCEUX 怎么判定的,爬到了 nesdev 论坛的这篇文:「How do you identify NTSC/PAL iNES roms? .. 閱讀全文

超级网站整站下载器 5.2 破解

一个下载网站静态资源的工具。

建站大师 5.2

破解说明

  • 仅供学习交流之用 请勿用于商业用途。
  • 自动登录:麻麻再也不用担心我需要输入用户名密码了。
  • 本地破解:站群模块等需要服务器授权的功能无法使用。
  • 去除更新:避免因为更新导致破解失效。

注: 若官方已经更新,可以从下方获取当前版本的安装包。

超级网站整站下载器 5.2

补丁: 416k

2015.04.05

本站

可能不适用其他版本

和谐版使用说明:

找到安装目录,覆盖和谐版的文件即可。 .. 閱讀全文

[易语言] 利用构建宏自动填充构建版本和时间

易语言的构建宏如上图。需要易语言 5.3。

照着自带的 cpp 例程源码看了看,感觉移植到易语言的话应该不难。

不费话了,直接上源码。可黑月,已经编译好了一份可以直接拷贝到易语言的 plugins 目录直接用。

易语言 5.3 构建宏插件 (带源码, 可黑月).rar

16k

2015.03.26

原创

需要易语言 5.3

.. 閱讀全文