新CrackMe160之087 - d4ph1 - crackme2

OD载入程序,搜索界面看到成功关键词"Wow!You did it!..." 定位到00401367, 往上就是算法了,定位算法开始004011B0,
1). 004011DB ~ 00401215 将用户名(5~32位)转16进制,如abc=>616263
2). 0040122E ~ 0040128C 将16进制转字符再转16进制中间再插入01,如:616263=>363136323633=>0136 0131 0136 0132 0136 0133(tmp)
3). 004012B8 ~ 004012F3 关键算法,得到真正系列号(16进制)
4). 00401305 ~ 0040133A 将系列号(16进制)转字符串
5). 00401342 与输入系列号对比
注册机如下:

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

int toHexStr(char *str, char *output); 
int insert01(char *str, char *output);
int getValByStr(char *str, int i);

int main() {
	char user[33] = {0};
	char c1[65] = {0}; //abc=>616263 -- 2倍 
	char c2[129] = {0}; //616263=>363136323633 -- 4倍 
	char c3[257] = {0}; //363136323633=>013601310136013201360133 -- 8倍 (其中01为后面数字相同数的个数)
	printf("用户名: ");
	fgets(user, sizeof(user), stdin);
	int i, len = strlen(user) - 1, size;
	if((len < 5) || (len > 32)) { printf("用户名5~32位"); return 0;} 
	user[len] = 0;
	size = toHexStr(user, c1);
	printf("c1[%d]: %s\n", size, c1);
	size = toHexStr(c1, c2);
	printf("c2[%d]: %s\n", size, c2);
	size = insert01(c2, c3);
	printf("c3[%d]: %s\n", size*2, c3);
	int eax, ebx;
	printf("注册码: ");
	for(i=0; i<len; i++){
		eax = user[i];
		ebx = getValByStr(c3, i);
		eax = eax + ebx;
		eax = eax - (i+1);
		eax = (eax / (i+1)) + (eax % (i+1)) - size;
		ebx = ebx + (i+1);
		printf("%02X", (eax ^ ebx) & 0xFF); //得到注册码
	}
	getchar();
	return 0;
}

int toHexStr(char *str, char *output){
	int i,j;
	for(i=0,j=0; i<strlen(str); i++,j+=2){
		sprintf(&output[j], "%02X", str[i]);
	}
	output[j] = 0;
	return j;
}

int insert01(char *str, char *output){ //这里不考虑有叠数的情况,所以直接插入01
	int i,j;
	for(i=0,j=0; i<strlen(str); i+=2,j+=4){
		sprintf(&output[j], "01%c%c", str[i],str[i+1]);
	}
	output[j] = 0;
	return i;
}

int getValByStr(char *str, int i){
	i = i * 2;
	int rlt;
	char tmp[3] = {0};
	char *endstr;
	tmp[0] = str[i+2];
	tmp[1] = str[i+3];
	tmp[2] = 0;
	rlt = strtol(tmp, &endstr, 16);
	rlt = rlt << 8;
	tmp[0] = str[i+0];
	tmp[1] = str[i+1];
	tmp[2] = 0;
	rlt += strtol(tmp, &endstr, 16);
	//printf("\n%04X=>",rlt);
	return rlt;
}

运行示例:
用户名: abcde (用户名不要出现3,D,f这几个数的叠数就行,‘3’转16是33出现叠数情况)
c1[10]: 6162636465
c2[20]: 36313632363336343635
c3[40]: 0136013101360132013601330136013401360135
注册码: 4F8F6764CB

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

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

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

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