Crackme034 的逆向分析
1.程序观察
因为这个程序使用的是 Keyfile 的保护方式,所以并没有什么输入序列号的地方。
2.简单查壳
程序使用汇编语言编写的。
3.程序分析
使用 OD 载入程序,在代码入口的就可以看到 CreateFileA、ReadFile 这两个函数
首先使用 CreateFileA 函数打开文件,从参数中可以看到文件名叫做 CRACKME3.key
如果打开失败,就会调用一个函数,然后跳转走。
如果打开成功,程序会读取此文件,读取 18 字节的数据到内存 402008 处
如果读取的数据不够 18 字节,也会跳转走
然后将读取的数据压栈,调用一个处理函数
处理函数会建立一个循环,循环次数为 0x14。在循环中,程序依次读取 serial[i],将其和 0x41+i 进行异或运算,然后每次的结果累加保存在内存 4020F9 处
然后将累加的结果和 0x12345678 进行异或,还保存在 4020F9 处
再次将 serial 压栈,获取剩下未处理的 4字节
将剩下的 4字节和 4020F9 处的值进行比较,看是否相等。如果相等,则弹窗提示成功
4.注册机
#include <stdio.h>
#include <string.h>
#include <Windows.h>
int Keygen()
{
char szName[20] = { 0 };
char szSerial[20] = { 0 };
int NameLen = 0;
__int64 Result = 0;
printf("请输入14字节值:");
scanf_s("%s", szSerial, 20);
NameLen = strlen(szSerial);
if (NameLen != 14)
{
printf("不是十四字节! %d", NameLen);
return 0;
}
for (int i = 0; i < 14; i++)
{
szSerial[i] ^= (0x41 + i);
Result += szSerial[i];
}
Result ^= 0x12345678;
char* serial = (char*)&Result;
for (int i = 0; i < 4; i++)
{
printf("%c", serial[i]);
}
return 0;
}
int main(int argc, char* argv[])
{
Keygen();
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。