天马阁

 找回密码
 立即注册
                                        →→→→→→→→→→→→ 1点击查看所有VIP教程目录长列表(总教程数269个) 2办理VIP详情进入 ←←←←←←←←←←←←
1 x64CE与x64dbg入门基础教程 7课 已完结 2 x64汇编语言基础教程 16课 已完结 3 x64辅助入门基础教程 9课 已完结 4 C++x64内存辅助实战技术教程 149课 已完结
5 C++x64内存检测与过检测技术教程 10课 已完结 6 C+x64二叉树分析遍历与LUA自动登陆教程 19课已完结 7 C++BT功能原理与x64实战教程 29课 已完结 8 C+FPS框透视与自瞄x64实现原理及防护思路 30课完结
64驱?封? 9 64反驱? 10 64位V? 11 绝? 12 ???课?
13 64透 ? 14 64U ? 15 64Q ? 16 64功 ?
17 64U ? 18 64模 ? 19 64多 ? 20 64网 ?
21 64注 ? 22 64火 ? 23 64棋 ? 24 64自二链L?
25 64破 ? VIP会员办理QQ: 89986068   
【请先加好友,然后到好友列表双击联系客服办理,不然可能无法接受到信息。】
27 加入2000人交流群637034024 3 28 免责声明?
查看: 4990|回复: 0

64位环境下32位进程获取64位进程的命令行参数和当前目录

[复制链接]

12

主题

0

回帖

14

积分

编程入门

Rank: 1

天马币
24
发表于 2024-3-3 09:18:58 | 显示全部楼层 |阅读模式

  1. BOOL GetProcessCurDir(HANDLE hProcess,mystring&strCurDir)
  2. {
  3.     BOOL bSuccess = FALSE;
  4.     PROCESS_BASIC_INFORMATION pbi;
  5.     TNtQueryInformationProcess pfnNtQueryInformationProcess = NULL;
  6.     TNtReadVirtualMemory pfnNtReadVirtualMemory = NULL;

  7.     pfnNtQueryInformationProcess = (TNtQueryInformationProcess)GetProcAddress(GetModuleHandle(_T("ntdll.dll")),"NtQueryInformationProcess");
  8.     pfnNtReadVirtualMemory = (TNtReadVirtualMemory)GetProcAddress(GetModuleHandle(_T("ntdll.dll")),"NtReadVirtualMemory");

  9.     if ( pfnNtQueryInformationProcess!=NULL ){
  10.         DWORD dwSize;
  11.         SIZE_T size;
  12.         int iReturn;
  13.         PVOID pAddrPEB = NULL;

  14.         iReturn = pfnNtQueryInformationProcess( hProcess,ProcessBasicInformation,&pbi,sizeof(pbi),&dwSize);
  15.         pAddrPEB = pbi.PebBaseAddress;     

  16.         // NtQueryInformationProcess returns a negative value if it fails
  17.         if (iReturn >= 0) {
  18.             // 1. Find the Process Environment Block
  19.             __PEB PEB;
  20.             size = dwSize;
  21.             if ( ERROR_SUCCESS != pfnNtReadVirtualMemory(hProcess, pAddrPEB, &PEB, sizeof(PEB), &size) ) {
  22.                 // Call GetLastError() if you need to know why
  23.                 return bSuccess;
  24.             }

  25.             // 2. From this PEB, get the address of the block containing
  26.             // a pointer to the CmdLine
  27.             _RTL_USER_PROCESS_PARAMETERS stBlock;
  28.             if ( ERROR_SUCCESS != pfnNtReadVirtualMemory(hProcess, (LPVOID)PEB.ProcessParameters, &stBlock, sizeof(stBlock), &size)) {
  29.                 // Call GetLastError() if you need to know why
  30.                 return bSuccess;
  31.             }

  32.             // 3. Get the CurDir
  33.             wchar_t wszCurDir[MAX_PATH+1];
  34.             if ( ERROR_SUCCESS != pfnNtReadVirtualMemory(hProcess, (LPVOID)stBlock.DosPath.Buffer,
  35.                 wszCurDir, stBlock.DosPath.Length*sizeof(wchar_t), &size)) {
  36.                     // Call GetLastError() if you need to know why
  37.                     return bSuccess;
  38.             }

  39. #ifdef UNICODE
  40.             // Both strings are in UNICODE.
  41.             strCurDir.assign(wszCurDir);
  42. #else
  43.             CHAR szCurDir[MAX_PATH+1];
  44.             WideCharToMultiByte(CP_ACP,0,wszCurDir,size/sizeof(wchar_t),szCurDir,MAX_PATH,NULL,NULL);
  45.             strCurDir.assign(szCurDir);
  46. #endif
  47.             bSuccess = TRUE;
  48.         }
  49.     }
  50.     return bSuccess;
  51. }


  52. BOOL GetProcessCurDir64(HANDLE hProcess,mystring&strCurDir)
  53. {
  54.     BOOL bSuccess = FALSE;
  55.     PROCESS_BASIC_INFORMATION64 pbi64;
  56.     TNtQueryInformationProcess pfnNtQueryInformationProcess = NULL;
  57.     TNtReadVirtualMemory64 pfnNtReadVirtualMemory = NULL;

  58.     pfnNtQueryInformationProcess = (TNtQueryInformationProcess)GetProcAddress(GetModuleHandle(_T("ntdll.dll")),"NtWow64QueryInformationProcess64");
  59.     pfnNtReadVirtualMemory = (TNtReadVirtualMemory64)GetProcAddress(GetModuleHandle(_T("ntdll.dll")),"NtWow64ReadVirtualMemory64");

  60.     if ( pfnNtQueryInformationProcess!=NULL ){
  61.         DWORD dwSize;
  62.         UINT64 size;
  63.         int iReturn;
  64.         PVOID64 pAddrPEB = NULL;
  65.         
  66.         iReturn = pfnNtQueryInformationProcess( hProcess,ProcessBasicInformation,&pbi64,sizeof(pbi64),&dwSize);
  67.         pAddrPEB = pbi64.PebBaseAddress;

  68.         // NtQueryInformationProcess returns a negative value if it fails
  69.         if (iReturn >= 0) {
  70.             // 1. Find the Process Environment Block
  71.             __PEB64 PEB;
  72.             size = dwSize;
  73.             if ( ERROR_SUCCESS != pfnNtReadVirtualMemory(hProcess, pAddrPEB, &PEB, sizeof(PEB), &size) ) {
  74.                 // Call GetLastError() if you need to know why
  75.                 return bSuccess;
  76.             }

  77.             // 2. From this PEB, get the address of the block containing
  78.             // a pointer to the CmdLine
  79.             _RTL_USER_PROCESS_PARAMETERS64 stBlock;
  80.             if ( ERROR_SUCCESS != pfnNtReadVirtualMemory(hProcess, PEB.ProcessParameters, &stBlock, sizeof(stBlock),&size)) {
  81.                 // Call GetLastError() if you need to know why
  82.                 return bSuccess;
  83.             }

  84.             // 3. Get the CurDir
  85.             wchar_t wszCurDir[MAX_PATH+1];
  86.             if ( ERROR_SUCCESS != pfnNtReadVirtualMemory(hProcess, stBlock.DosPath.Buffer,
  87.                 wszCurDir, stBlock.DosPath.Length*sizeof(wchar_t), &size)) {
  88.                     // Call GetLastError() if you need to know why
  89.                     return bSuccess;
  90.             }

  91. #ifdef UNICODE
  92.             // Both strings are in UNICODE.
  93.             strCurDir.assign(wszCurDir);
  94. #else
  95.             CHAR szCurDir[MAX_PATH+1];
  96.             WideCharToMultiByte(CP_ACP,0,wszCurDir,size/sizeof(wchar_t),szCurDir,MAX_PATH,NULL,NULL);
  97.             strCurDir.assign(szCurDir);
  98. #endif
  99.             bSuccess = TRUE;
  100.         }
  101.     }
  102.     return bSuccess;
  103. }


  104. BOOL GetProcessCmdLine(HANDLE hProcess,mystring&strCmdLine)
  105. {
  106.     BOOL bSuccess = FALSE;
  107.     PROCESS_BASIC_INFORMATION pbi;
  108.     TNtQueryInformationProcess pfnNtQueryInformationProcess = NULL;
  109.     TNtReadVirtualMemory pfnNtReadVirtualMemory = NULL;

  110.     pfnNtQueryInformationProcess = (TNtQueryInformationProcess)GetProcAddress(GetModuleHandle(_T("ntdll.dll")),"NtQueryInformationProcess");
  111.     pfnNtReadVirtualMemory = (TNtReadVirtualMemory)GetProcAddress(GetModuleHandle(_T("ntdll.dll")),"NtReadVirtualMemory");

  112.     if ( pfnNtQueryInformationProcess!=NULL ){
  113.         DWORD dwSize;
  114.         SIZE_T size;
  115.         int iReturn;
  116.         PVOID pAddrPEB = NULL;

  117.         iReturn = pfnNtQueryInformationProcess( hProcess,ProcessBasicInformation,&pbi,sizeof(pbi),&dwSize);
  118.         pAddrPEB = pbi.PebBaseAddress;

  119.         // NtQueryInformationProcess returns a negative value if it fails
  120.         if (iReturn >= 0) {
  121.             // 1. Find the Process Environment Block
  122.             __PEB PEB;
  123.             size = dwSize;
  124.             if ( ERROR_SUCCESS != pfnNtReadVirtualMemory(hProcess, pAddrPEB, &PEB, sizeof(PEB), &size) ) {
  125.                 // Call GetLastError() if you need to know why
  126.                 return bSuccess;
  127.             }

  128.             // 2. From this PEB, get the address of the block containing
  129.             // a pointer to the CmdLine
  130.             _RTL_USER_PROCESS_PARAMETERS Block;
  131.             if ( ERROR_SUCCESS != pfnNtReadVirtualMemory(hProcess, (LPVOID)PEB.ProcessParameters, &Block, sizeof(Block), &size)) {
  132.                     // Call GetLastError() if you need to know why
  133.                     return(FALSE);
  134.             }

  135.             // 3. Get the CmdLine
  136.             wchar_t wszCmdLine[MAX_PATH+1] = {0};
  137.             if ( ERROR_SUCCESS != pfnNtReadVirtualMemory(hProcess, (LPVOID)Block.CmdLine.Buffer,
  138.                 wszCmdLine, MAX_PATH*sizeof(wchar_t), &size)) {
  139.                     // Call GetLastError() if you need to know why
  140.                     return(FALSE);
  141.             }

  142.             // 4. Skip the application pathname
  143.             //    it can be empty, "c:\...\app.exe" or c:\...\app.exe
  144.             wchar_t* pPos = wszCmdLine;
  145.             if (*pPos != L'\0') {
  146.                 if (*pPos == L'"') {
  147.                     // Find the next " character
  148.                     pPos = wcschr(&pPos[1], L'"');
  149.                 } else {
  150.                     // Find the next SPACE character
  151.                     pPos = wcschr(&pPos[1], L'');
  152.                 }

  153.                 // Skip it
  154.                 if (pPos != NULL)
  155.                     pPos++;
  156.             }

  157.             // Copy it back
  158.             if (pPos != NULL) {

  159.                 if (*pPos != L'\0') {
  160. #ifdef UNICODE
  161.                     // Both strings are in UNICODE.
  162.                     strCmdLine.assign(wszCmdLine);
  163. #else
  164.                     CHAR szCmdLine[MAX_PATH+1] = {0};
  165.                     WideCharToMultiByte(CP_ACP,0,wszCmdLine,size/sizeof(wchar_t),szCmdLine,MAX_PATH,NULL,NULL);
  166.                     strCmdLine = szCmdLine;
  167. #endif
  168.                     bSuccess = TRUE;
  169.                 }
  170.             }
  171.         }
  172.     }
  173.     return bSuccess;
  174. }


  175. BOOL GetProcessCmdLine64(HANDLE hProcess,mystring&strCmdLine)
  176. {
  177.     BOOL bSuccess = FALSE;
  178.     PROCESS_BASIC_INFORMATION64 pbi64;
  179.     TNtQueryInformationProcess pfnNtQueryInformationProcess = NULL;
  180.     TNtReadVirtualMemory64 pfnNtReadVirtualMemory = NULL;

  181.     pfnNtQueryInformationProcess = (TNtQueryInformationProcess)GetProcAddress(GetModuleHandle(_T("ntdll.dll")),"NtWow64QueryInformationProcess64");
  182.     pfnNtReadVirtualMemory = (TNtReadVirtualMemory64)GetProcAddress(GetModuleHandle(_T("ntdll.dll")),"NtWow64ReadVirtualMemory64");

  183.     if ( pfnNtQueryInformationProcess!=NULL ){
  184.         DWORD dwSize;
  185.         UINT64 size;
  186.         int iReturn;
  187.         PVOID64 pAddrPEB = NULL;

  188.         iReturn = pfnNtQueryInformationProcess( hProcess,ProcessBasicInformation,&pbi64,sizeof(pbi64),&dwSize);
  189.         pAddrPEB = pbi64.PebBaseAddress;

  190.         // NtQueryInformationProcess returns a negative value if it fails
  191.         if (iReturn >= 0) {
  192.             // 1. Find the Process Environment Block
  193.             __PEB64 PEB;
  194.             size = dwSize;
  195.             if ( ERROR_SUCCESS != pfnNtReadVirtualMemory(hProcess, pAddrPEB, &PEB, sizeof(PEB), &size) ) {
  196.                 // Call GetLastError() if you need to know why
  197.                 return bSuccess;
  198.             }

  199.             // 2. From this PEB, get the address of the block containing
  200.             // a pointer to the CmdLine
  201.             _RTL_USER_PROCESS_PARAMETERS64 stBlock;
  202.             if ( ERROR_SUCCESS != pfnNtReadVirtualMemory(hProcess, (LPVOID)PEB.ProcessParameters, &stBlock, sizeof(stBlock), &size)) {
  203.                 // Call GetLastError() if you need to know why
  204.                 return(FALSE);
  205.             }

  206.             // 3. Get the CmdLine
  207.             wchar_t wszCmdLine[MAX_PATH+1] = {0};
  208.             if ( ERROR_SUCCESS != pfnNtReadVirtualMemory(hProcess, (LPVOID)stBlock.CmdLine.Buffer,
  209.                 wszCmdLine, MAX_PATH*sizeof(wchar_t), &size)) {
  210.                     // Call GetLastError() if you need to know why
  211.                     return(FALSE);
  212.             }

  213.             // 4. Skip the application pathname
  214.             //    it can be empty, "c:\...\app.exe" or c:\...\app.exe
  215.             wchar_t* pPos = wszCmdLine;
  216.             if (*pPos != L'\0') {
  217.                 if (*pPos == L'"') {
  218.                     // Find the next " character
  219.                     pPos = wcschr(&pPos[1], L'"');
  220.                 } else {
  221.                     // Find the next SPACE character
  222.                     pPos = wcschr(&pPos[1], L'');
  223.                 }

  224.                 // Skip it
  225.                 if (pPos != NULL)
  226.                     pPos++;
  227.             }

  228.             // Copy it back
  229.             if (pPos != NULL) {

  230.                 if (*pPos != L'\0') {
  231. #ifdef UNICODE
  232.                     // Both strings are in UNICODE.
  233.                     strCmdLine.assign(wszCmdLine);
  234. #else
  235.                     CHAR szCmdLine[MAX_PATH+1] = {0};
  236.                     WideCharToMultiByte(CP_ACP,0,wszCmdLine,size/sizeof(wchar_t),szCmdLine,MAX_PATH,NULL,NULL);
  237.                     strCmdLine.assign(szCmdLine);

  238. #endif
  239.                     bSuccess = TRUE;
  240.                 }
  241.             }
  242.         }
  243.     }
  244.     return bSuccess;
  245. }


  246. #include <TlHelp32.h>
  247. #include <winternl.h>   // for Windows internal declarations.
  248. #include "Toolhelp/Toolhelp.h"

  249. //////////////////////////////////////////////////////////////////////////
  250. #define WOW64

  251. #ifdef _UNICODE
  252. #define mystring wstring
  253. #else
  254. #define mystring string
  255. #endif

  256. typedef struct
  257. {
  258.     DWORD Filler[4];
  259.     DWORD ProcessParameters;
  260. } __PEB;

  261. typedef struct
  262. {
  263.     PVOID64 Filler[4];
  264.     PVOID64 ProcessParameters;
  265. } __PEB64;

  266. //
  267. // Current Directory Structures
  268. //
  269. typedef struct
  270. {
  271.     UNICODE_STRING DosPath;
  272.     HANDLE Handle;
  273. }_CURDIR;

  274. typedef struct _UNICODE_STRING64 {
  275.     SHORT Length;
  276.     SHORT MaximumLength;
  277.     DWORD Fill;
  278.     PVOID64  Buffer;
  279. } UNICODE_STRING64;

  280. typedef struct
  281. {
  282.     DWORD MaximumLength;
  283.     DWORD Length;
  284.     DWORD Flags;
  285.     DWORD DebugFlags;
  286.     PVOID ConsoleHandle;
  287.     DWORD ConsoleFlags;
  288.     PVOID StandardInput;
  289.     PVOID StandardOutput;
  290.     PVOID StandardError;
  291.     //////////////////////////
  292.     UNICODE_STRING DosPath;    //CurrentDirectory
  293.     HANDLE Handle;
  294.     //////////////////////////
  295.     UNICODE_STRING DllPath;
  296.     UNICODE_STRING ImagePathName;
  297.     UNICODE_STRING CmdLine;
  298.     //……
  299. }_RTL_USER_PROCESS_PARAMETERS;

  300. typedef struct
  301. {
  302.     DWORD MaximumLength;
  303.     DWORD Length;
  304.     DWORD Flags;
  305.     DWORD DebugFlags;
  306.     PVOID64 ConsoleHandle;
  307.     DWORD ConsoleFlags;
  308.     PVOID64 StandardInput;
  309.     PVOID64 StandardOutput;
  310.     PVOID64 StandardError;
  311.     //////////////////////////
  312.     UNICODE_STRING64 DosPath;//CurrentDirectory
  313.     HANDLE Handle;
  314.     //////////////////////////
  315.     UNICODE_STRING64 DllPath;
  316.     UNICODE_STRING64 ImagePathName;
  317.     UNICODE_STRING64 CmdLine;
  318.     //……
  319. }_RTL_USER_PROCESS_PARAMETERS64;



  320. // end_ntddk end_ntifs
  321. typedef struct _PROCESS_BASIC_INFORMATION64 {
  322.     PVOID64 Reserved1;
  323.     PVOID64 PebBaseAddress;
  324.     PVOID64 Reserved2[2];
  325.     PVOID64 UniqueProcessId;
  326.     PVOID64 Reserved3;
  327. } PROCESS_BASIC_INFORMATION64,*PPROCESS_BASIC_INFORMATION64;

  328. typedef LONG (WINAPI *TNtQueryInformationProcess)(HANDLE,UINT,PVOID,ULONG,PULONG);
  329. typedef LONG (WINAPI *TNtReadVirtualMemory)(HANDLE ProcessHandle, PVOID BaseAddress, PVOID Buffer, ULONG NumberOfBytesToRead, PULONG NumberOfBytesReaded);
  330. typedef LONG (WINAPI *TNtReadVirtualMemory64)(HANDLE ProcessHandle, PVOID64 BaseAddress, PVOID Buffer, UINT64 NumberOfBytesToRead, PUINT64 NumberOfBytesReaded);
  331. //////////////////////////////////////////////////////////////////////////


  332. typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);

  333. BOOL IsWow64()
  334. {
  335.     BOOL bIsWow64 = FALSE;

  336.     LPFN_ISWOW64PROCESS
  337.         fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(
  338.         GetModuleHandle("kernel32"),"IsWow64Process");

  339.     if (NULL != fnIsWow64Process)
  340.     {
  341.         if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
  342.         {
  343.             // handle error
  344.         }
  345.     }
  346.     return bIsWow64;
  347. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

天马阁|C/C++辅助教程|安卓逆向安全| 论坛导航|免责申明|Archiver||网站地图
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表天马阁立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2010-2021 All Right Reserved.
快速回复 返回顶部 返回列表