11.4.7 再加密函数
紧接着你就会看到另外一个对6DEF20的调用——即NtDelayExecution函数,然后我们好像已经到了函数的结尾处。OllyDbg为我们显示了如下这段代码:
如果你仔细看一下004041F4处的JMP指令要跳转的地址,你会发现这个地址距离我们目前所在的地址非常远——实际上这个地址在这个函数的开头部分。为了让你回想起来一些东西,我们看看在那个地址的代码:
不知道你是否还记得这两行代码,不过没关系,就在00403401前面的一行代码把[EBP-8]置为了1,考虑到在00403401处就将它与0作比较,这看上去似乎有点可笑。好了,答案是——正是位于函数末尾的加密代码将这个变量置为零并跳转回00403401(刚好把完成置1的代码给搁在外面了)。既然这次执行了条件跳转,所以就跳转到了40346D处,此处的这段代码看上去与我们刚开始学习的解密代码非常相似。不过,还是有一些不同的地方——在调试器中考察这段代码的执行效果,你会很容易地发现:这段代码是对这个函数中的代码进行再加密。
我们没有必要再深入研究这个逻辑的细节了,但还有几个细节内容需要提一下。在加密代码执行完后,就要执行下面的代码:
其中第一行代码将EAX中的值存放到一个全局变量中。EAX看起来好像存储的是加密代码的某种校验和。而且,这几条PUSH、POP、JMP指令与最初跳转到解密代码中的指令完全是一样的,只是这次跳转的目标地址被修改为这个函数的结尾处。