前面不多说,查壳,然后是32bit,就直接拖进ida32中
这边进入主函数后查看,发现就是一个简单的if判断,if括号内的条件对,就成功,在旁边简单注释一下,此处给a2[1]留个心眼,然后我们先进入sub_8048414函数看看此处需要注意的是,该函数的返回值必须要是非0才行,不然原来if括号内的条件就不满足了,这个函数的返回值为result,所以保证result不为0就行了,这边逐一进行分析,上面a2的初始值为0(看写的注释),那就找case 0处,要想result!=0,那就让这个if条件不满足,*a1=105,然后再跳转到 LABEL_19,这边是一个递归,这边注重看a2值的变化就行,然后再到相应的case去,获得*a1的下一个数,比如,接着刚才下面,跳转之后,
a2=7*(a2+1)%11,此处a2为0,带入,a2获得新值7,那就去case 7,*a1的下一个数就是115,以此类推,最后a2=2,发现没有对应的case 了,那就结束,然后再进入另一个函数看看
发现就是这样一个简单的算法,我们上面获得的数组就是*a1,此处再点进unk_8048760,提取数据,得到另一个数组,两个数组都有了,那就异或,答案出来了就,最后
#include<stdio.h>
int main() {
int num[]= {
15, 0, 0, 0, 31, 0, 0, 0, 4, 0,
0, 0, 9, 0, 0, 0, 28, 0, 0, 0,
18, 0, 0, 0, 66, 0, 0, 0, 9, 0,
0, 0, 12, 0, 0, 0, 68, 0, 0, 0,
13, 0, 0, 0, 7, 0, 0, 0, 9, 0,
0, 0, 6, 0, 0, 0, 45, 0, 0, 0,
55, 0, 0, 0, 89, 0, 0, 0, 30, 0,
0, 0, 0, 0, 0, 0, 89, 0, 0, 0,
15, 0, 0, 0, 8, 0, 0, 0, 28, 0,
0, 0, 35, 0, 0, 0, 54, 0, 0, 0,
7, 0, 0, 0, 85, 0, 0, 0, 2, 0,
0, 0, 12, 0, 0, 0, 8, 0, 0, 0,
65, 0, 0, 0, 10, 0, 0, 0, 20, 0,
0, 0
};
int result;
int k = 0;
int str[] = { 105,115,101,110,103,97,114,100 };
for (int i = 0; i <= 32; i++) {
result = num[k] ^ str[i % 8];
k += 4;
printf("%c", result);
}
return 0;
}
上代码,这边需要注意一下,异或的数,是num数组中不为0的数,所以k+=4,做到最后,其实也就是一个基础的题目,分析,提取,逆推代码。