运行之后输入key然后就是程序长时间的卡死,然后过了很久才告诉我结果。
本来第一反应是里面用了高强度的虚拟机,结果进去每一步都挺清楚的,没有加密或者混淆的地方。唯二需要注意的地方就是代码的空间量很大,而且基本都是rwx权限。
然后跟踪没多久就jmp eax跳转了,然后。。。除了没有输入,基本就是一个循环。。
整个流程不调用api,数据/代码在空间内来回跳,实在不好下断点。
基本猜测作者是写了一个自解密函数,然后又写了个加密变形函数把这个函数来回加密变形,最后造了个pe结构套上去。
只好注入一个dll接管exe的执行流程,把每一步的call eax就hook下来,接管跑完之后发现居然有2880次解密操作。
然后再分析数据的变化过程,本来以为只有最后一层的代码有用,结果,跑完之后发现所谓的核心代码居然不完整。
回头发现原来每一层里其实都有或多或少的几句汇编代码,虽然不一定有完整功能,但是可以和其他层的连上。
那就修改dll开始抠代码,中间加载了od的反汇编库来计算指令长度,然后去掉中间的各种跳转指令,最后把完整的函数的二进制字节码保存成了文件,居然达到了37k之大。
本来以为这个题目最难的地方已经过去了,没想到对于不懂密码的我来说,噩梦刚刚开始。
ida打开这个文件就卡死了,反编译成解密函数更是用了半小时,好在用vs编译起来就快多了,而且运行结果也完全正确。
但是刚看了函数的前5行就看不懂了,看了前10行就蒙了,看了前20行直接就想摔键盘了。
*(p_ebp - 1) = p_esi[439] ^ p_esi[423];
*(p_ebp - 2) = p_esi[442] ^ p_esi[426];
v2 = p_esi[421] ^ p_esi[437];
v3 = p_esi[441] ^ p_esi[425];
v4 = (unsigned__int8)p_esi[433];
*(p_ebp - 3) = p_esi[404] ^ p_esi[(unsigned__int8)p_esi[420] ^ (unsigned__int8)p_esi[436] ^ 9];
v5 = p_esi[405] ^ p_esi[(unsigned__int8)p_esi[417] ^ v4 ^ 9];
v6 = (unsigned__int8)p_esi[430];
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2019-9-26 00:55
被xym编辑
,原因: