简单线程注入的实现

最近在搞线程注入,其实这个流程也蛮简单的。一些书上写的线程注入,都是使用 call [ebx + XXXX]的形式来解决重定位。这样的 话,invoke伪指令就不能直接使用了。就像用伪指令调用messagebox,本来就是 invoke MessageBox,NULL,addr szCaption,addr szTitle,MB_OK,远程注入的话,代码就要变动,写 成如下形式:   还挺麻烦的。我通过参考网络上的一些资料,通过线程注入记事本、计算器,或者别的知道了窗口类的软件进程。在他们的基础上,线程注入,然后注入的代码编写成其他我需要体现的。例如,悄悄下载一些东西并且运行,删除一些文件等,这个是个人爱好了。 下面是主要的注入记事本进程后运行的代码:   这段代码是插在记事本运行的,所以它自己要装载API所需要的dll。比如URLDownloadToFile,是urlmon.dll里面的,所以,要用LoadLibrary装载。   00403008H 这个地址,是urlmon.dll的内存地址,在同一个exe文件的空间,内存地址是没有改变,所以00403008H压栈,然后 call LoadLibrary调用,这样我们就可以使用这个API下载文件了。ShellExecute是在shell32.dll里面,在远程线程 调用,自然也要。   其中00403013H是shell32.dll的内存地址。全部都装载完毕,API就可以正常调用。   使用了伪指令的方式注入。 怎 么寻找到记事本的ID?Windows提供了FindWindow,只要知道记事本的窗口类,就可以GetWindowThreadProcessId找 到了。知道记事本的窗口类很简单,只要下载一些查看窗口类名的工具就可以了,然后你可以随便注入一个知道窗口类的程序进程空间。   找 到之后,调用GetWindowThreadProcessId可以从窗口类句柄找到PID。接着,OpenProcess找到句柄,其中,要以“允许创 建远程线程”,“允许使用进程的地址空间”,“ PROCESS_VM_WRITE”的权限打开。因为我们就是要对记事本的空间进行写的操作,权限务必要 足够。如果记事本没有内存空间给我们存放代码,那么也枉然,然后要释放和分配内存空间,VirtualFreeEx与VirtualAllocEx就可以 做到,其中VirtualAllocEx返回的句柄保存在寄存器eax中,mov hWnd,eax传送到hWnd做为操作的句柄,用 WriteProcessMemory开始写它的内存空间,CreateRemoteThread创建指定的线程目标进程句柄,也就是我们最后的注入代 码。 下面是完整代码:   其实这段:   可以将它转换成机器码,这样就不需要子程序了。直接“szShellcode db ............”,在写入空间地址的时候,直接Wirte进去。 测试方法: 打开一个记事本后运行程序,就注入,然后运行你的写字版。 BUG描述: 同样一个编译好的程序,在这个时候运行,测试成功。写字版正常打开,过会就不知道为什么,记事本出现错误。郁闷了我,知道为什么的请支个招。 刚刚看了一个牛人的代码,Copy了一部分并做了注释,把它放到我的代码中,就可以注入explorer.exe进程了,恭喜一下:   只 是做了一点注释,将一个DOS下PE文件的标识 MZ 加到寄存器edi。对于sizeof的用法,好像是在内存中的字节变量的大小,然后将编译好的程序 的内存尺寸SizeOfImage保存在eax。mov ShellSize, eax,将SizeOfImage存到了ShellSize。 修改过后的注入explorer.exe完整代码,Windows XP SP2下测试通过:
posted @ 2012-07-15 22:48  adodo1  Views(106)  Comments(0Edit  收藏  举报