新手破解练习Crackme160之122 - nlabl

OD载入程序, 搜索关键词可以成功定位到按钮入口地址0042DAD4, 下好断点就可以单步分析算法了

1). 将用户名2~6位的ascii10进制值连起来
2). 将结果前3位取出转16进制  eax
3). eax = (eax * 2 + 0x10) * 2
4). eax *= 9
5). eax ^= 5
6). ecx = 0x32d4d7a6 << 2 = 0xCB535E98
7). ecx = 转高位变负数=0xFFFFFFFFCB535E98 / 3 = 0xEE711F88
8). ecx = 0xEE711F88 ^ 3 = 0xEE711F8B + 0x40 = 0xEE711FCB
9). eax = (eax * 6) >> 1 如果小于0则+1, 再 + 0xD (0042D941~0042D953)
10). eax *= 0x36
11). eax = (eax + eax << 5 ) ^ 0x10
12). ecx *= 6,  ecx /= 5,  ecx ^= 0x25,  ecx += 0x27
13). eax = eax * 2 + 0xD,  eax *= 6 * 0x59,  eax ^= 0x9 (0042D994 ~ 0042D9BA)
14). ecx *= 5,  ecx = (ecx ^ 0x22) + 0x3 = 0x96A6BEF2
15). eax = eax >> 1 如果小于0则+1, 再 + 0x10 (0042)
16). eax *= 3,  eax ^= 0x6
17). ecx ^= 0x2B,  ecx /= 3,  ecx ^= 3,  ecx += 0x22 = 0x1A00B103
18). eax = eax >> 1 如果小0则+1, 再 +1
19). ecx *= 3,  ecx += 3,  ecx = ecx >> 2
20). eax *= 6,  eax = eax << 3,  eax ^= 6
21). ecx ^= 0x22,  ecx += 4,  ecx *= 3
22). eax ^= 2,  ecx <<=2,  ecx += 4,  eax *= 6
23). eax += ecx (ecx就是一个常量, 运算一堆后等于0xEA063AB4)
23). eax转10进制与系列号对比

算法分析完成, 注册机代码如下: keygen.c

#include <stdio.h>
#include <string.h>

int main() {
	char name[21] = {0};
	char n26[21] = {0};
	char tmpstr[5] = {0};
	unsigned int eax = 0, ecx = 0xEA063AB4;
	printf("用户名: ");
	scanf("%s", name);
	int len = strlen(name);
	if(len < 6){
		printf("用户名需要6位以上");
		return 0; 
	}
	int n26i = 0;
	for(int i=1; i<6; i++){ //1~5的asc值(10进制)连成字符串 
		sprintf(tmpstr, "%d\0", name[i]);
		len = strlen(tmpstr);
		for(int j=0; j<len; j++){
			n26[n26i] = tmpstr[j];
			n26i += 1;
		}
	}
	eax = (n26[0] - 0x30) * 100 + (n26[1] - 0x30) * 10 + (n26[2] - 0x30); //取前三位转10进制 
	eax = ((((eax * 2 + 0x10) * 2 * 9) ^ 5) * 6) >> 1;
	if(eax < 0) eax += 1;
	eax += 0xD;
	eax *= 0x36;
	eax = (eax + (eax << 5)) ^ 0x10;
	eax = (((eax * 2 + 0xD) * 6 * 0x59) ^ 9);
	int eax1 = eax;
	eax1 = eax1 >> 1; 
	eax = eax1;
	if(eax1 < 0) eax += 1;
	eax = ((eax + 0x10) * 3) ^ 6; 
	eax1 = eax;
	eax1 = eax1 >> 1;
	eax = eax1;
	if(eax < 0) eax +=1;
	eax += 1;
	eax = ((((eax * 6) << 3) ^ 6) ^ 2) * 6; 
	
	eax += ecx;
	
	printf("注册码: %d\n", eax);
	getchar();getchar();
	return 0;
}

用户名只能输入字母, 数字无法输入, 因为只取1~5位的值串前三位, 所以, 基本上就是只跟用户名的第2, 3位有关, 其它位随便输不影响最终注册码, 例:
用户名: ?bc??? (?可任意字母, b=98, c=99 =>989)
注册码: 1445755916
用户名: ?d???? (?可任意字母, d=100 => 100)
注册码: -14198964

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

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

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

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

posted @ 2024-07-28 11:23  hankerstudio  阅读(10)  评论(0)    收藏  举报