1625-5 王子昂 总结《2018年2月21日》 【连续第508天总结】
A. 脱壳技术(4) 重建输入表
B.
重建输入表
外壳程序会破坏原程序的输入表,因此Dump内存以后必须要修复输入表才能正常运行
原理
IAT结构用于保存API的实际地址
PE文件在初始化输入表时,Windows装载器首先搜索OriginalFirstThunk,如果存在,加载程序迭代搜索数组中的每个指针,找到每个IMAGE_IMPORT_BYU_NAME结构所指向的输入函数的地址,然后加载器用函数真正入口地址来替代由FirstThunk指向的IMAGE_THUNK_DATA数组里的元素值。
外壳程序通常会自己起到装载器的作用来填充原程序的IAT,因此需要根据IAT来恢复Dump出来的程序的输入表
有的外壳为了反脱壳,会将原程序的IAT改为自己的Hook函数的地址,这样使得原程序在调用导入函数的时候仍然会把控制权交给外壳,外壳此时可以进行反调试、反Dump等等
应对方法就是跟踪Hook函数的处理方法,得到真正的IAT地址并回填还原
确定IAT的地址和大小
重建输入表的关键就在于IAT的获得,一般程序的IAT是连续排列的,以一个DWORD字的0作为结束,因此只要确定IAT某个点,就能获得整个IAT地址和大小
通过动态调试,找到导入函数的调用时就能发现IAT地址
上下翻动即可找到IAT的头尾,然后Dump出来并进行处理还原IID数组,最后塞到原程序的文件头里即可
ImportREC可以自动完成处理工作,只要告诉它IAT的地址和大小即可重建输入表
C. 明日计划
脱壳技术(5)