-
-
[原创]
-
发表于:
2018-6-19 00:02
2898
-
找到main函数,动态调试发现先初始化两个字符串
然后对输入进行检查,输入的长度必须为22,输入必须为0-9,a-z,A-Z。
可逆向出关键的数据结构如下
struct Str{
char s[32];
int length;
};
struct node{
struct Str data ;
struct node *child[32];
int node_length; //孩子指针个数
int flag; //标识节点node个数
}
输入被按顺序分为了如下几组:
{13,14,15} ,{0,1},{9,10,11,12},{4,5,6},{2,3},{7,8},{16,17,18},{19,20,21}
依次执行sub_403AB0()函数(把字符串转化为结构体Str)和sub_402B40()(把输入的字符串与根节点的子节点依次作比较,如果相等则该节点flag字段加一,如果前面字符相等,但长度大于该节点就会递归操作,如果不相等就添加为子节点),最后与dword_407E48处的结构体作比较,可动态调试出最终的结构体为如下结构:
一共8组输入,分别为kx,c7,c7Mk,c7M,c7M,ct,ctf,ct9
又因为
input[1]^input[0]=84
input[8]^input[7]=19
input[14]^input[15]=18
input[17]^input[18]=77
可推导出8组输入依次为ctf,c7,c7Mk,c7M,ct,kx,ct9,c7M
最后得到注册码为c7ctc7Mkxc7Mkctfct9c7M
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!