算法难度:⭐⭐⭐(跳转表)
爆破难度:⭐
信息收集
运行情况:
查壳与脱壳:
调试分析
老版本delphi程序
输入错误信息,看提示:
通过x86dbg去搜索字符串,找到这个校验函数:sub_421B84,去IDA里搜索这个位置,然后同时用DelphiDecompiler打开这个程序辅助分析
首先是处理一下输入,用户名需要大于等于6字符,然后全部变成小写
然后是进入循环了,取一个字节,减去’a’,然后以此为索引去跳转,这就是switch-case语句的跳转表的形式,每个分支都有不同的处理
跳转分支里的内容是赋值,然后出来之后就是把赋值的值累加到1字节里,总共循环6次
再往下就是常规的字符串拼接和对比了:
注册机
注册码生成算法:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string name="";
string serial="";
int len;
std::cin >> name;
len = name.length();
transform(name.begin(), name.end(), name.begin(), ::tolower);
uint8_t dl;
uint8_t bl=0;
for (int i = 0; i != 6; ++i)
{
switch (name[i])
{
case 'a':
dl = 24;
break;
case 'b':
dl = 37;
break;
case 'c':
dl = 66;
break;
case 'd':
dl = 12;
break;
case 'e':
dl = 13;
break;
case 'f':
dl = 6;
break;
case 'g':
dl = 54;
break;
case 'h':
dl = 43;
break;
case 'i':
dl = 23;
break;
case 'j':
dl = 47;
break;
case 'k':
dl = 19;
break;
case 'l':
dl = -126;
break;
case 'm':
dl = -101;
break;
case 'n':
dl = -110;
break;
case 'o':
dl = 3;
break;
case 'p':
dl = 99;
break;
case 'q':
dl = 33;
break;
case 'r':
dl = 66;
break;
case 's':
dl = 92;
break;
case 't':
dl = 41;
break;
case 'u':
dl = -57;
break;
case 'v':
dl = 102;
break;
case 'w':
dl = 88;
break;
case 'x':
dl = 10;
break;
case 'y':
dl = 40;
break;
case 'z':
dl = 80;
break;
default:
dl = 93;
break;
}
bl += dl;
}
cout << (int)bl << "-" << len * 0x4a7e;
}
效果: