滴水逆向联盟

标题: VC++实现伪装进程路径 [打印本页]

作者: 大灰狼    时间: 2014-11-5 09:26
标题: VC++实现伪装进程路径

  1. 我们经常需要进行伪装进程路径,以保护相关重要进程。


  2. [cpp] view plaincopy


  3. #include <windows.h>  
  4. #include <stdio.h>  
  5. #include <tchar.h>  
  6.   
  7. // 结构定义  
  8. typedef struct _PROCESS_BASIC_INFORMATION {  
  9.     DWORD ExitStatus;  
  10.     ULONG PebBaseAddress;  
  11.     ULONG AffinityMask;  
  12.     LONG BasePriority;  
  13.     ULONG UniqueProcessId;  
  14.     ULONG InheritedFromUniqueProcessId;  
  15. } PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION;  
  16.   
  17. // API声明  
  18. typedef LONG (__stdcall *PZWQUERYINFORMATIONPROCESS)   
  19. (   HANDLE ProcessHandle,  
  20.     ULONG ProcessInformationClass,  
  21.     PVOID ProcessInformation,  
  22.     ULONG ProcessInformationLength,  
  23.     PULONG ReturnLength);  
  24. /********************************************************/  
  25.   
  26. /*  函数:FxReplaceProcessPath
  27.     功能:伪装进程路径
  28.     参数:1-目标进程句柄
  29.           2-假路径的字符串(UNICODE)
  30.     返回值:TRUE-成功
  31.             FALSE-失败*/  
  32. BOOL FxReplaceProcessPath(HANDLE hProcess, TCHAR *szNewPath)  
  33. {  
  34.     // 获取NTDLL.DLL的基址  
  35.     HMODULE hModule = GetModuleHandle(TEXT("NTDLL.DLL"));  
  36.     if (hModule == NULL) return FALSE;  
  37.   
  38.     // 获取ZwQueryInformationProcess函数的指针  
  39.     PZWQUERYINFORMATIONPROCESS pZwQueryInformationProcess =   
  40.         (PZWQUERYINFORMATIONPROCESS)GetProcAddress(hModule, "ZwQueryInformationProcess");  
  41.       
  42.     // 查询进程基本信息(包含PEB地址)  
  43.     PROCESS_BASIC_INFORMATION pbi = {NULL};  
  44.     if(pZwQueryInformationProcess(hProcess, 0, (LPVOID)&pbi, sizeof(pbi), NULL) < 0)  
  45.         return FALSE;  
  46.       
  47.     // 获取PEB+0X10处的_RTL_USER_PROCESS_PARAMETERS结构指针  
  48.     ULONG lpRUPP = NULL;  
  49.     ReadProcessMemory(hProcess, (LPVOID)(pbi.PebBaseAddress + 0x10), &lpRUPP, 4, NULL);  
  50.       
  51.     // 修改进程路径  
  52.     ULONG lpOldPath = NULL;  
  53.     ReadProcessMemory(hProcess, (LPVOID)(lpRUPP + 0x3C), &lpOldPath, 4, NULL);  
  54.     WriteProcessMemory(hProcess, (LPVOID)lpOldPath, szNewPath, MAX_PATH, NULL);  
  55.   
  56.     // 修改命令行为空  
  57.     ULONG lpOldCommand = NULL;  
  58.     ReadProcessMemory(hProcess, (LPVOID)(lpRUPP + 0x44), &lpOldCommand, 4, NULL);  
  59.     WriteProcessMemory(hProcess, (LPVOID)lpOldCommand, TEXT(""), MAX_PATH, NULL);  
  60.   
  61.     return TRUE;  
  62. }  
  63.   
  64. //入口函数  
  65. int main(int argc, char* argv[])  
  66. {  
  67.     FxReplaceProcessPath(GetCurrentProcess(), TEXT("C:\\WINDOWS\\system32\\svchost.exe"));  
  68.     printf("Goodbye World!\n");  
  69.     system("pause");  
  70.     return 0;  
  71. }  

复制代码



作者: OneTime    时间: 2014-11-13 20:11
说实话我突然觉得我学线程编程的时候啥都没有学到




欢迎光临 滴水逆向联盟 (http://www.dtdebug.com/) Powered by Discuz! X3.2