码迷,mamicode.com
首页 > 其他好文 > 详细

[转]Dll注入经典方法完整版

时间:2015-08-18 19:15:04      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

Pnig0s1992:算是复习了,最经典的教科书式的Dll注入。

总结一下基本的注入过程,分注入和卸载

注入Dll:

1,OpenProcess获得要注入进程的句柄

2,VirtualAllocEx在远程进程中开辟出一段内存,长度为strlen(dllname)+1;

3,WriteProcessMemory将Dll的名字写入第二步开辟出的内存中。

4,CreateRemoteThread将LoadLibraryA作为线程函数,参数为Dll的名称,创建新线程

5,CloseHandle关闭线程句柄

卸载Dll:

1,CreateRemoteThread将GetModuleHandle注入到远程进程中,参数为被注入的Dll名

2,GetExitCodeThread将线程退出的退出码作为Dll模块的句柄值。

3,CloseHandle关闭线程句柄

3,CreateRemoteThread将FreeLibraryA注入到远程进程中,参数为第二步获得的句柄值。

4,WaitForSingleObject等待对象句柄返回

5,CloseHandle关闭线程及进程句柄。

   1: //Code By Pnig0s1992 
   2: //Date:2012,3,13 
   3: #include <stdio.h> 
   4: #include <Windows.h> 
   5: #include <TlHelp32.h> 
   6:  
   7:  
   8: DWORD getProcessHandle(LPCTSTR lpProcessName)//根据进程名查找进程PID 
   9: { 
  10:     DWORD dwRet = 0; 
  11:     HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 
  12:     if(hSnapShot == INVALID_HANDLE_VALUE) 
  13:     { 
  14:         printf("\n获得进程快照失败%d",GetLastError()); 
  15:         return dwRet; 
  16:     } 
  17:  
  18:     PROCESSENTRY32 pe32;//声明进程入口对象 
  19:     pe32.dwSize = sizeof(PROCESSENTRY32);//填充进程入口对象大小 
  20:     Process32First(hSnapShot,&pe32);//遍历进程列表 
  21:     do  
  22:     { 
  23:         if(!lstrcmp(pe32.szExeFile,lpProcessName))//查找指定进程名的PID 
  24:         { 
  25:             dwRet = pe32.th32ProcessID; 
  26:             break; 
  27:         } 
  28:     } while (Process32Next(hSnapShot,&pe32)); 
  29:     CloseHandle(hSnapShot); 
  30:     return dwRet;//返回 
  31: } 
  32:  
  33: INT main(INT argc,CHAR * argv[]) 
  34: { 
  35:     DWORD dwPid = getProcessHandle((LPCTSTR)argv[1]); 
  36:     LPCSTR lpDllName = "EvilDll.dll"; 
  37:     HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,dwPid); 
  38:     if(hProcess == NULL) 
  39:     { 
  40:         printf("\n获取进程句柄错误%d",GetLastError()); 
  41:         return -1; 
  42:     } 
  43:     DWORD dwSize = strlen(lpDllName)+1;  
  44:     DWORD dwHasWrite; 
  45:     LPVOID lpRemoteBuf = VirtualAllocEx(hProcess,NULL,dwSize,MEM_COMMIT,PAGE_READWRITE); 
  46:     if(WriteProcessMemory(hProcess,lpRemoteBuf,lpDllName,dwSize,&dwHasWrite)) 
  47:     { 
  48:         if(dwHasWrite != dwSize) 
  49:         { 
  50:             VirtualFreeEx(hProcess,lpRemoteBuf,dwSize,MEM_COMMIT); 
  51:             CloseHandle(hProcess); 
  52:             return -1; 
  53:         } 
  54:  
  55:     }else 
  56:     { 
  57:         printf("\n写入远程进程内存空间出错%d。",GetLastError()); 
  58:         CloseHandle(hProcess); 
  59:         return -1; 
  60:     } 
  61:  
  62:     DWORD dwNewThreadId; 
  63:     LPVOID lpLoadDll = LoadLibraryA; 
  64:     HANDLE hNewRemoteThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)lpLoadDll,lpRemoteBuf,0,&dwNewThreadId); 
  65:     if(hNewRemoteThread == NULL) 
  66:     { 
  67:         printf("\n建立远程线程失败%d",GetLastError()); 
  68:         CloseHandle(hProcess); 
  69:         return -1; 
  70:     } 
  71:  
  72:     WaitForSingleObject(hNewRemoteThread,INFINITE); 
  73:     CloseHandle(hNewRemoteThread); 
  74:  
  75:     //准备卸载之前注入的Dll 
  76:     DWORD dwHandle,dwID; 
  77:     LPVOID pFunc = GetModuleHandleA;//获得在远程线程中被注入的Dll的句柄 
  78:     HANDLE hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)pFunc,lpRemoteBuf,0,&dwID); 
  79:     WaitForSingleObject(hThread,INFINITE); 
  80:     GetExitCodeThread(hThread,&dwHandle);//线程的结束码即为Dll模块儿的句柄 
  81:     CloseHandle(hThread); 
  82:     pFunc = FreeLibrary; 
  83:     hThread = CreateRemoteThread(hThread,NULL,0,(LPTHREAD_START_ROUTINE)pFunc,(LPVOID)dwHandle,0,&dwID); //将FreeLibraryA注入到远程线程中去卸载Dll 
  84:     WaitForSingleObject(hThread,INFINITE); 
  85:     CloseHandle(hThread); 
  86:     CloseHandle(hProcess); 
  87:     return 0; 
  88: } 

[转]Dll注入经典方法完整版

标签:

原文地址:http://www.cnblogs.com/kangxiaopao/p/4739914.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!