Exeinfo查壳,发现没有壳,是Delphi程序
OD字符串搜索,找到关键位置,发现一个关键的call,和一个strcmp比较函数。
进入关键call进行分析,结合IDA。
分析这个call,发现输入的name字符串长度必须是偶数,否则最后构造的字符串会出现乱码,这里类似构造了一个汉字。
但是当输入的字符串长度是奇数时。会出现乱码。
我们根据关键call的逻辑,编写注册机程序。
总结:根据单步调试总结,如果输入的是字母,必须是偶数长度,如果输入的是数字,则长度没有要求,数字转化后的字母字符串还要进行转化为大写操作。
name字符串为字母的注册机程序:
#include <iostream>
using namespace std;
int main()
{
char szName[10] = { 0 };
cin >> szName;
int nLen = strlen(szName);
if (nLen % 2)
{
printf("输入的长度必须为偶数\n");
return 0;
}
int nEbx = 1;
char szSerial[10] = { 0 };
for (int i = 0; i < nLen; i++)
{
int nEdi = szName[i];
int nEdx = nEdi;
int nEcx = nEbx + 5;
nEdx ^= nEcx;
nEdx += nEdi;
nEdx += 0xA;
szSerial[i] = nEdx;
nEbx++;
}
//中间结果
cout << szSerial << endl;
char szResult[50] = { 0 };
sprintf_s(szResult, "HZF-%s-GFD", szSerial);
cout << szResult << endl;
return 0;
}
执行结果:
程序还有一个Nag窗口,我们尝试去去除
我们尝试使用F12暂停法,栈回溯,找到关键位置
修改跳过弹框,保存文件。即可。
再次运行程序,发现没有Nag提示窗口。