易语言教程_易语言源码_易语言视频教程_易语言论坛

 找回密码
 点击注册

Vip新手入门区
新手学习指南  学员作品展示 Vip课程总纲  Vip绝密课程系列

Vip相关下载区
Vip模块下载   Vip模块绑定   Vip模块例子 魔鬼插件下载  魔鬼插件例子  教程工具下载

Vip论坛服务区
教程问题提问区   模块问题提问区 技术交流区   魔鬼插件建议   忘记密码找回

VIP会员办理QQ: 8643245   
【请先加好友,然后到好友列表双击联系客服,办理VIP会员。】
【基础篇】易语言辅助入门基础教程
VIP模块办理QQ: 7189694 办理正版魔鬼作坊VIP模块 【基础篇】OD与CE入门基础教程
办理【终身VIP会员】“秒杀价” 仅需 RMB278.00元… 【基础篇】零基础绝密汇编语言入门课程 (共26课已完成)…
办理VIP详情…猛击这里查看详情 【基础篇】VIP辅助入门基础教程-新手必学 已发布10课 ……
VIP教程免费试看章节…猛击下载 【第1款】制作“辅助挂”教程目录查看(共107+16_x64下更新课已完成)…
亲爱的VIP学员,请到此写下你学习的感受与发布作品截图… 【第2款】制作“任务挂”教程目录查看(共77+1_x64下更新课已完成)…
卍解吧!不用bp send类封包断点找CALL的各种通杀思路 【第3款】驱动过保护技术课程(共38课已完成)…
【绝密教程】VIP绝密教程系列---注意:随时会更新! 【第4款】VIP邪恶二叉树辅助课程 (共31+17_x64下更新课已完成)…
【精品第13款】3D射击游戏与页游透视 智辅课程 已完成17课… 【第5款】零基础易语言按键辅助教程 (30课已完成)…
【精品第14款】变态功能辅助是如何炼成的 已完成36课… 【第6款】从零开始学习封包辅助技术教程(20课已完成) …
【精品第15款】DNF商业变态辅助的修炼之路 已完成27课… 【第7款】大杀特杀分析来源与CALL吸血鬼课程 (56课已完成)
【精品第16款】中控台多线程多开自动化商业辅助课程 已完成66课… 【第8款】完全零基础网页辅助课程(40课已完成)
【全新精品第17款】检测原理与过游戏内存检测技术课程 已发布9课… 【第9款】自动登录与操控LUA技术课程 (共46+8_x64下更新课已完成)…
【全新精品第18款】手游全自动化任务脚本辅助课程 已发布25课…… 【第10款】网页辅助封包脱机进阶课程 已完成30课…
【全新精品第19款】D3D方框骨骼透视与自瞄辅助课程进阶篇 已发布34课…… 【第11款】VC++ Lua脚本辅助课程 已完成112课…
【全新精品第20款】 X64模拟器吃鸡游戏方框透视自瞄辅助课程 发布中... 【第12款】网游脱机封包智辅课程 已完成35课…
查看: 1414|回复: 0

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

[复制链接]

9

主题

2

回帖

15

积分

编程入门

Rank: 1

魔鬼币
515
发表于 2018-1-2 14:15:26 | 显示全部楼层 |阅读模式

  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. }
复制代码
您需要登录后才可以回帖 登录 | 点击注册

本版积分规则

魔鬼作坊|易语言教程|易语言源码|易语言论坛|易语言视频教程| 论坛导航|免责申明|手机版||网站地图
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表魔鬼作坊立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2010-2019 All Right Reserved.
快速回复 返回顶部 返回列表