新CrackMe160之003 - Cruehead-CrackMe-3

与旧版034一样

直接运行程序, 什么都没有, OD载入代码区域中看到了CreateFileA 和 CRACKME3.KEY, ReadFile等关键词~
没跑了, 就是要验证密钥文件的~ 程序目录下先创建好CRACKME3.KEY, 随便写入点什么
OD单步调试运行(F8),
00401066处验证文件内容长度是否18位,
00401074是关键算法, F7进入方法, 分析算法为: sum += file[i] ^ (0x41+i); 循环14次, 中间如果有\0则退出循环
00401079处 sum ^= 0x12345678;
0040108B处 将文件内容后4位倒序与sum值对比

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

int main() {
	char con[20] = {0};
	printf("系列号前14位: ");
  fgets(user, sizeof(user), stdin);
  int i, len = strlen(user) - 1; //最后一个\n
	if(len != 14){
		printf("用名14位~ ");
		return 0; 
	}
	int sum = 0;
	for(i=0x41; i<0x4F; i++){
		sum += con[i-0x41] ^ i;
	}
	sum = sum ^ 0x12345678;
	con[14] = sum & 0xFF; sum = sum >> 8;
	con[15] = sum & 0xFF; sum = sum >> 8;
	con[16] = sum & 0xFF; sum = sum >> 8;
	con[17] = sum & 0xFF;
	printf("系列号为: %s\n", con);
	system("pause");
	return 0;
}

运行示例:
系列号前14位: 12345678912345
系列号为: 12345678912345/P4 (后4位16进制为: 2F 50 34 12)

保存到文件, 重新打开程序, 提示成功注册给用"ppppppppp{y y{", 这个用户名哪来的呢? 有单步仔细调试程序的同学就可以发现是00401074这个算法方法里面生成的, 每一位异或出来的, 那我们可以反过来异或, 先得到用户名, 再算出注册码:

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

int main() {
	char user[15] = {20}; user[14] = 0; 
	char code[19] = {0};
	int i, len;
	printf("用户名: ");
	fgets(user, sizeof(user), stdin);
	len = strlen(user) - 1;
	if(len > 14){
		printf("用户名14位以内~");
		return 0; 
	}
	int sum = 0;
	for(i=0; i<14; i++){
		sum += user[i];
	}
	for(i=0x41; i<0x4F; i++){
		code[i-0x41] = user[i-0x41] ^ i;
	}
	sum = sum ^ 0x12345678;
	code[14] = sum & 0xFF; sum = sum >> 8;
	code[15] = sum & 0xFF; sum = sum >> 8;
	code[16] = sum & 0xFF; sum = sum >> 8;
	code[17] = sum & 0xFF;
	printf("系列号为: %s\n", code);
	getchar();
	return 0;
}

运行示例:
用户名: Cruehead
系列号为: 06!-#&,IJKLMNYU4
(直接复制到CRACKME3.KEY文件保存即可)

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

 
 
 

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

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

posted @ 2024-12-09 09:02  hankerstudio  阅读(46)  评论(0)    收藏  举报