先打开程序随便输入查看情况
OD打开后,搜索相应的字符串找到了这里
往上面看发现了这里的JE是整个跳转的关键,同时发现了You Get It的成功字样:
然后把JE给NOP掉就显示出了结果,(人家竟然让我KEYGEN….)
判断的函数应该在前面,所以在前面一步一步下断点,发现了当在这里断点的时候,寄存器出现了变化:
EAX中的‘ssss’是我随意输入的serial,ECX中的‘780345’不知道是什么。
调用了箭头所指函数后,EAX中出现了像serial一样的东西:
所以推测箭头执行的函数是把ECX里面的字符串前面加上AKA-变成了serial,看来又是固定前面字符串后面自动生成的类型。
重新打开输入尝试了一下发现结果正确,确实是serial:
那么接下来开始分析这个780345是怎么来的:
不断在上面设断点,发现了这个函数执行后EAX出现了780345(这段还是借助百度,自己思路确实不太够。):
最后从前面开始慢慢分析,遇到VBA的相关函数就百度,最后的分析结果如下(换了吾爱破解版的写注释,要不正常OD中文注释实在是看不清。)
知识点:
VbaLenBstr 求字符串的字节数
RtcAnsVauleBstr 求字符串第一个字符的ASCII码
VbaStrI4 将数字(dec)转换成相应的字符串
所以最后serial=AKA-len(name)*17CFB+’name[0]’,这样就可以写keygen了!
keygen如下:#include<string.h>
#include<iostream>
using namespace std;
int main(int argc,char *argv[])
{
char name[50];
int serial;
while(1)
{
cout<<"Input the name:";
cin>>name;
if(strlen(name)>50)
cout<<"The name is too long!"<<endl;
else
{
serial=strlen(name)*(0x17CFB)+name[0];
cout<<"The serial is:"<<"AKA-"<<serial<<endl;
}
cout<<"Coutinue or not(y/n)?";
char temp;
cin>>temp;
if(temp=='n') break;
}
system("pause");
return 0;
}