新手破解练习Crackme160之051 - DueList.6

about 中说, 这是一个很难的破解程序, 一般的初学者或中级玩家都不能破解, 让我们就算破解不出也不要伤心难过_, 作者还挺有意思的, 开干吧, 看能不能破~

  1. 暴力破解, OD加载搜索关键字定位到00401217, 0040123B, 00401253成功与失败的三处提示, 向上找到关键入口004011ED, 00401201处第一个关键跳, 改为jmp 00401234, 保存, 搞定~

  2. 正常破解, 我们输入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;
}

这是160个软件part1
这是160个软件part2

1~160每个破解过程,在吾爱破解论坛都有高手破解过了,也有整理好现成的, 我这边主要就是自己动手操作的过程,与他们的不太一样
附上高手们的连接: 点击前往查看
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载

新人入门教程"玩玩破解,写给新人看" 点击前往查看
我就是从这里开始的,对我这样的小白感觉超级友好~

下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~
OD界面布局

posted @ 2024-05-11 17:40  hankerstudio  阅读(10)  评论(0)    收藏  举报