脱壳很重要的一步就是修复IAT,他关系到脱壳后的程序能否正常运行。
原程序在加壳前是由PE加载器处理IAT的,当我们在OD中选择WinMain进行加载的时候,其实IAT都已经处理完成了,PE加载器到底做了什么我们不需要去关心的,余下的就是在程序中如何调用那些API了,一般在程序代码中会用FF 15 方式CALL API,这在VC的程序中常见,在VB中也会见到FF 25形式的JMP调用。
当程序加过壳之后,情况就不同了。当然,壳也会有张输入表,也会被PE加载器给处理好,包括了壳要使用的几个基本的API,如GetModuleHandle之类的,不然壳也玩不转的。那些被PE加载器处理好的IAT我们也不用关心,应为现在的壳在自己解压解密完成之后,也不会再从那里调用了。再加上VM技术,现在的壳基本上就是把程序中的FF 15或者FF 25 简单调换成E8 CALL E9 JMP 到壳自己建立的VM块中去执行部分或全部API功能,用VM 绕死破解者。