前几天做misc的时候发现010Editor试用期结束了,这回无论怎么卸载再安装也没法使用了,也找不到注册码,于是我想着逆向分析一下这个程序看能不能把他给破解了,多次尝试无果,于是上网查找相关资料,最后真的成功破解了!

接下来记录一下这次破解过程:

一.明确思路:

破解010 Editor需要注册码,如果找不出注册码,只要始终把注册标志标记为已注册,就可以成功破解。

010editor

二.完整流程:

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
2
cmp   edi,DB
jne 010editor.140392FC0 // 结果不为零(或不相等)的情况下进行跳转

通过分析流程图可知,子程序流程在这里分成两个方向: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

重新搜索匹配特征

3D DB 00 00 00

得到七个结果。

结果

挨个点击去查看

发现四个代码中都出现了ca11 010editor.140007630,所以是这个call影响了寄存器eax的值,是真正的call

持续跟进这个call的代码段

跟进

再跟进

最终子程序的代码段

5>修改注册标志

由图可知这个子程序出口有很多,只要把eax的值修改为0xD8即可注册成功。

1
2
74 10          je 010editor.140392A95  
B8 13010000 mov eax,113

修改为

1
2
74 00          je 010editor.140392A85  
B8 DB000000 eax,DB

修改前

修改前

右键,点二进制,点编辑(Ctrl + E),先修改je跳转,防止他乱赋值。

二进制,编辑

修改后为

修改后

Ctrl + P或者右键,补丁,修补文件。

发现无法修补文件

用IDA进行逆向,再修改Assembly(安装keypatch插件)

发现encode值为···,点击Patch后无法修改。

这种情况只能通过kstool工具(支持很多架构)(git上),手动去翻译汇编指令称机器码然后手动填写可以完成patch

->>kstool arm64 “需要翻译的汇编指令” [指令所在的地址]
->>得到机器码

由于之前我们在x64dbg修改过,得到了指令对应的机器码。

6>保存修改的补丁

右键机器码,点Patching,点Change byte…直接更改

change byte

修改前

修改后

修改后

右键Edit,Program,Apply Patches to…来保存

7>成功逆向

成功打开