0x00 前言
emmm,做这个破解主要是因为我自己的010editor因为升级更新,然后授权过期了,现在没法用了,本来想找注册机但发现网上有破解文章,就学习下破解过程。网上针对32位 V9.0的暴力破解,直接修改序列号算法返回值绕过校验,我这里把64位 V9.0.2的也测试了下,可以达到同样的效果,自己动手可以更好的理解这个破解过程,参考文章中可能有些细节没说到,我这里自己动手破解,就把一些细节写一下,文章链接放到最后面。
0x01 破解
这个其实和32位一样的,QT库,VS2103编译,没壳。
打开editor输入任意序列号,可以看到弹窗,我们根据弹窗内容去调试器里搜索即可。
因为是64位,OD用不了,这里用的是x64_dbg,这软件开源的,网上去官网就可以下载了。
010editor拖进去会发现断在ntdll.dll里,并不是主程序入口。
这里点运行会因为 int 3中断再次断在010editor主程序入口
右键菜单-搜索-当前模块-字符串,来查找我们刚才注册失败的字符串。
可确实过滤到指定字符串,我们跳转到字符串调用位置
从该处我们往上翻,其实可以找到一处字符串提示Password Accepted,可能是注册成功的字符串。内存地址为00007FF791227BF2。
为了确定跳转到该处的程序逻辑,我这里使用了IDA来查看,比较直观。
这里我们很直观的看到,如果要跳转到该处,需要先通过一个cmp比较ebx是否等于DBh,相等才跳转,可以猜测DB是序列号校验正确的一个参数。那么如果我们将该处设置为恒等即可暴力破解。
对应到x64dbg里,这里我尝试将jne nop掉,让他无法跳转到注册失败的地方。
右键菜单-二进制-用NOP填充
NOP后如下图
最后右键菜单-补丁,将修改保存。
修补文件
点击010editor_patched.exe,弹出注册页面,但填入任意注册码,都提示Password accessted,成功绕过注册使用软件。
其实到这里算是破解成功了,但每次会有注册弹窗,根据参考文章,可以去除注册弹窗,完美破解。
有几处跳转到cmp ebx,0DBh ,往上可看到一个cmp esi,0E7h,而esi的值通过调用sub_140003F99,将返回值eax赋给esi得到的。如果esi等于0E7,就会进一步比较 ebx,0DB。
尝试运行010editor,并输入任意注册码,上述函数的返回值,如图RAX,为E7h,说明无效注册码,该函数均会返回E7h。
并且还会看到,cmp ebx,0DBh,ebx的值来自sub_14000A565的返回值eax,并且sub_14000A565在图中看到附近调用了两次,均将返回值和0DB比较。该函数可能是检测注册是否成功的关键函数,修改函数名为 lzcheckRegCode。
查看lzcheckRegCode的交叉引用,可以发现有多处调用
并且会发现其他地方的调用也是会比较返回值是否等于0DB,进一步确认可能真的为注册检测函数。
我们进入lzcheckRegCode函数,分析函数,会发现最后eax赋值为0DBh之前,先要调用一个sub_140003F99,判断返回值eax是否等于2Dh,相等才将eax赋值为0DBh,从而注册成功。而这个sub_140003F99正是之前提到的用于和E7h比较。
PS:这里提一句,010editor的函数调用为间接调用,调用函数会跳转到一个函数表,然后在jmp到真正的函数。
我们查看sub_140003F99,该函数会有一系列判断以及异或、移位运算,很可能就是序列号算法函数。根据上面的分析,如果等于E7h会直接进入注册检测,等于2Dh,则表示注册成功,那么在第一次调用该算法函数时,返回值直接为2Dh,是否就可以直接跳过输入注册码验证的步骤。
这种算法函数能暴力修改返回值就没必要分析逻辑了。在函数最后会将ebx赋值为2Dh或者其他值,然后mov给eax,或者直接赋值eax为0E7h等。无需关注之前的,我们通过x64dbg修改返回值。
最后修改如下。我们再次进行补丁保存。
运行010editor_patched.exe,发现不会再弹注册窗口,直接进入 软件,完美破解。
emmm,刚破解完两天,发现补丁失效了,看提示应该是进行了网络验证,因为提示我输入的序列号是无效的,但我序列号校验函数已经bypass了,应该不是本地校验的。
根据提示发现字符串在IDA里查找
往上翻会发现是之前注册校验的一个分支条件跳转。
仔细观察条件判断,发现一共是三个分支,第三个进行注册校验。
根据第一个分支条件提示,这个分支应该是判断网络不通。
而第二个分支应该是判断网络校验失败
为了让网络校验bypass,最终这里只能跳转到第三个分支注册校验,前两个分支都是失败。我们先找分支跳转前,查看是根据哪个函数判断结果进行跳转的。
在0000000140707AD7处找到一个函数,这个我之前分析的时候进行改名了,确定是个网络校验函数。仔细观察条件判断,jns判断eax是否非负,jnz判断eax是否为0,如果有跳转到第三个分支,那么返回值eax一定要大于0。
这里其实可以整理下
a = lzInetCheck if a <= 0: 网络不通 if a == 0: 网络校验失败 else: 进行序列号校验,则可以bypass |
我们在仔细看下这个函数。
通过一些字符串拷贝,可以看到这个函数很可能会跟www.sweetscape.com也就是010editor的官网进行通信校验。
在函数最后有个if判断,其实这里v2恒等于0,只能跳转到else分支。
v2是通过参数a2赋值。a2是 32位 uint
看下这个函数调用前的传参,根据x64的调用约定,rcx传入第一个参数,rdx传入第二个参数,而这里edx异或,就是将edx清零了,所以最终v2只能等于0。
所以我们只需要关注这个函数里第二个else分支就行。通过分析,j_http_open返回值如果不等于0,则v49就等于False(0),则直接返回0xFFFFFFFF(-1),否则返回值由j_network_check决定。根据之前的分析,如果返回值为-1,则跳转到网络不通提示,很容易判断j_http_open会用来判断网络连通性。并且经过OD动态调试,在网络不通的时候,v49就等于0,所以就可以确定j_http_open会用来检查网络连通性。(这个函数没有细究,不过确实会发送web请求,请求结果应该传给j_network_check做校验了)
进入j_network_check函数,可以看到里面有ERROR(这个因为之前被改成invalid)和invalid两个字符串传入一个函数,可以猜测是用来校验HTTP请求回包里是否包含ERROR和invalid这两个字符串。invalid应该是判断验证无效,ERROR应该是请求验证出错之类的。
emmm,这个分析他字符串解析过程会比较麻烦,所以在这里,我尝试修改这两个字符串,让HTTP请求回包里不可能包含这两个字符串,这样就会让程序误以为校验是通过的,从而正常通过校验。
之前一直是静态分析,为了快速和动态调试的地址对应起来,而010editor又开了ASLR,无法直接通过绝对地址对应,这个可以通过修改PE文件的Nt Headynamic_baseder->Optional Header->DllCharacteristics->DYNAMIC_BASE,让该标志位置0。
这两个字符串的地址为000000014197AEDC、0000000141AE5090
通过x64dbg在内存区域,找到该字符串,然后修改
最后补丁保存即可。
如上操作,就可以绕过网络验证了。
0x02 总结
010editor的破解较其他软件要简单的多,通过失败提示字符串入手,找到相关的检测函数,分析注册检测逻辑。
第一个破解方式,将跳转无效化,但会有弹窗,第二个是修改序列号算法函数的返回值,从而达到无需弹窗注册,完美破解。
打了补丁的exe,可以直接拷贝到其他未破解的010editor安装目录下,直接运行即可。
上述是本地校验,后面发现还存在网络校验,会导致之前的破解无效,所以还需要bypass网络校验,通过修改网络校验失败所检查的字符串error和invalid,使之无效,即可绕过网络校验。
0x03 参考
https://bbs.pediy.com/thread-247708.htm