新CrackMe160之094 - TheBigMan - crackme6

OD载入程序,搜索界面可定位到一固定串在算法中间位置,0040138A,可在此处下断,
004013CB处可知系列号第一位为:
0x11CF % code[0] == 0x17 => code[0] * n = 0x11CF - 0x17 = 4536 = 22233337
32 ~ 126都是可见字符,所以code[0] = 36($) | 42(
) | 54(6) | 63(?) | 72(H) | 81(Q) | 84(T) | 126(~)
随便选一个,让程序继续,不然没办法继续调试了,
由00401485可得code[0] = 'T' (0x54)
具体算法为:
0040156A: (0x2300 + 0xCF6C) / 0x6B = 0x2BC - (0x30 - (0x48 / len)) * 5 => len = 3
00401572: (0x190 + 0xCF6C) / 0x6B = 0x2BC - (0x30 - (0x48 / len)) * 5 => len = 9
所以用户名得3~9位
1). 004013DB ~ 004013E9 循环累加用户名得sum
2). 004013F2 ~ 00401478 继续循环用户名运算得rlt
3). 0040149A ~ 004014AD 长度*sum % 0x64 + 0x30 = rlt1
4). 004014C6 将'T'+rlt+'-'+rlt1 = rlt2
5). 004012D0 ~ 004012FB 循环rlt2, code[i] = rlt2[i] ^ 0x20 % 0xA + 0x30
注册机:

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

int main() {
	char user[21] = {0};
	char code[21] = {0};
	char *str = "\0ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	printf("用户名: ");
	fgets(user, sizeof(user), stdin);
	int i, len = strlen(user) - 1, sum = 0;
	if(len < 3 || len > 9) { printf("用户名3~9位"); return 0; }
	user[len] = 0;
	for(i=0; i<len; i++){ sum += user[i]; } //(1)
	int eax,ecx;
	code[0] = 'T';
	for(i=0; i<len; i++){ //(2) 先直接翻译OD源码再合并简化 
		eax = ((sum * i - sum) ^ -1) + (str[(i << 2) - i] ^ user[i]) + 0x14D;
		ecx = len * (i + 3) * user[i];
		eax = (((eax + ecx) % 0xA) + 0x30) ^ 0xADAC;
		code[i+1] = ((eax * (i + 2)) % 0xA) + 0x30;
	}
	code[i+1] = '-';
	sum = ((sum * len) % 0x64) + 0x30; //(3)
	sprintf((char *)&code[i+2], "%d\0", sum); //(4)
	len = strlen(code);
	for(i=1; i<len; i++){ //(5)
		code[i] = ((code[i] ^ 0x20) % 0xA) + 0x30;
	}
	
	printf("注册码: %s", code);
	getchar();
	return 0;
}

运行示例:
用户名: TheBigMan
注册码: T670184406337

 
 
本节高手录制的视频,点击前往查看

 
 
 
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载

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

posted @ 2024-12-30 14:31  hankerstudio  阅读(10)  评论(0)    收藏  举报