新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个是最常用的界面,其它的我基本上没用到~