新CrackMe160之145 - CrackMe_5%20%20by%20thechaos
PEiD查看可知这个程序有壳,所以第一步先去壳, ESP定律不明确,不好直接下断去壳,只能单步向下来到第一个循环00401544处,F4跳过到00401551,看到下面还有一个loop,继续F4跳过到0040157D处,这时下面的代码由乱码变成明码了,说明已经到真正的程序段了
ollydump方式2导出程序,到此脱壳完成, 测试运行导出程序,正常运行
第二步,去NAG, 运行程序老要弹出提示框还是挺麻烦的,就直接去了吧,OD重新载入脱壳后程序,直接F9运行程序,弹出提示框,点暂停键后,堆栈界面看到MessageBoxA在004012C9处调用,不让它执行就可以了,就是把004012C2~004012C9这几行都nop掉,另存完成
第三步,正确破解, 重新载入去NAG后程序, 搜索界面定位到成功关键词在00401697处,向上看到关键算法函数004016D0, IDA查看源码:
int __stdcall sub_4016D0(int a1) 转数字
{
int v1; // ecx@1
signed int v2; // edx@1
int v3; // eax@1
int v4; // esi@1
v1 = 0;
v2 = 0;
v3 = *(_BYTE *)a1;
v4 = a1 + 1;
if ( (_BYTE)v3 == 2 )
{
LOBYTE(v3) = *(_BYTE *)v4;
v2 = -1;
v4 = a1 + 2;
}
while ( (_BYTE)v3 )
{
LOBYTE(v3) = v3 - 48;
v1 = v3 + 10 * v1;
LOBYTE(v3) = *(_BYTE *)v4++;
}
return v2 ^ (v1 + v2);
}
三段注册码,分别执行这个方法后得到的数累加: sum = (num1+num2+num3) | 0xE0 = 0xFEE;
0xE0 = 11100000
0xFEE = 111111101110
所以二进制中678位为01都可以(可产生8个不同结果),其它位不可变,不然结果不能为0xFF,
下面是注册机:
#include <stdio.h>
int main() {
int i,v,n,n1,n2,n3,rlt=0xF0E;
for(i=0; i<8; i++){
v = i << 5;
n = rlt | v;
n1 = n / 3; //这里用平均法,也可以随机法
n2 = n / 3;
n3 = n / 3 + n % 3;
printf("系列号: %04d-%04d-%04d\n", n1, n2, n3);
}
getchar(); return 0;
}
运行结果:
系列号: 1284-1284-1286
系列号: 1295-1295-1296
系列号: 1306-1306-1306
系列号: 1316-1316-1318
系列号: 1327-1327-1328
系列号: 1338-1338-1338
系列号: 1348-1348-1350
系列号: 1359-1359-1360
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载
下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~


浙公网安备 33010602011771号