找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 5362|回复: 1

【C】wow64函数的简单操作实例

[复制链接]
发表于 2017-3-16 00:22:52 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
本帖最后由 Ayala 于 2017-3-16 16:08 编辑

  1. #include <ntdef.h>
  2. #include <ntddk.h>

  3. #pragma comment(lib,"kernel32.lib")
  4. #pragma comment(lib,"ntdll.lib")

  5. #ifndef GetProcAddress
  6. __int32 __stdcall GetProcAddress(hModule,lpProcName);
  7. #endif
  8. #ifndef GetModuleHandle
  9. __int32 __stdcall GetModuleHandleA(lpMoudleName);
  10. __int32 __stdcall GetModuleHandleW(lpMoudleName);
  11. #if !defined(_UNICODE) && !defined(_UNICODE_)
  12. #define GetModuleHandle GetModuleHandleA
  13. #else
  14. #define GetModuleHandle GetModuleHandleW
  15. #endif
  16. #endif


  17. /*
  18. PROCESS_BASIC_INFORMATION_WOW64 struc
  19.         Reserved1                 Qword ?
  20.         struc PebBaseAddress
  21.                 lo dword ?
  22.                 hi  dword ?
  23.         ends
  24.         Reserved2                Qword ?
  25.         Reserved3                Qword ?
  26.         UniqueProcessId Qword ?
  27.         Reserved4                Qword ?
  28. PROCESS_BASIC_INFORMATION_WOW64 ends
  29. MEMORY_BASIC_INFORMATION_WOW64 struc
  30.         BaseAddress                 QWORD ?
  31.         AllocationBase                 QWORD ?
  32.         AllocationProtect   DWORD ?
  33.                                                 DWORD ?
  34.         RegionSize                        QWORD ?
  35.         State                                DWORD ?
  36.         Protect                                DWORD ?
  37.         _Type                                DWORD ?
  38.                                                 DWORD ?
  39. MEMORY_BASIC_INFORMATION_WOW64 ends
  40. */
  41. #pragma pack(show)
  42. #pragma pack(push,8)
  43. typedef struct _PROCESS_BASIC_INFORMATION_WOW64{
  44.     NTSTATUS ExitStatus;
  45.     __int64  PebBaseAddress;
  46.     __int64  AffinityMask;
  47.     __int64  BasePriority;
  48.     __int64  UniqueProcessId;
  49.     __int64  InheritedFromUniqueProcessId;
  50. }PROCESS_BASIC_INFORMATION_WOW64,*PPROCESS_BASIC_INFORMATION_WOW64;

  51. typedef struct _MEMORY_BASIC_INFORMATION_WOW64{
  52.     __int64 BaseAddress;
  53.     __int64 AllocationBase;
  54.     __int32 AllocationProtect;
  55.     //__int32 align_8;
  56.         __int64 RegionSize;
  57.     __int32 State;
  58.     __int32 Protect;
  59.     __int32 Type;
  60.         //__int32 _ali;
  61. }MEMORY_BASIC_INFORMATION_WOW64,*PMEMORY_BASIC_INFORMATION_WOW64;

  62. #ifndef MEMORY_INFORMATION_CLASS
  63. typedef enum _MEMORY_INFORMATION_CLASS{
  64.         MemoryBasicInformation,
  65.        
  66.         //...
  67.         MaxMemoryInfoClass
  68. }MEMORY_INFORMATION_CLASS;       
  69.        
  70. #endif
  71. #pragma pack(pop)

  72. typedef NTSTATUS(
  73. NTAPI
  74. *_imp__NtWow64QueryInformationProcess64)(
  75.     IN HANDLE ProcessHandle,
  76.     IN PROCESSINFOCLASS ProcessInformationClass,
  77.     OUT PVOID ProcessInformation64,
  78.     IN ULONG Length,
  79.     OUT PULONG ReturnLength OPTIONAL
  80.     );
  81. typedef NTSTATUS(
  82. NTAPI
  83. *_imp__NtWow64QueryVirtualMemory64)(
  84.     IN HANDLE ProcessHandle,
  85.         IN PVOID64 BaseAddress,
  86.     /*IN PVOID BaseAddressLow,
  87.     IN PVOID BaseAddressHigh,*/
  88.     IN MEMORY_INFORMATION_CLASS MemoryInformationClass,
  89.     OUT PVOID MemoryInformation, /* NB must be 64bit aligned */
  90.     IN ULONG64 Length,
  91.         /*IN ULONG LengthLow,
  92.     IN ULONG LengthHigh,*/
  93.     OUT PULONGLONG ReturnLength OPTIONAL
  94.     );
  95. typedef NTSTATUS(
  96. NTAPI
  97. *_imp__NtWow64ReadVirtualMemory64)(
  98.     IN HANDLE ProcessHandle,
  99.         IN PVOID64 Address,
  100.     /*IN PVOID AddressLow,
  101.     IN PVOID AddressHigh,*/
  102.     OUT PVOID Buffer,
  103.         IN ULONG64 BufferSize,
  104.     /*IN ULONG BufferSizeLow,
  105.     IN ULONG BufferSizeHigh,*/
  106.     OUT PULONGLONG BytesRead OPTIONAL
  107.     );
  108. typedef NTSTATUS(
  109. NTAPI
  110. *_imp__NtWow64WriteVirtualMemory64)(
  111.     IN HANDLE ProcessHandle,
  112.     IN PVOID AddressLow,
  113.     IN PVOID AddressHigh,
  114.     IN PVOID Buffer,
  115.     IN ULONG BufferSizeLow,
  116.     IN ULONG BufferSizeHigh,
  117.     OUT PULONGLONG BytesWritten OPTIONAL
  118.     );

  119. typedef struct _delayload_t{
  120.         __int32                 modbase;
  121.         char *                  modname;
  122.         struct{
  123.                 __int32 pb;
  124.                 char *  pn;
  125.         }fp[];
  126. }delayload_t,*delayload_p;


  127. int __delayload(delayload_t* lt)
  128. {
  129.         int ret=0,i=0;
  130.        
  131.         lt->modbase = GetModuleHandle(lt->modname);
  132.         if (!lt->modbase) goto done;
  133.        
  134.         while (lt->fp[i].pn)
  135.         {
  136.                 lt->fp[i].pb=GetProcAddress(lt->modbase,lt->fp[i].pn);
  137.                 if (!lt->fp[i].pb) goto done;
  138.                 i++;
  139.         }
  140.         ret=1;
  141. done:       
  142.         return ret;
  143. }

  144. delayload_t imp_ntdll =        {0,\
  145.                                                 "ntdll.dll",\
  146.                                                         {
  147. #define NtWow64QueryInformationProcess64 ((_imp__NtWow64QueryInformationProcess64)(imp_ntdll.fp[0].pb))
  148.                                                                 {
  149.                                                                         0,\
  150.                                                                         "NtWow64QueryInformationProcess64"
  151.                                                                 },
  152. #define NtWow64QueryVirtualMemory64 ((_imp__NtWow64QueryVirtualMemory64)(imp_ntdll.fp[1].pb))
  153.                                                                 {
  154.                                                                         0,\
  155.                                                                         "NtWow64QueryVirtualMemory64"
  156.                                                                 },
  157. #define NtWow64ReadVirtualMemory64 ((_imp__NtWow64ReadVirtualMemory64)(imp_ntdll.fp[2].pb))
  158.                                                                 {
  159.                                                                         0,\
  160.                                                                         "NtWow64ReadVirtualMemory64"
  161.                                                                 },
  162. #define NtWow64WriteVirtualMemory64 ((_imp__NtWow64WriteVirtualMemory64)(imp_ntdll.fp[3].pb))
  163.                                                                 {
  164.                                                                         0,\
  165.                                                                         "NtWow64WriteVirtualMemory64"
  166.                                                                 },
  167.                                                                 {
  168.                                                                         0,\
  169.                                                                         0
  170.                                                                 }
  171.                                                         }
  172.                                                 };

  173. int main()
  174. {
  175.         __declspec(align(8)) PROCESS_BASIC_INFORMATION_WOW64  pbi={0};
  176.         __declspec(align(8)) MEMORY_BASIC_INFORMATION_WOW64         pbm={0};
  177.         __declspec(align(8)) char outbuffer[PAGE_SIZE];
  178.        
  179.         __int64        dwbytes;
  180.         NTSTATUS        Status;
  181.         HANDLE                ProcessHandle;
  182.         OBJECT_ATTRIBUTES oa;
  183.         CLIENT_ID         ClientId={0};
  184.        
  185.         __delayload(&imp_ntdll);
  186.        
  187.         while (1)
  188.         {
  189.                 printf("process id=");
  190.                 scanf("%d",&ClientId.UniqueProcess);
  191.                
  192.                 InitializeObjectAttributes( &oa, NULL, 0, NULL, NULL );
  193.                 Status=ZwOpenProcess(&ProcessHandle,\
  194.                                                                 PROCESS_ALL_ACCESS,\
  195.                                                                 &oa,\
  196.                                                                 &ClientId);
  197.                 if (!NT_SUCCESS(Status)) {

  198.                         printf("OpenProcess failed 0x%lx\n",Status);
  199.                         continue;
  200.                 }
  201.                
  202.                 Status=NtWow64QueryInformationProcess64(ProcessHandle,\
  203.                                                                                                 ProcessBasicInformation,\
  204.                                                                                                 &pbi,\
  205.                                                                                                 sizeof(pbi),\
  206.                                                                                                 (PULONG)&dwbytes);
  207.                 if (!NT_SUCCESS(Status)) {

  208.                         printf("NtWow64QueryInformationProcess64 failed 0x%lx\n",Status);
  209.                         goto done;
  210.                 }
  211.                 printf("procss %d peb base=0x%llX\n",ClientId.UniqueProcess,pbi.PebBaseAddress);
  212.                                
  213.                
  214.                 Status=NtWow64QueryVirtualMemory64(ProcessHandle,\
  215.                                                                                         (PVOID64)pbi.PebBaseAddress,\
  216.                                                                                         MemoryBasicInformation,\
  217.                                                                                         &pbm,\
  218.                                                                                         (ULONG64)sizeof(pbm),\
  219.                                                                                         (PULONGLONG)&dwbytes);
  220.                 if (!NT_SUCCESS(Status)) {

  221.                         printf("NtWow64QueryVirtualMemory64 failed 0x%lx\n",Status);
  222.                         goto done;
  223.                 }
  224.                 // do nothing;
  225.                
  226.                 printf("base=0x%llx size=%lld\n",pbm.BaseAddress,pbm.RegionSize);
  227.                
  228.                
  229.                 Status=NtWow64ReadVirtualMemory64(ProcessHandle,\
  230.                                                                                         (PVOID64)pbi.PebBaseAddress,\
  231.                                                                                         &outbuffer,\
  232.                                                                                         (ULONG64)sizeof(outbuffer),\
  233.                                                                                         (PULONGLONG)&dwbytes);
  234.                 if (!NT_SUCCESS(Status)) {

  235.                         printf("NtWow64ReadVirtualMemory64 failed 0x%lx\n",Status);
  236.                         goto done;
  237.                 }
  238.                 // do nothing;
  239.                 printf("tRead=%lld, rRead=%lld\n",(ULONG64)sizeof(outbuffer),(ULONG64)dwbytes);
  240. done:               
  241.                 Status=ZwClose(ProcessHandle);
  242.         }

  243.         system("pause");
  244.         return 0;
  245. }
复制代码
回复

使用道具 举报

发表于 2017-3-22 20:29:29 | 显示全部楼层
回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-12-4 01:45 , Processed in 0.034309 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表