|
| 1 | +-------------------------------------------------------------------------------- |
| 2 | +Name....: WOW64Ext Library |
| 3 | +Author..: ReWolf |
| 4 | +Rel.Date: 12.I.2012 |
| 5 | +Update..: 18.I.2017 |
| 6 | +Version.: 1.0.0.9 |
| 7 | + |
| 8 | + |
| 9 | + |
| 10 | +www.....: http://blog.rewolf.pl |
| 11 | +-------------------------------------------------------------------------------- |
| 12 | + |
| 13 | +WOW64Ext is a helper library for x86 programs that runs under WOW64 layer on |
| 14 | +x64 versions of Microsoft Windows operating systems. It enables x86 applications |
| 15 | +to read, write and enumerate memory of a native x64 applications. There is also |
| 16 | +possibility to call any x64 function from 64-bits version of NTDLL through |
| 17 | +a special function called X64Call(). As a bonus, wow64ext.h contains definitions |
| 18 | +of some structures that might be useful for programs that want to access PEB, |
| 19 | +TEB, TIB etc. |
| 20 | + |
| 21 | +Sample application that uses this library can be found in \sample\ directory, it |
| 22 | +is simple memory dumper. |
| 23 | + |
| 24 | +-------------------------------------------------------------------------------- |
| 25 | + |
| 26 | +Functions: |
| 27 | + |
| 28 | +-------------------------------------------------------------------------------- |
| 29 | + |
| 30 | +DWORD64 X64Call(DWORD64 func, int argC, ...); |
| 31 | + |
| 32 | +Low level function that can call any x64 API from NTDLL. |
| 33 | + |
| 34 | +func - address of x64 function, can be obtained by GetProcAddress64() |
| 35 | +argC - number of arguments that will be passed to the 'func' |
| 36 | +... - rest of arguments for 'func', all values should be casted to DWORD64 |
| 37 | + |
| 38 | +-------------------------------------------------------------------------------- |
| 39 | + |
| 40 | +DWORD64 GetModuleHandle64(wchar_t* lpModuleName); |
| 41 | + |
| 42 | +Behaviour similar to x86 version of GetModuleHandle, but it looks for the module |
| 43 | +name in the list of loaded x64 libraries. Usually x86 processes under WOW64 |
| 44 | +layer have four x64 libraries: ntdll.dll, wow64.dll, wow64cpu.dll and |
| 45 | +wow64win.dll |
| 46 | + |
| 47 | +lpModuleName - unicode string that represents module name |
| 48 | + |
| 49 | +-------------------------------------------------------------------------------- |
| 50 | + |
| 51 | +DWORD64 GetProcAddress64(DWORD64 hModule, char* funcName); |
| 52 | + |
| 53 | +Behaviour similar to x86 version of GetProcAddress(), internally it uses x64 |
| 54 | +version of LdrGetProcedureAddress() from NTDLL. |
| 55 | + |
| 56 | +hModule - base of x64 module |
| 57 | +funcName - function name |
| 58 | + |
| 59 | +-------------------------------------------------------------------------------- |
| 60 | + |
| 61 | +SIZE_T VirtualQueryEx64(HANDLE hProcess, DWORD64 lpAddress, |
| 62 | + MEMORY_BASIC_INFORMATION64* lpBuffer, SIZE_T dwLength) |
| 63 | + |
| 64 | +Behaviour similar to x86 version of VirtualQueryEx(), internally it uses x64 |
| 65 | +version of NtQueryVirtualMemory() from NTDLL. |
| 66 | + |
| 67 | +hProcess - handle of the process, can be obtained by standard x86 version of |
| 68 | + OpenProcess() function |
| 69 | +lpAddress - base address of the region of pages to be queried |
| 70 | +lpBuffer - a pointer to a MEMORY_BASIC_INFORMATION64 structure, it is defined |
| 71 | + in the standard SDK headers |
| 72 | +dwLength - size of the buffer pointed to by the lpBuffer parameter |
| 73 | + |
| 74 | +-------------------------------------------------------------------------------- |
| 75 | + |
| 76 | +DWORD64 VirtualAllocEx64(HANDLE hProcess, DWORD64 lpAddress, SIZE_T dwSize, |
| 77 | + DWORD flAllocationType, DWORD flProtect) |
| 78 | + |
| 79 | +Behaviour similar to x86 version of VirtualAllocEx64(), internally it uses x64 |
| 80 | +version of NtAllocateVirtualMemory() from NTDLL. |
| 81 | + |
| 82 | +hProcess - handle of the process, can be obtained by standard x86 |
| 83 | + version of OpenProcess() function |
| 84 | +lpAddress - desired base address of the region that will be allocated |
| 85 | +dwSize - size of the region that will be allocated |
| 86 | +flAllocationType - type of memory allocation |
| 87 | +flProtect - memory protection for the region |
| 88 | + |
| 89 | +-------------------------------------------------------------------------------- |
| 90 | + |
| 91 | +BOOL VirtualFreeEx64(HANDLE hProcess, DWORD64 lpAddress, SIZE_T dwSize, |
| 92 | + DWORD dwFreeType) |
| 93 | + |
| 94 | +Behaviour similar to x86 version of VirtualFreeEx64(), internally it uses x64 |
| 95 | +version of NtFreeVirtualMemory() from NTDLL. |
| 96 | + |
| 97 | +hProcess - handle of the process, can be obtained by standard x86 version of |
| 98 | + OpenProcess() function |
| 99 | +lpAddress - base address of the memory region to free |
| 100 | +dwSize - size (in bytes) of the memory region to free |
| 101 | +dwFreeType - type of free operation (MEM_RELEASE, MEM_DECOMMIT) |
| 102 | + |
| 103 | +-------------------------------------------------------------------------------- |
| 104 | + |
| 105 | +BOOL VirtualProtectEx64(HANDLE hProcess, DWORD64 lpAddress, SIZE_T dwSize, |
| 106 | + DWORD flNewProtect, DWORD* lpflOldProtect); |
| 107 | + |
| 108 | +Behaviour similar to x86 version of VirtualProtectEx64(), internally it uses |
| 109 | +x64 version of NtProtectVirtualMemory() from NTDLL. |
| 110 | + |
| 111 | +hProcess - handle of the process, can be obtained by standard x86 |
| 112 | + version of OpenProcess() function |
| 113 | +lpAddress - base address of the memory region that will have changed |
| 114 | + protection |
| 115 | +dwSize - size (in bytes) of the memory region that will have changed |
| 116 | + protection |
| 117 | +flNewProtect - the memory protection option (see MSDN) |
| 118 | +lpflOldProtect - pointer to the variable that receives old protection value |
| 119 | + |
| 120 | +-------------------------------------------------------------------------------- |
| 121 | + |
| 122 | +BOOL ReadProcessMemory64(HANDLE hProcess, DWORD64 lpBaseAddress, |
| 123 | + LPVOID lpBuffer, SIZE_T nSize, |
| 124 | + SIZE_T *lpNumberOfBytesRead); |
| 125 | + |
| 126 | +Behaviour similar to x86 version of ReadProcessMemory(), internally it uses x64 |
| 127 | +version of NtReadVirtualMemory() from NTDLL. |
| 128 | + |
| 129 | +hProcess - handle of the process, can be obtained by standard x86 |
| 130 | + version of OpenProcess() function |
| 131 | +lpBaseAddress - base address of the region that will be read |
| 132 | +lpBuffer - output memory buffer for the read data |
| 133 | +nSize - number of bytes to be read |
| 134 | +lpNumberOfBytesRead - pointer to a variable that receives number of read bytes |
| 135 | + |
| 136 | +-------------------------------------------------------------------------------- |
| 137 | + |
| 138 | +BOOL WriteProcessMemory64(HANDLE hProcess, DWORD64 lpBaseAddress, |
| 139 | + LPVOID lpBuffer, SIZE_T nSize, |
| 140 | + SIZE_T *lpNumberOfBytesWritten); |
| 141 | + |
| 142 | +Behaviour similar to x86 version of WriteProcessMemory(), internally it uses x64 |
| 143 | +version of NtWriteVirtualMemory() from NTDLL. |
| 144 | + |
| 145 | +hProcess - handle of the process, can be obtained by standard x86 |
| 146 | + version of OpenProcess() function |
| 147 | +lpBaseAddress - base address of the region that will be written |
| 148 | +lpBuffer - input memory buffer with the data to write |
| 149 | +nSize - number of bytes that will be written |
| 150 | +lpNumberOfBytesRead - pointer to variable that receives number of written bytes |
| 151 | + |
| 152 | +-------------------------------------------------------------------------------- |
| 153 | + |
| 154 | +BOOL GetThreadContext64(HANDLE hThread, _CONTEXT64* lpContext); |
| 155 | + |
| 156 | +Behaviour similar to x86 version of GetThreadContext(), internally it uses x64 |
| 157 | +version of NtGetContextThread() from NTDLL. Definition of _CONTEXT64 can be |
| 158 | +found in wow64ext.h file. |
| 159 | + |
| 160 | +hThread - handle of the process, can be obtained by standard x86 |
| 161 | + version of OpenProcess() function |
| 162 | +lpContext - A pointer to a _CONTEXT64 structure that will receive |
| 163 | + context data from specified thread. Structure will be |
| 164 | + filled according to ContextFlags field. |
| 165 | + |
| 166 | +-------------------------------------------------------------------------------- |
| 167 | + |
| 168 | +BOOL SetThreadContext64(HANDLE hThread, _CONTEXT64* lpContext); |
| 169 | + |
| 170 | +Behaviour similar to x86 version of SetThreadContext(), internally it uses x64 |
| 171 | +version of NtSetContextThread() from NTDLL. Definition of _CONTEXT64 can be |
| 172 | +found in wow64ext.h file. |
| 173 | + |
| 174 | +hThread - handle of the process, can be obtained by standard x86 |
| 175 | + version of OpenProcess() function |
| 176 | +lpContext - A pointer to a _CONTEXT64 structure that will be used |
| 177 | + to fill context data in specified thread. Structure will |
| 178 | + use only fields defined by ContextFlags. |
| 179 | + |
| 180 | +-------------------------------------------------------------------------------- |
0 commit comments