本题是《加密与解密》光盘中的一道题。比较经典且易于理解。首先我们点开文件尝试运行
点击check按钮,发现文件没有反应,于是使用ida进行分析
发现了一个CreateFileA函数,主要作用是打开一个文件,于是下一个断点点击F9进行调试
在程序在断点处停止后,点击check按钮
显然,这是程序调用函数打开了名为“KwazyWeb.bit”的文件。我们可以用Hex Editor来伪造一个16进制文件,来进行接下来的调试。为了易于调试,最好是在创建16进制文件的时候输入一些有规律的数字,例如这里我创建了一个含01~0f的文件。
在这里可以看到先读入了一个非零的值,即我们创建的第一个值01,并且存进byte_4034FA。
分析后面的流程,可以看出又从后面读入了1个数据02,然后进入了sub_401000函数
对sub_401000函数进行分析发现,该函数是对第二次读到的所有数据求和,所以最后得到的结果就是02.
接下来读入0x12=18个数据。然后进入sub_4010c9函数
这里的sub_40101D函数是对读入的18个数据分别亦或第二次读入的数据的和。前面的strcpy将String2赋值给了String1,我们点进String2查看
根据经验,我们可以大致确定这是一个“走迷宫”类型的加密了。最终密码肯定是与迷宫的解法有关。我们接着往下分析。
byte_4034e8是存第三次读入的18个数据的首地址,每次都从左到右抽取数据的前两个未抽取过的二进制位放入sub_401033进行操作。仔细分析发现是吧数据拆分成了4进制进行计算,每次抽取的就是每个数据四进制位上的最左边的没有抽取过的值。
然后进入sub_401033函数
发现a1的0,1,2,3分别代表了上右下左的移动,所以我们可以手动写走出迷宫的步骤,然后构造一个符合条件的16进制文件即可。
最终的四进制码为:2221 2223 2211 0100 1110 0333 0300 1111 1211 0112 1112 2332 3303 3222 3221 1100 1111 2233
转化为16进制即为A9 AB A5 10 54 3F 30 55 65 16 56 BE F3 EA E9 50 55 AF
接下来考虑前几位的构造,由于文件第一位代表了第二次读入的数据个数,第二位是第二次读入数据的首地址,接着才是第三次读入。
由于第三次涉及到亦或第二次读入数据的和,所以我们不妨将第一位设为1 第二位设为0。这样在构造的时候就可以忽略掉亦或过程。直接把16进制的迷宫码输入即可。