文章目录
一、010 Editor 介绍
-
010 Editor是非常好用的16进制编辑器
-
主要功能如下:
a. 16进制修改
b. 文本修改
c. 模板解析各种文件格式
d. 对比文件
二、010 Editor 破解注册码截图
三、010 Editor 暴力破解分析
1.分析思路:
1.找到注册的窗口
2.测试注册窗口的反应
3.根据反应作出下一步分析的打算
(1) 猜测API, API下断动态调试
(2) 挑出敏感字符串,在程序中搜索
4.动态分析,定位关键跳转,修改代码
5.动态分析,定位关键CALL, 修改代码
2.具体操作:
1.右击 CTRL + N ,查找一下相关函数
2.观察这些函数,但是无法去定位,到底使用了什么API,这个时候可以去尝试使用IDA 去分析一下。IDA 分析完,查看导入表,CTRL+F 搜索跟 Windows 有关的函数,发现创建窗口的函数应该是与 QT 有关的,但是很无奈,没学过 QT ,所以此路走不通。
3.此时 继续使用 OD 分析,我们知道,序列号注册失败时会有弹窗,所以我们可以查看一下模块,找到 USER 32模块,找窗口类相关函数(CreateWingdow,DialogBox 等等)。
4.然后挨个去去尝试,下断点,发现 CreateWindowExW 断下,我们可以以此为切入点,来分析。
5.通过栈回溯,挨个进去查看,也可以使用字符串搜索,来找到关键字。
6.找到关键提示信息。
7.找到关键跳转
8.找到关键函数。
9.将关键函数 NOP 掉即可成功。
四、010 Editor 算法分析
1.分析方法:
- 单步跟踪,找到访问用户名密码的代码
- 一步一步分析,加注释
- 反复推敲,找规律
- 写代码验证
- (1) 总结公式
- (2) 穷举密码
2.具体操作:
1.断到关键函数出,看 ECX 的值,多跟几个,可以找到我们输入的用户名和序列号。
2.判断上一个函数返回值,返回值赋给 EDI ,将EDI 与 0XDB 比较,发现此处相等时就可以跳出注册窗口成功提示语。
3.结果如下所示。
4.顺藤摸瓜,继续往上看跳转,发现这两处均可以跳转至 CMP EDI, 0XDB处。
5.发现两处关键点,接下来跟进去,重点分析这两个函数,此处避免混乱,给他们由上到下命名为 A 函数和 B 函数。当这两个函数返回值不等于 E7 和 DB 即可。先分析 A 函数。
6.同样的方法,向上寻找,不过我们的目标是最后的结果不等于 E7,所以向上找不会跳转到将 E7 赋值给 EAX 的操作。最后经过分析发现 MOV ESI,0X2D 有跳转,并且只有将 EAX 赋值为 0X2D 时才是正确的操作。
7.此时分析发现,这里有对用户名字符串进行加密的操作,然后将用户名加密后得到的4字节数据与用户输入的序列号中某位进行比较。只有当这一个跳转条件不满足时才能执行到赋值为 0X2D 处。并且这里有大量的 CMP 比较,只要一个不满足,就跳出,将 EAX 赋值为 0XE7。
8.同时继续分析,我们会发现这里面存了一个全局数组,它应该是 010Editor 中的密码表,循环次数为用户名称字符串的长度,每次循环都会从表中取出4字节数据,进行异或,以及其他有符号乘法、加法等操作,对字符串进行一定操作后得到的4字节数据便是真正的序列号的最后四个字节。
9.接着分析 B 函数。
10.通过分析,我们知道返回的 EAX 的函数很重要,于时我们跟进去看看。
11.进一步分析 B 函数,会发现这个函数和之前分析的是一个相同的函数。至此我们就可以顺着它对用户名字符串加密后得到的4字节数据与用户输入的序列号之间的操作来编写注册机。
12.拖到 IDA 中,输入地址,按 F5 分析,得到该函数。
int _cdecl EncodeUsername(const char *pszUserName, int a2, char a3, char a4)
{
const char *v4;
signed int v5;
signed int v6;
unsigned _int8 v7;
int v8;
int v9;
int v10;
int result;
int v12;
unsigned _int8 v13;
unsigned _int8 v14;
unsigned _int8 v15;
int v16;
v4 = pszUserName;
v16 = 0;
v5 = strlen(pszUserName);
v6 = 0;
if (v5 <= 0)
{
result = 0;
}
else
{
v13 = 0