新手破解练习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
1~160每个破解过程,在吾爱破解论坛都有高手破解过了,也有整理好现成的, 我这边主要就是自己动手操作的过程,与他们的不太一样
附上高手们的连接: 点击前往查看
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载
新人入门教程"玩玩破解,写给新人看" 点击前往查看
我就是从这里开始的,对我这样的小白感觉超级友好~
下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~


浙公网安备 33010602011771号