新手破解练习Crackme160之023 - Chafe.1
-
暴力破解, 程序运行完直接输入数据就卡死了, 没办法玩, 直接上OD搜索关键字位置004012B8, 上面004012B6关键跳改为jmp, 试着输入也不行, 还是卡死, 继续向前走看能不能断点停下, 004012A6处又一跳, 下断点, 程序马上停下了, 说明这里是有个timer在运行, 直接改为jmp, 果然跑到成功分支了, 暴破成功~ 保存!
-
正常破解, 这个程序直接是汇编写的, 而且window10下无法输入, 就没办法正常破解了, 可能是电脑系统兼容问题, 于是拿到xp下试了一下, 是可以输入的~, 那接下来就在xp下破解了~
由于是timer事件, 所以我们先输入用户名:abc, 系列号: 123, 然后再在timer事件入口00401239处下断点, 程序马上就停下来了, 我们单步执行, 分析算法:
1). 00401294处有个函数(先不管是什么)
2). 比较[0x403166]与[0x403167], 相等则结束
3). 如果不相等, 再与 0x10比较, 如果相等就成功
上面看不出什么东东, 我们只能进入1).继续分析: 用户名不足20位的用空补齐
1). 单步执行到00401361, edi = user
2). 接着循环:
[0x403188] = code
for(i=0; i<0x10;i++){ //i=0x403168, 循环0x10次
[0x403188] += 1;
[0x403188] ^= user[i]; //xor
}3). 循环完[0x403166] += 4, 然后就结束函数返回到前面的第2).步比较了,
这里肯定是到失败分支去了,成功分支的关键是0x403166这个得是0x10,所以我们还得找找这个值是哪里赋值的, 右键->查找->所有常量, 16进制处, 输入403166, 发现有4个add 0x4, 都加起来刚好就是0x10=16, 所以应该就是这4个地方都必须要执行, 所以每个都下断点(结果中4个add对应行上F2)跟进去查看,
00401093 add byte ptr ds:[0x403166],0x4 //1.如果用户名不为空则+4
004010A3 mov byte ptr ds:[0x403166],ah
00401299 movsx eax,byte ptr ds:[0x403166]
00401398 add byte ptr ds:[0x403166],0x4 //2.用户名算法做完+4
00401465 movsx eax,byte ptr ds:[0x403166]
0040148D cmp dword ptr ss:[ebp-0x4],0x0
00401493 add byte ptr ds:[0x403166],0x4 //3.如果系列号不为0则+4 (系列号得是纯数字)
004014AA add byte ptr ds:[0x403166],0x4 //4.[0x403188] == -0x9112478 = 0xF6EEDB88, 则+4
004014B3 mov byte ptr ds:[0x403166],0x0
从上面4个add的分析可以知道用户名循环计算出的结果应该要等于0xF6EEDB88, 才会进入到成功分支, 到此整个算法分析完成, 下面来写注册机, keygen.c
#include <stdio.h>
int main() {
char user[21] = {0};
int len=0;
printf("请输入用户名: ");
scanf("%s", user);
//开始计算注册码
unsigned long rlt = 0xF6EEDB88;
for(int i=0x10-1; i>=0; i--){ //反过来算
rlt ^= *((unsigned long *) &user[i]); //第几位后面所有的字符转数字
rlt -= 1;
}
printf("正确注册码为: %lu\n\n", rlt);
getchar();getchar();
return 0;
}
运行示例:
请输入用户名: abc
正确注册码为: 4136491540
相关软件与破解示例程序可到前十个练习处下载
下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~


浙公网安备 33010602011771号