新CrackMe160之156 - Olivers - crackme

delphi写的程序,使用IDR查看源码可知按钮入口为00430C58, 下好断点,开始分析算法
00430CF1 ~ 00430D20 将用户名倒序得user1
00430D29 ~ 00430D69 将用户user与倒序用户名user1前5位分别取出来连起来得str1
00430D7A ~ 00430DD2 将str1第2位到倒数第2位的每一位重复一下连起来得到str2
00430DE3 ~ 00430E09 将str2最后一位前所有位字符转数字再转字符连起来得str3
00430E1D ~ 00430E3D 从str3中间隔3位取一位连起来(共取15位)得str4
00430E46 ~ 00430EAB str4与str3的第4位开始每位相减的绝对值连起来得到正确系列号rlt
00430EB3 rlt与输入系列号对比
注册机:

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

int main() {
	int i, lenu, len, lens; 
	char user[30] = {0};
	char user1[30] = {0};
	char str1[26] = {0}; //不会超过25位 5个字符+5个数字(每个不超过3位数) <= 5+5*3 <= 25
	char str2[51] = {0}; //重复后不会超过50位
	char str3[51] = {0}; //只需要前45位
	char str4[16] = {0}; 
	char rlt[16] = {0};
	printf("用户名: "); scanf("%s", user); getchar();
	lenu = strlen(user);
	if(lenu < 6) {
		printf("用户名6位以上");
		getchar();return; 
	}
	for(i=0; i<lenu; i++){ //倒序
		user1[i] = user[lenu-1-i];
	}
	len = 0;
	for(i=0; i<5; i++){	//分别取5位连起来
		sprintf(str1+len, "%c%d", user[i], user1[i]);
		len = strlen(str1);
	}
	lens = 0;
	for(i=1; i<len-1; i++){ //重复每一位
		sprintf(str2+lens, "%c%c", str1[i], str1[i]); 
		lens += 2;
	}
	len = 0;
	for(i=0; i<lens-1; i++){ //转数字
		sprintf(str3+len, "%d", str2[i]);
		len = strlen(str3);
		if(len >= 45) break; //后面的用不上了
	}
	for(i=0; i<15; i++){
		str4[i] = str3[(i+1) * 3 - 1]; //间隔3取15位 
		len = str4[i] - str3[lenu-2+i]; //两串相减
		if(len < 0) len *= -1;
		rlt[i] = len + 0x30;
	}
	
	printf("系列号: %s\n", rlt);
	getchar();
	return 0;
}

运行示例:
用户名: ocrackme
系列号: 000050514830011

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

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

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

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