本帖最后由 rixo 于 2019-9-3 16:12 编辑
damn注册机分析1.初步查看,寻找破解点
1.用OD打开,发现是ASPack 1.08.03 -> Alexey Solodovnikov壳,使用ESP定律脱壳之后,分析程序
这是个汇编写的程序,相当简洁,代码也很少。Ctrl+A之后就就发现OD显示注册了一个对话框窗口。窗口回调的消息处理如下:
我们比较关注WM_COMMAND和WM_INITDIALOG其中发现WM_COMMAND的几个逻辑如下:
WM_INITDIALOG的函数逻辑如下:
发现有两个有价值的函数值得分析,一个是sub_004012F3一个是sub_00401372
记录一下之前分析中得到的几个全局变量
0x 402313 是控制显示是否破解的全局变量 正确值应该为2
0x 40230B 是校验是否破解的变量 正确值应该为0
0x40238D 密码长度全局变量
0x402389 用户名长度全局变量
0x402353 用户名全局变量
0x402331 密码全局变量
sub_004012F3函数分析
这个函数分析完之后就可以写注册机代码了,下面是我的注册机代码
[C] 纯文本查看 复制代码 #include "pch.h"
#include <iostream>
#include <windows.h>
#define RoR(a,n) (a << (0x20 - n) | a >> n)
int main()
{
char Name[20] = "rixo39";
unsigned int serial = 0x44414D4E;
unsigned int sum = 0;
for (int i =0;i<strlen(Name);i++)
{
sum += Name[i];
serial = RoR(serial, 1);
serial = RoR(serial, i);
serial ^= sum;
}
serial |= 0x10101010;
printf("%x",serial);
}
sub_00401372函数分析
第一段异或数据段
第二部分异或代码段
第三部分,两个异或值做运算,求值
可以看到这里这个JE的短跳转十分可疑,我们直接修改后看看出现什么结果
解密前:
解密后:
我们发现这个需要40230B的值,在程序中有2处更改的地方。
而我们需要这个值为0,所以用010寻找对应的地方,然后再把它变成00
同时,我们还需要将0x402313这个变量赋值为2,所以我们来看解密出来的代码,我们发现如果想要使0x402313值为2,需要EDX值为0,所以直接修改前面的那个部分代码
回到之前JE的地方,修改代码为 AND EDX,0X0 刚好实现了JE的跳转。
修改代码后我们实现了UNLOCKED的破解,发现它之前的异或值并没有什么卵用。。。
同样,我们也找到它在文件中的对应位置修改一下OPCODE,就可以一直UNLOCKED啦!
|