共计 889 个字符,预计需要花费 3 分钟才能阅读完成。
Crackme032 的逆向分析
1. 程序观察
这个程序打开之后,就只有这一个弹窗,点击确定就会退出,什么都没有。
2. 简单查壳
可以看到是 Delphi 的程序,但加了 UPX 的壳。
使用 UPX 脱壳工具可以很简单的就脱了壳。
3. 程序分析
这个程序不可能就简单的只有一个弹窗,我们使用 IDR 加载程序,可以看到程序是有 3 个窗口的
想要找到这三个窗口有 2 个办法,一个是根据弹窗提示建立一个叫做 Reg.dat 的文件,另一个是直接修改代码逻辑,我们选择直接修改代码逻辑,如图
运行程序,找到注册界面,可以看到 OK 按钮是灰色的,看来只有输入正确的序列号才能点击 OK 按钮
在输入序列号的时候,一定会调用到函数 00437D1C 的,所以我们到该函数处看一看
根据序列号输入的位数的不同,会跳转到不同的代码处
但进行的操作是一样,得到该位输入的序列号,然后作为参数调用函数 437BD8
函数 437BD8 首先会获取输入的用户名和长度,如果长度小于 5 就跳转
然后程序会依次取得输入的用户名,分别使用 name[0]、name[2]、name[3]、name[4] 除以 0xA,然后将商值保存在地址 437A2C – 437A38 处
然后检查商的长度,如果长度大于 1,则再次除以 0xA
然后将 4 个商相对应的和序列号的 4 位做比较,如果都相同,则 OK 按钮变量
4. 注册机
#include <stdio.h>
#include <string.h>
#include <Windows.h>
int Keygen()
{char szName[20] = {0};
char szSerial[20] = {0};
__int64 Result = 0;
printf("请输入用户名:");
scanf_s("%s", szName, 20);
for (int i = 0x0; i < 5; i++)
{if (i != 1)
{Result = szName[i] / 0xA;
if (Result > 9)
{Result = Result / 0xA;}
printf("%I64d", Result);
}
}
return 0;
}
int main(int argc, char* argv[])
{Keygen();
return 0;
}
相关文件在我的 Github
正文完