[原创]Windows注入篇之内核感染导入表注入X64[高清有码]
续着上一篇APC注入,由于没有实现64位,这里换种方式去搞64位,现在关于感染导入表的文章很多具体我就不深入去描述了,大致总结下要注意哪些要点吧:
1). 导入表注入场景有限制,就是所有东西都只能在DllMain里调用,对代码的要求很高,不像APC那样时机比较靠后加载之后还能通过ShellCode去调用导出函数。
2). 导入表注入容易被还原,只要比较原始文件发现不一样就说明被改了,时机可以用进程/模块回调去捕捉。
3). 用导入表注入方式注入的模块要求有:
1. 必须要导出某个函数,并且在新构造的导入表项IID OriginalFirstThunk 指定你要导入的那个函数,这里我用0x80000001表示导入"序号为1"的导出函数。
2. 对于Windows自带的一些exe,通常其都带有绑定输入表,这个东西是为了优化加速进程启动的,如果新构造的IID中指定的导入函数在Bound Import Table 中不存在,那么进程启动的时候将会崩溃,为了避免这种情况可以给其清空。当然这从某种意义上来说是废掉了优化进程启动的这个功能。
3. 由于所有资源都必须在DllMain中调用,我们知道这里是ntdll!LdrRunInitial*即ntdll加载导入表的时机,这里有很多锁,例如ntdll!LdrpLoadLock...
4). 导入表注入方式的模块一旦加载失败,那么将会引起崩溃弹窗,有很多原因会造成这个现象,特别是某些杀软在动态链接库加载的时机Patch了该模块。
5). 当没有其他人也用这种方式改导入表时,新IID放置于导入表最前面一项,加载时机应该会在kernel32/kernelbase之后就进行加载。由于时机过早各方面都得注意。
6). 64位进程如果进程加载基地址超过了32位,那么新导入表的内存就不能申请在32位地址空间下,因为导入表偏移RVA只有4字节......反之,如果进程加载基地址是32位地址,那么内存同样也不能申请在64位地址空间......再有,尽量不要在进程基地址之前申请,这样算偏移是负数......
不多说,上代码,Win7 x64自测没问题,其他平台还希望大家帮忙测试下啦,跟上一篇文章一样,动态库也是直接放入C:\下,所有进程都注入。
