向其他进程注入代码的三种方法
一些蹩脚的破解者用类似的方法来修改可执行文件的机器码,但是一个程序一旦载入内存,就不能再更改自身的机器码(一个可执行文件的.text段是写保护的)。我们能修改远程进程中的NewProc是因为它所处的那块内存在分配时给予了PAGE_EXECUTE_READWRITE属性。
何时使用CreateRemoteThread和WriteProcessMemory技术
通过CreateRemoteThread和WriteProcessMemory来注入代码的技术,和其他两种方法相比,不需要一个额外的DLL文件,因此更灵活,但也更复杂更危险。一旦你的ThreadFunc中有错误,远程线程会立即崩溃(看附录F)。调试一个远程的ThreadFunc也是场恶梦,所以你应该在仅仅注入若干条指令时才使用这个方法。要注入大量的代码还是使用另外两种方法吧。
再说一次,你可以在文章的开头部分下载到WinSpy,InjectEx和它们的源代码。
写在最后的话
最后,我们总结一些目前还没有提到的东西:
方法 适用的操作系统 可操作的进程进程
I. Windows钩子 Win9x 和WinNT 仅限链接了USER32.DLL的进程1
II. CreateRemoteThread & LoadLibrary 仅WinNT2 所有进程3,包括系统服务4
III. CreateRemoteThread & WriteProcessMemory 近WinNT 所有进程,包括系统服务
1. 很明显,你不能给一个没有消息队列的线程挂钩。同样SetWindowsHookEx也对系统服务不起作用(就算它们连接了USER32)。
2. 在Win9x下没有CreateRemoteThread和VirtualAllocEx(事实上可以在9x上模拟它们,但是到目前为止还只是个神话)
3. 所有进程 = 所有的Win32进程 + csrss.exe
本地程序(native application)比如smss.exe, os2ss.exe, autochk.exe,不使用Win32 APIs,也没有连接到kernel32.dll。唯一的例外是csrss.exe,win32子系统自身。它是一个本地程序,但是它的一些库(比如winsrv.dll)需要Win32 DLL包括kernel32.dll.
4.如果你向注入代码到系统服务或csrss.exe,在打开远程进程的句柄(OpenProcess)之前把你的进程的优先级调整为“SeDebugprovilege”(AdjustTokenPrivileges)。
大概就这些了吧。还有一点你需要牢记在心:你注入的代码(特别是存在错误时)很容易就会把目的进程拖垮。记住:责任随权利而来(Power comes with responsibility)!
这篇文章中的很多例子都和密码有关,看过这篇文章后你可能也会对Zhefu Zhang(译者注:大概是一位中国人
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。