首先运行小程序,观察下有什么可以利用的特征。
很显然是一个典型的crakeme.下面拖进OD
由于有输入框,一般在函数getdlgtextA下断,如下
分析知道,name长度最小8,而serial的长度一直是8
继续跟踪,找到关键算法段
尤其注意到在ds:[0x402038]位置是一个常量串(可以多尝试),算法比较简单,直接给出破解源码
#include<bits/stdc++.h>
using namespace std;
char find_s[]="figugegl";
int main()
{
string name;
cout<<"Enter your name(at least 8 bytes): ";
cin>>name;
int len=8;
int k=7;
int index;
char serial[20];
char temp;
for(int i=0;i<len;i++)
{
temp=name[i];
temp^=find_s[k-i];
index=temp%8;
serial[i]=find_s[index];
}
serial[8]='\0';
cout<<serial<<endl;
return 0;
}
python 脚本
name = input("Enter your name: ")
base_find = "figugegl"
serial = ''
for i in range(0, 8):
temp = ord(name[i])
temp ^= ord(base_find[7 - i])
serial += base_find[temp % 8]
print(serial)
就这样咯.....继续干........加油