diff options
| author | serpilliere <serpilliere@users.noreply.github.com> | 2020-05-18 17:05:57 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-05-18 17:05:57 +0200 |
| commit | b449b5d20f1ecd4781b4e6b890de281e6d719207 (patch) | |
| tree | f89dcafb2d595016661397f8770bf24781af4c7f | |
| parent | 9d73a9baa14e6062250a56a95182dc23de3ba779 (diff) | |
| parent | fc688ebdb7be469531a9ca62453a258fde11068d (diff) | |
| download | miasm-b449b5d20f1ecd4781b4e6b890de281e6d719207.tar.gz miasm-b449b5d20f1ecd4781b4e6b890de281e6d719207.zip | |
Merge pull request #1227 from Frky/master
Add hooks for EncodePointer and DecodePointer for Win32 x86 64 API
| -rw-r--r-- | miasm/os_dep/win_api_x86_32.py | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/miasm/os_dep/win_api_x86_32.py b/miasm/os_dep/win_api_x86_32.py index 67178f05..60588b59 100644 --- a/miasm/os_dep/win_api_x86_32.py +++ b/miasm/os_dep/win_api_x86_32.py @@ -157,6 +157,9 @@ class c_winobjs(object): self.cryptcontext_num = 0 self.cryptcontext = {} self.phhash_crypt_md5 = 0x55555 + # key used by EncodePointer and DecodePointer + # (kernel32) + self.ptr_encode_key = 0xabababab self.files_hwnd = {} self.windowlong_dw = 0x77700 self.module_cur_hwnd = 0x88800 @@ -420,6 +423,36 @@ def kernel32_CloseHandle(jitter): ret_ad, _ = jitter.func_args_stdcall(["hwnd"]) jitter.func_ret_stdcall(ret_ad, 1) +def kernel32_EncodePointer(jitter): + """ + PVOID EncodePointer( + _In_ PVOID Ptr + ); + + Encoding globally available pointers helps protect them from being + exploited. The EncodePointer function obfuscates the pointer value + with a secret so that it cannot be predicted by an external agent. + The secret used by EncodePointer is different for each process. + + A pointer must be decoded before it can be used. + + """ + ret, args = jitter.func_args_stdcall(1) + jitter.func_ret_stdcall(ret, args[0] ^ winobjs.ptr_encode_key) + return True + +def kernel32_DecodePointer(jitter): + """ + PVOID DecodePointer( + PVOID Ptr + ); + + The function returns the decoded pointer. + + """ + ret, args = jitter.func_args_stdcall(1) + jitter.func_ret_stdcall(ret, args[0] ^ winobjs.ptr_encode_key) + return True def user32_GetForegroundWindow(jitter): ret_ad, _ = jitter.func_args_stdcall(0) |