逆向破解010 Editor
前几天做misc的时候发现010Editor试用期结束了,这回无论怎么卸载再安装也没法使用了,也找不到注册码,于是我想着逆向分析一下这个程序看能不能把他给破解了,多次尝试无果,于是上网查找相关资料,最后真的成功破解了!
接下来记录一下这次破解过程:
一.明确思路:
破解010 Editor需要注册码,如果找不出注册码,只要始终把注册标志标记为已注册,就可以成功破解。
二.完整流程:
1.下载010 Editor
从官网下载010 Editor
2.固定PE基址
我们在windows逆向时,经常会遇到PE文件的基地址随机的情况,不利于反汇编的对比分析,比如利用OD反汇编时的地址和IDA反汇编时就会有不同,两者在对比分析过程中就很难对应上。
这时我们利用反汇编查壳神器study PE++ x64来固定基址
把exe拖入studype,点击固定PE基址,再点击文件保存更改。
3.拖入x64dbg分析
1>找程序入口:
按F9运行程序直到出现程序入口(Entrypoint),能看到一堆jmp指令。
2>找Evaluation Version\n:
接下来找突破口:
!!!重点:由于一打开010editor界面会出现Evaluation!
在程序入口按Shift + D,在当前模块进行字符搜索,输入Evaluation。
发现四个带有换行的Evaluation Version,这四个便是我们要找的(已设置断点(f2设置断点)的四个)。
运行一下发现听到断点处,说明这段子程序就是在程序启动时用于检查注册状态的。
3>找注册标志:
选一个点进去发现他们都在同一个函数的下面。
向上翻找这个函数的头部。
点击这个子程序函数的第一条指令查看流程图。
1 | cmp edi,DB |
通过分析流程图可知,子程序流程在这里分成两个方向:EAX = 0xDB,表示各种已注册的状态,EAX <> 0xDB,表示各种未注册状态。由此可知,EAX = 0xDB是成功注册标志。
找到注册标志后,改程序流向是无效的,必须找到设置注册标志的公共CALL,在CALL里边改程序流向,才能真正实现破解。
在这个程序中,判断注册标志指令是cmp edi, 0xDB,它上面的CALL是一个模块外的系统子程序调用,再往上没有CALL了,怎么办?这说明这个标志已经提前由真正的CALL算好了,下面的关键是怎么找到这个真正的CALL
cmp指令的使用和理解:
cmp指令是汇编语言中用于比较两个操作数的大小的指令。它执行的是一个隐含的减法操作,即从目的操作数中减去源操作数,但不会改变任何操作数的值。CMP指令的结果会影响处理器的标志位,这些标志位随后可以用于条件跳转指令。
两个无符号数的比较:
CMP结果 | ZF | CF |
---|---|---|
目的操作数 < 源操作数 | 0 | 1 |
目的操作数 > 源操作数 | 0 | 0 |
目的操作数 = 源操作数 | 1 | 0 |
两个有符号数的比较:
CMP结果 | 标志位 |
---|---|
目的操作数 < 源操作数 | SF ≠ OF |
目的操作数 > 源操作数 | SF = OF |
目的操作数 = 源操作数 | ZF = 1 |
jnz指令:
JNZ 指令,全称为 Jump if Not Zero,是汇编语言中的条件转移指令。这条指令的作用是在结果不为零(或不相等)的情况下进行跳转。
jz指令
与之相对的是 JZ 指令,它在结果为零时触发跳转。在实际编程中,JNZ 通常与比较指令 CMP 或测试指令 TEST 结合使用,以根据比较或测试的结果决定程序的执行流程。
4>找真正的call
接下来脱离流程图。
找到并选中代表注册标志的指令:cmp edi,D8
复制他的二进制指令码,并在当前模块进行匹配特征搜索,查找所有的注册标志指令。
结果只有一个
之后上网搜索发现使用了别的寄存器:
cmp eax,DB // 3D DB 00 00 00
重新搜索匹配特征
得到七个结果。
挨个点击去查看
发现四个代码中都出现了ca11 010editor.140007630
,所以是这个call影响了寄存器eax的值,是真正的call!
持续跟进这个call的代码段
5>修改注册标志
由图可知这个子程序出口有很多,只要把eax的值修改为0xD8即可注册成功。
1 | 74 10 je 010editor.140392A95 |
修改为
1 | 74 00 je 010editor.140392A85 |
修改前
右键,点二进制,点编辑(Ctrl + E),先修改je跳转,防止他乱赋值。
修改后为
Ctrl + P或者右键,补丁,修补文件。
发现无法修补文件
用IDA进行逆向,再修改Assembly(安装keypatch插件)
发现encode值为···,点击Patch后无法修改。
这种情况只能通过kstool工具(支持很多架构)(git上),手动去翻译汇编指令称机器码然后手动填写可以完成patch
->>kstool arm64 “需要翻译的汇编指令” [指令所在的地址]
->>得到机器码
由于之前我们在x64dbg修改过,得到了指令对应的机器码。
6>保存修改的补丁
右键机器码,点Patching,点Change byte…直接更改
右键Edit,Program,Apply Patches to…来保存
7>成功逆向