1. 找到注册的窗口
2. 测试注册窗口的反应
3. 根据反应做出下一步分析的打算
猜测API,API下断动态调试
挑出敏感字符串,在程序中搜索
4. 动态分析,定位关键跳转,修改代码
5. 动态分析,定位关键call,修改代码
先试试暴力破解
先安装一个正版的010 Editor
30天的有效期
两种方法破解010Editor--编写注册机--爆破
输入序列号的地方,随便输点什么进去
两种方法破解010Editor--编写注册机--爆破
看一下基本的验证方式,有个弹框
两种方法破解010Editor--编写注册机--爆破
查看一下弹出的提示框使用的API 是什么
右键查看一下主模块
两种方法破解010Editor--编写注册机--爆破
可以看到有很多对QT5的调用
两种方法破解010Editor--编写注册机--爆破
调用很多,查找不是很方便,所以需要用IDA看一下,文件不小,IDA分析时间需要久一点
查看一下导入表,发现没有CreateWindow类的函数调用
两种方法破解010Editor--编写注册机--爆破
不管什么样的界面库,想要弹出那个窗口,都是要调用API的。
找到和窗口有关的动态库模块二,user32的
还得回到OD 中去找。
就是这个模块儿。
双击进去
这个模块儿里面,都是窗口API函数。
两种方法破解010Editor--编写注册机--爆破
如果不知道在哪下断点,就在这四类里面全部下断点了。
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
挨个尝试还是比较麻烦的。
底层调用的应该是CreateWindow
两种方法破解010Editor--编写注册机--爆破
Ctrl+G 搜索一下,下断点。
两种方法破解010Editor--编写注册机--爆破
Chack一下,断下来了
两种方法破解010Editor--编写注册机--爆破
栈回溯分析一下
可以看到调用时从这里开始的
两种方法破解010Editor--编写注册机--爆破
挨个进去扫一眼,看看哪个里面有没有敏感字符串
两种方法破解010Editor--编写注册机--爆破
看到这里,发现里面有敏感字符串
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
分析一下代码
两种方法破解010Editor--编写注册机--爆破
接着向上看
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
测试了一下,这里是可以断下来的,可以判断这里是一个关键跳转。
接着挨个看一下这两个跳转
两种方法破解010Editor--编写注册机--爆破
发现这两个跳转是在一起的
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
测试了一下,可以断下来
两种方法破解010Editor--编写注册机--爆破
跟着流程走一下,最终发现判断的是第一个标记中eax的值,上面的call应该就是一个关键函数(这是一个C++程序,是一个vs2013版本的程序)
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
关键字符串
两种方法破解010Editor--编写注册机--爆破
向上找关键跳转
两种方法破解010Editor--编写注册机--爆破
继续向上分析
总体分析截图
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
F7进去,F8运行一下
看到了三个关键的JE跳转
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
将关键跳转置空
两种方法破解010Editor--编写注册机--爆破
这里弄失败了,尝试下一个方法
既然你要求DB 是正确的,那么直接给你DB
两种方法破解010Editor--编写注册机--爆破
爆破成功了
对了,在这之前还做了一个操作,关闭随机基址,这里忘记截图了
两种方法破解010Editor--编写注册机--爆破
爆破到此为止了。
爆破思路总结:
1. 找到注册窗口
2. 测试注册窗口的反应
3. 根据反应做出下一步分析打算
猜测API,API下断动态调试
挑出敏感字符串,在程序中搜索
4. 动态分析,定位关键跳转,修改代码
5. 动态分子,定位关键call,修改代码
最简单的方式,弹出提示窗口后,搜索提示的字符串,可以很快找到关键代码。
010算法分析
关键函数
一步一步分析
边测试边写C语言
测试
重新找到关键函数
两种方法破解010Editor--编写注册机--爆破
观察一下参数
两种方法破解010Editor--编写注册机--爆破
C++程序 ecx传参,这应该是一个This指针
根据提示是一个字符串数组
两种方法破解010Editor--编写注册机--爆破
数据窗口跟随05E3A728
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
继续数据窗口跟随
两种方法破解010Editor--编写注册机--爆破
密码的位置也找到了
两种方法破解010Editor--编写注册机--爆破
Esc返回继续数据窗口跟随
两种方法破解010Editor--编写注册机--爆破
不截图了,这个里面就没有什么有用的东西了
***********************************************************
两种方法破解010Editor--编写注册机--爆破
如果访问到了用户名和密码再详细分析
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
上面就应该是判断用户名是否为空
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
继续走
两种方法破解010Editor--编写注册机--爆破
点M看一下 属于全局变量,不清楚是什么东西,先不看这里了
看一下输入的密码
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
跟踪,找到用户名密码的访问代码
一步一步分析,加注释
反复推敲,找出规律
写代码验证
两种方法破解010Editor--编写注册机--爆破
从下面的跳转开始看
跟着跳转走一下
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
到现在,第三个字节是确定是
写代码测试一下
int main()
{
srand(time(NULL));
byte k[10] = { 0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA };
while (true)
{
byte k0 = rand()%0xFF;
byte k6 = rand() % 0xFF;
byte al = (k0 ^ k6 ^ 0x18 + 0x3D) ^ 0xA7;
if (al > 0)
{
k[0] = k0;
k[6] = k6;
break;
}
while (true)
{
byte k1 = rand() % 0xFF;
byte k7 = rand() % 0xFF;
byte k2 = rand() % 0xFF;
byte k5 = rand() % 0xFF;
DWORD ESI = (0x100 * (k1 ^ k7 & 0xFF) + k2 ^ k5 & 0xFF) & 0xFF;
DWORD EAX = (((ESI ^ 0x7892) + 0x4d30) ^ 0x3421) & 0xffff;
if (EAX % 0XB == 0 && EAX / 0XB <= 0X3E8)
{
k[1] = k1;
k[7] = k7;
k[2] = k2;
k[5] = k5;
break;
}
}
}
printf("%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X\n", k[0], k[1], k[2], k[3], k[4], k[5], k[6], k[7], k[8], k[9]);
system("pause");
return 0;
}
4122-3344-5566-7288-99AA
输入程序测试一下
前面分析的没有问题
下面分许用户名用到的代码
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
用户名经过加密
两种方法破解010Editor--编写注册机--爆破
偷个懒,吧程序附加到IDA
两种方法破解010Editor--编写注册机--爆破
OD中进入函数
两种方法破解010Editor--编写注册机--爆破
两种方法破解010Editor--编写注册机--爆破
F5进来看一下
两种方法破解010Editor--编写注册机--爆破
看着还是比较轻松的
双击这个数组,从IDA中把数组的地址复制下来去OD中找一下,复制出来。
两种方法破解010Editor--编写注册机--爆破
OD中找一下数组基址
两种方法破解010Editor--编写注册机--爆破
名字改一下,然后吧函数复制出来。
两种方法破解010Editor--编写注册机--爆破
参数名和函数名改一下
两种方法破解010Editor--编写注册机--爆破
关键代码
while (true)
{
BYTE k0 = rand() % 0xFF;
BYTE k6 = K[6];
BYTE al = (k0 ^ k6 ^ 0x18 + 0x3D) ^ 0xA7;
if (al >= 9)
{
K[0] = k0;
K[6] = k6;
break;
}
}
while (true)
{
BYTE k1 = rand() % 0xFF;
BYTE k7 = K[7];
BYTE k2 = rand() % 0xFF;
BYTE k5 = K[5];
DWORD ESI = (0x100 * (k1 ^ k7 & 0xFF) + k2 ^ k5 & 0xFF) & 0xFFFF;
DWORD EAX = (((ESI ^ 0x7892) + 0x4d30) ^ 0x3421) & 0xFFFF;
if (EAX % 0XB == 0 && EAX / 0XB == nRet)
{
K[1] = k1;
K[7] = k7;
K[2] = k2;
K[5] = k5;
break;
}
去除网络验证(上面爆破中,有关键函数,自己进去找一下)
两种方法破解010Editor--编写注册机--爆破
算法总结
1. 判断用户名密码是否为空
2. 将密码字符串转为16进制字节数据
3. 验证密码16进制
4. K[3] = 0X9C 或者 0XFC或者0XAC
5. SUB_00407644函数的返回值不能为0
6. SUB_004083C8函数的返回值不能为0且小于等于03e8
7. 将用户名转为ascii字符串
注册机总结
1. 通过随机字节穷举符合条件的值
2. 指定用户名,调用加密函数求出KEY
3. 将KEY拆分,指定到密码字节数组
4. 穷举剩下的字节