你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 编程语言
C++实现远程线程技术(三)
 
DWORD RemoteThread_Main(HINSTANCE hInstance) //远程要执行的代码,在这里只演示MessageBox
 {  ::MessageBox (0,"远程线程插入成功!","远程线程",0);
 return 1;
}
DWORD  ThreadEntry(LPBYTE  ImageBase) /***   远程线程入口  ***/
{    if(LoadAPI(ImageBase))//先完成API函数的导入工作
RemoteThread_Main ((HINSTANCE)ImageBase);  //执行函数RemoteThread_Main中的代码
return 1;
}
static DWORD GetTargetProcessId() //获取远程进程 PID
{  DWORD ProcessId = 0;
HWND hWnd = FindWindow("Progman", "Program Manager");//获取资源管理器进程PID
if(hWnd != NULL)
GetWindowThreadProcessId(hWnd, &ProcessId);
         return ProcessId;
}
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{   LPBYTE  InjectPoint = NULL, Module = NULL, NewModule = NULL,Param =NULL;
HANDLE hProcess = NULL, hThread = NULL;
DWORD ProcessId = 0, ImageSize = 0;
LPTHREAD_START_ROUTINE    RemoteEntryPoint = NULL;
Module = (unsigned char *)GetModuleHandle(NULL);//获取自身句柄
nt_header = (PIMAGE_NT_HEADERS)(Module + ((PIMAGE_DOS_HEADER)Module)->e_lfanew);
ImageSize = IMAGESIZE ; //得到内存映象大小
//通过VirtualAllocEx申请存放自身代码的内存空间
NewModule =( LPBYTE )VirtualAlloc(NULL, ImageSize, MEM_COMMIT | MEM_RESERVE, 
PAGE_EXECUTE_READWRITE);
    memcpy(NewModule, Module, ImageSize) ; //将自身复制到NewModule
nt_header = (PIMAGE_NT_HEADERS)(NewModule + ((PIMAGE_DOS_HEADER)NewModule)->e_lfanew);
if( ProcessId = GetTargetProcessId() ) //获取远程进程 PID
      if( hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, ProcessId)) //打开进程
          //通过VirtualAllocEx在打开的远程进程中申请内存空间
         if( InjectPoint = (LPBYTE)VirtualAllocEx(hProcess, 0, ImageSize, MEM_COMMIT,
 PAGE_EXECUTE_READWRITE) )
         {        RelocCode (NewModule, InjectPoint); //重定位NewModule处的代码
           RemoteEntryPoint = (LPTHREAD_START_ROUTINE)( InjectPoint +(DWORD) &ThreadEntry - Module );//得到ThreadEntry在远程进程中的地址
         Param  = InjectPoint; //将插入点地址作为参数传递给线程函数
           //将重定位好的代码通过WriteProcessMemory写入远程进程的内存空间中
         if(WriteProcessMemory(hProcess, InjectPoint, NewModule, ImageSize, NULL))
               //通过CreateRemoteThread启动刚写入的代码,参数为Param
            CreateRemoteThread(hProcess, NULL, 0, RemoteEntryPoint, Param, 0, NULL);
         }
return 0;
}
4 结语
文章中给出的代码可以把它当作一个模板,只要在RemoteThread_Main函数中加入实现各种功能的代码即可把它隐藏到其他进程中去运行。远程线程技术除了隐藏进程外,还有其他的一些有途,如用于杀毒软件进行内存杀毒等。以上代码均在WindowsXP专业版和Visual C++ 6.0 企业版下调试通过,能在WindowsXPWindows2000下正常运行,注意在编译程序时应保留重定位表信息,即在“Project”菜单中选“Setting”,然后选Link选项卡,将Link incrementally选上再进行编译,否则会出错。
 

                                 参考文献

[ 1 ][]Jeffrey Richter 著,王书洪,刘光明 译. Windows高级编程指南[M]. 北京:清华大学出版社,19996:455-460.

[ 2 ]罗云彬. Windows环境下32位汇编语言程序设计[M]. 北京:电子工业出版社,20042528~539, 667~735.

[ 3 ]看雪学院.  软件加密技术内幕[M]. 北京:电子工业出版社,2004,8:10~32. 

  推荐精品文章

·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089