新手破解练习Crackme160之051 - DueList.6
about 中说, 这是一个很难的破解程序, 一般的初学者或中级玩家都不能破解, 让我们就算破解不出也不要伤心难过_, 作者还挺有意思的, 开干吧, 看能不能破~
-
暴力破解, OD加载搜索关键字定位到00401217, 0040123B, 00401253成功与失败的三处提示, 向上找到关键入口004011ED, 00401201处第一个关键跳, 改为jmp 00401234, 保存, 搞定~
-
正常破解, 我们输入8位abcdefgh, 跳过了第一个失败区, 来到算法区域0040122A, F7进入方法, 只要返回1就成功了,
1). eax = 64636261(dcba应该是输入串前4位倒序值 ), ecx = 0x2
2). esi = eax / ecx (完全没用上)
3). eax = 0x36455544
4). ecx = 64636261
5). eax = eax <<< 0x6(左循环移6位)
6). ah = ah xor al(eax的高位=eax的高位与低位的异或)
7). al = al - cl (低位相减)
8). ecx--, 重复循环6)~9)
9). eax 与 0x4071885对比, 不相等就返回0失败, 相等就继续, 下面就与上面一样
算法分析完了, 我们现在需要逆向操作, 这个好像有点难, 中间循环的次数非常多, 程序需要执行十几秒, 运行结果: 注册码为: isd4ever
#include <stdio.h>
#include "string.h"
unsigned int getVal(unsigned int num , unsigned char i ) {
__asm__ ( //dev-c++: at&t模式,汇编的参数是反着来的, VC++: intel模式
"sub %%cl, %%al\n\t"
"xor %%al, %%ah\n\t"
"ror $6, %%eax\n\t"
:"=a"(num)
: "a"(num), "c"(i) //eax, ecx
);
return num;
}
int main() {
//前4位
unsigned int eax1 = 0x4071885;
unsigned int rlt1 = 0x36455544;
int ecx1 = 0;
while((ecx1 == 0x0DBD76F6) || (eax1 != rlt1)){ //0x0DBD76F6这个是乱码无法输入, 所以换一个
ecx1++;
eax1 = getVal(eax1, ecx1); //汇编实现方式
}
char *code1 = (char *)&ecx1;
*(code1+4) = 0;
printf("注册码为: %s", code1);
//后4位
unsigned int eax2 = 0x4B00D127;
unsigned int rlt2 = 0x43534952;
int ecx2 = 0;
while(eax2 != rlt2){
ecx2++;
eax2 = getVal(eax2, ecx2); //汇编实现方式
}
char *code2 = (char *)&ecx2;
*(code2+4) = 0;
printf("%s\n按任意键继续~", code2);
getchar();
return 0;
}
1~160每个破解过程,在吾爱破解论坛都有高手破解过了,也有整理好现成的, 我这边主要就是自己动手操作的过程,与他们的不太一样
附上高手们的连接: 点击前往查看
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载
新人入门教程"玩玩破解,写给新人看" 点击前往查看
我就是从这里开始的,对我这样的小白感觉超级友好~
下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~


浙公网安备 33010602011771号