同样的代码,在XP下面随便你怎么整,WIN7的话是相当纠结的,具体哪些错误就不解释了 ~~
gg点了二十多页,在韩国某大牛的博客上总算找到一点思路(虽然看不懂韩文,但代码还算勉强看得懂吧)
原来是要用动态调用ntdll.dll >> NtCreateRemoteThreadEx ,于是over~~
说明:
1、InjectDll.exe 是注入DLL的EXE
2、dummy.dll 是一个普通DLL,加载后弹出MessageBox
下面是一个XP中远程线程注入DLL的代码,在WIN7 + OD调试的例子:
看看错误信息:
杯具了,接着看! 重新运行OD调试,bp CreateRemoteThread :
看看CreateRemoteThread 中的几个参数:
上图重要标记的几个参数:
(1) svchost.exe (PID: 3184) 句柄
(2) kernel32.dll ! LoadLibarayA
(3) 在svchost中为C://Work//dummy.dll字符串所分配的首地址
进入CreateRemoteThread :
我们发现,实际上是调用kernelbase >> CreateRemoteThreadEx 函数。
(GG了这个DLL,原来是它是继VISTA/WIN7之后额外的DLL,负责协助Kernel32.dll的调用!)
那我们看看这个函数调用栈中的参数吧:
发现与kernel32.dll >> CreateRemoteThread 参数一模一样!
OK ! 我们再继续跟进kernelbase.dll >> CreateRemoteThreadEx :
那我们看看这个函数调用栈中的参数吧:
OK,这算到底儿了,因为ntdll.dll >> ZwCreateThreadEx 已经运行到了内核代码,我们的OD没办法再调试了!
于是请google sysenter吧!
特别说明,kernelbase.dll >> CreateRemoteThreadEx 是对 ntdll.dll >> ZwCreateThreadEx 的补充扩展!
那我们都得到这样的结果 :
ntdll.dll >> ZwCreateThreadEx 是未公开的API,MSDN、GG也很难找到相关资料!
下面是看看这个结构体伪代码:
OK ,那剩下的我们只需要重写CreateThreadEx 函数即可!
为了保证XP的兼容,所以需要判断一下OS版本,下面是完整的测试代码:
DLL就不贴了吧,有兴趣的友友可以参考一下~~
<转载请注明出处: http://blog.csdn.net/wangningyu/archive/2011/05/31/6456607.aspx >