首先我们使用Exeinfo查壳,发现并没有壳,是Delphi编译的程序
我们OD附加这个程序,字符串搜索,找到关键的位置,分析附近的逻辑代码。OD在函数头下断,单步运行。
找到这个函数地址之后,我们配合IDA的静态分析,F5功能生成C语言代码,我们提前用Shift+F5添加Delphi函数的库函数识别,帮助我们更快的分析。
发现一开始都是一些写入的操作。结合OD,我们分析。
我们分析得到,有一个关键算法call,应该是根据name计算出serial字符串的算法,下方有一个数字转10进制字符串的过程。进入这个00408388call分析。
同时结合IDA.
总结这个函数,一开始根据name字符串长度计算循环的次数,接着进行循环,这个算法
就是取出每次nEsi^2和nEsi ^2 -1的下标的字符串ascii码,进行按位或操作,再把结果和字符串长度相加。再通过字符串拼接赋值到一个字符串缓冲区里。
KeyGen:
#include <iostream>
using namespace std;
int main()
{
char szName[10] = { 0 };
cin >> szName;
int nLen = strlen(szName);
int nEsi = 0;
//计算循环次数
int nCount = nLen >> 1;
unsigned char szSerial[10] = { 0 };
for (int i = 0,j=0; i < nCount; i++)
{
int nEdx = nEsi;
nEdx ^= 2;
int nbl = szName[nEdx];
nEdx -= 1;
int nal = szName[nEdx];
nbl |= nal;
nbl += nLen;
szSerial[j++] = nbl;
}
printf("%d\n", szSerial[0]);
return 0;
}
执行结果: