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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。