当前位置: 首页 > 科技资讯>正文

向其他进程注入代码的三种方法

访问:185 留言:0更新日期:2008-01-01 00:00
向其他进程注入代码的三种方法
 
   一些蹩脚的破解者用类似的方法来修改可执行文件的机器码,但是一个程序一旦载入内存,就不能再更改自身的机器码(一个可执行文件的.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(译者注:大概是一位中国人
网友询问留言 已有0条评论

    还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1