本帖最后由 d8ln3x 于 2018-4-13 11:07 编辑
软件下载:http://pylonos.com/download/omega/oMega_2.3.14.4267.exe
1、安装软件后用Exeinfo和PEID查看相关信息,显示无壳、Delphi 2014写的程序 2、运行程序About窗口显示notregistered!
2、OD加载程序,运行尝试注册,弹出错误提示窗口。通过字符搜索、F12暂停法、对ShowWindow\CreateWindow\CreateWindowExW等API下断,没有找到合适突破口。3、利用OD脚本对delphi事件下断点后,尝试注册,程序被断下来。4、进行调用栈回溯,同时F8单步运行,并注意堆栈以及寄存器面板上数据信息。经过多次调用栈回溯后,在如下位置找到注册信息,猜测已经接近程序注册代码。
5、对注册信息的相应内存位置下硬件访问断点,在kernelbase.dll模块中断下来,查看调用栈,发现是将license字符串进行宽字符转多字节:
6、对转换后的字符串下硬件访问断点,继续运行,程序断下来:
7、F8单步这段程序发现是对注册的name进行一些计算处理,非常可疑,并且有几处循环调用。继续执行程序,从这段程序运行返回上一层后,寄存器面板上发现一些字符串信息,有可能是真license。将该字符串“7a7oueemvh9qvfwhx” copy出来,尝试注册了一下,注册成功。
8、将注册信息删除后,重新注册,继续跟踪注册验证代码。重新来到license生成的代码段,下一个call就是验证license,代码比较短,分析如下:
9、接下来是关键跳转,验证call返回0,则通过PostMessageW函数给注册窗口发送验证通过的消息(MSG=0x499),否则发送验证失败消息(MSG=0x496)。
10、几种爆破方法:
a) 0x007DCCA9处calloMega32.00408C94 ==> 直接返回0
b) 0x007DCCAE处jnz short oMega32.007DCCC6==> nop掉
c) 0x007DCCCA 处将发送验证失败消息0x496==> 改为0x499
d) ......
11、license算法分析:
12、生成注册码的代码实现:[C] 纯文本查看 复制代码 int main(void)
{
WCHAR name[] = L"d8ln3x";
char sz_src[] = "e9k@nG~3jxIo)b0S3";
char sz_license[sizeof(sz_src)] = {0};
DWORD T1[6] = { 0x11, 0x6b, 0x49, 0x0d, 0x0b, 0x03 };
// 11 00 00 00 6B 00 00 00 49 00 00 00 0D 00 00 00 0B 00 00 00 03 00 00 00
UINT name_bytes_len = sizeof(name) - sizeof(WCHAR);//去掉尾部0
UINT src_len = sizeof(sz_src) - sizeof(char);
int data = 0;
for (int i = 0, idx = 0; i < name_bytes_len; i++)
{
if ((i + 1) & 1)
{
data += T1[idx] * (((char *)name)[i]);
}
else {
data -= T1[idx] * (((char *)name)[i]);
}
if (++idx > 5)
{
idx = 0;
}
}
UINT name_len2 = name_bytes_len - 1;
for (int i = 0, idx = 1, j = name_len2; i < src_len; i++)
{
int tmp = 0;
tmp += T1[idx] * sz_src[i];
tmp += T1[idx] * j;
tmp += T1[idx] * (((char *)name)[name_len2 - j] + ((char *)name)[j]);
char lic_byte;
UINT mdata = (data + tmp) % 0x24;
if (mdata >= 0x1A)
{
lic_byte = mdata + 0x16;
}
else {
lic_byte = mdata + 0x61;
}
sz_license[i] = lic_byte;
if (++idx > 5) {
idx = 0;
}
if (--j < 0)
{
j = name_len2;
}
}
printf("\"%ws\" license key is: %s\n", name, sz_license);
}
运行结果:
|