diff options
| -rw-r--r-- | miasm2/jitter/os_dep/win_api_x86_32.py | 14 | ||||
| -rw-r--r-- | test/jitter/os_dep/win_api_x86_32.py | 144 | ||||
| -rw-r--r-- | test/test_all.py | 4 |
3 files changed, 153 insertions, 9 deletions
diff --git a/miasm2/jitter/os_dep/win_api_x86_32.py b/miasm2/jitter/os_dep/win_api_x86_32.py index 24ab3ea2..f4159667 100644 --- a/miasm2/jitter/os_dep/win_api_x86_32.py +++ b/miasm2/jitter/os_dep/win_api_x86_32.py @@ -291,7 +291,7 @@ def kernel32_HeapFree(myjit): ret_ad, args = myjit.func_args_stdcall(3) heap, flags, pmem = args - myjit.func_ret_stdcall(ret_ad, 0) + myjit.func_ret_stdcall(ret_ad, 1) def kernel32_GlobalAlloc(myjit): @@ -363,7 +363,7 @@ def kernel32_Process32Next(myjit): else: ret = 1 n = winobjs.toolhelpsnapshot_info[s_handle] - print whoami(), hex(ret_ad), '(', hex(s_handle), hex(ad_pentry), ')' + #print whoami(), hex(ret_ad), '(', hex(s_handle), hex(ad_pentry), ')' pentry = struct.pack( 'IIIIIIIII', *process_list[n][:-1]) + process_list[n][-1] myjit.vm.vm_set_mem(ad_pentry, pentry) @@ -381,7 +381,7 @@ def kernel32_GetVersion(myjit): myjit.func_ret_stdcall(ret_ad, winobjs.getversion) -def my_GetVersionEx(myjit, funcname, set_str): +def kernel32_GetVersionEx(myjit, set_str = set_str_unic): ret_ad, args = myjit.func_args_stdcall(1) ptr_struct, = args @@ -400,12 +400,8 @@ def my_GetVersionEx(myjit, funcname, set_str): myjit.func_ret_stdcall(ret_ad, 1) -def kernel32_GetVersionExA(myjit): - my_GetVersionEx(myjit, whoami(), set_str_ansi) - - -def kernel32_GetVersionExW(myjit): - my_GetVersionEx(myjit, whoami(), set_str_unic) +kernel32_GetVersionExA = lambda myjit: kernel32_GetVersionEx(myjit, set_str_ansi) +kernel32_GetVersionExW = lambda myjit: kernel32_GetVersionEx(myjit, set_str_unic) def kernel32_GetPriorityClass(myjit): diff --git a/test/jitter/os_dep/win_api_x86_32.py b/test/jitter/os_dep/win_api_x86_32.py new file mode 100644 index 00000000..a3b89305 --- /dev/null +++ b/test/jitter/os_dep/win_api_x86_32.py @@ -0,0 +1,144 @@ +#!/usr/bin/env python +#-*- coding:utf-8 -*- + +import unittest +import logging + +from miasm2.jitter.jitload import jitter_x86_32 +import miasm2.jitter.os_dep.win_api_x86_32 as winapi + +jit = jitter_x86_32() +jit.init_stack() + + +class TestWinAPI(unittest.TestCase): + + def test_DebuggingFunctions(self): + + # BOOL WINAPI IsDebuggerPresent(void); + jit.vm_push_uint32_t(0) # @return + winapi.kernel32_IsDebuggerPresent(jit) + vBool = jit.cpu.EAX + self.assertFalse(vBool) + + def test_MemoryManagementFunctions(self): + + # HGLOBAL WINAPI GlobalAlloc(_In_ UINT uFlags, _In_ SIZE_T dwBytes); + jit.vm_push_uint32_t(10) # dwBytes + jit.vm_push_uint32_t(0) # uFlags + jit.vm_push_uint32_t(0) # @return + winapi.kernel32_GlobalAlloc(jit) + hMem = jit.cpu.EAX + self.assertTrue(hMem) + + # HGLOBAL WINAPI GlobalFree(_In_ HGLOBAL hMem); + jit.vm_push_uint32_t(hMem) # hMem + jit.vm_push_uint32_t(0) # @return + winapi.kernel32_GlobalFree(jit) + hMem = jit.cpu.EAX + self.assertFalse(hMem) + + # LPVOID WINAPI HeapAlloc(_In_ HANDLE hHeap, _In_ DWORD dwFlags, _In_ SIZE_T dwBytes); + jit.vm_push_uint32_t(10) # dwBytes + jit.vm_push_uint32_t(0) # dwFlags + jit.vm_push_uint32_t(0) # hHeap + jit.vm_push_uint32_t(0) # @return + winapi.kernel32_HeapAlloc(jit) + lpMem = jit.cpu.EAX + self.assertTrue(lpMem) + + # BOOL WINAPI HeapFree(_In_ HANDLE hHeap, _In_ DWORD dwFlags, _In_ LPVOID lpMem); + jit.vm_push_uint32_t(lpMem) # lpMem + jit.vm_push_uint32_t(0) # dwFlags + jit.vm_push_uint32_t(0) # hHeap + jit.vm_push_uint32_t(0) # @return + winapi.kernel32_HeapFree(jit) + vBool = jit.cpu.EAX + self.assertTrue(vBool) + + # HLOCAL WINAPI LocalAlloc(_In_ UINT uFlags, _In_ SIZE_T uBytes); + jit.vm_push_uint32_t(10) # uBytes + jit.vm_push_uint32_t(0) # uFlags + jit.vm_push_uint32_t(0) # @return + winapi.kernel32_LocalAlloc(jit) + hMem = jit.cpu.EAX + self.assertTrue(hMem) + + # HLOCAL WINAPI LocalFree(_In_ HLOCAL hMem); + jit.vm_push_uint32_t(hMem) # hMem + jit.vm_push_uint32_t(0) # @return + winapi.kernel32_LocalFree(jit) + hMem = jit.cpu.EAX + self.assertFalse(hMem) + + def test_ProcessAndThreadFunctions(self): + + # HANDLE WINAPI GetCurrentProcess(void); + jit.vm_push_uint32_t(0) # @return + winapi.kernel32_GetCurrentProcess(jit) + hProc = jit.cpu.EAX + self.assertTrue(hProc) + + # DWORD WINAPI GetCurrentProcessId(void); + jit.vm_push_uint32_t(0) # @return + winapi.kernel32_GetCurrentProcessId(jit) + dwProc = jit.cpu.EAX + self.assertTrue(dwProc) + + def test_SystemInformationFunctions(self): + + # DWORD WINAPI GetVersion(void); + jit.vm_push_uint32_t(0) # @return + winapi.kernel32_GetVersion(jit) + dwVer = jit.cpu.EAX + self.assertTrue(dwVer) + + # BOOL WINAPI GetVersionEx(_Inout_ LPOSVERSIONINFO lpVersionInfo); + jit.vm_push_uint32_t(jit.stack_base) # lpVersionInfo + jit.vm_push_uint32_t(0) # @return + winapi.kernel32_GetVersionEx(jit) + vBool = jit.cpu.EAX + self.assertTrue(vBool) + + def test_TimeFunctions(self): + + # DWORD WINAPI GetTickCount(void); + jit.vm_push_uint32_t(0) # @return + winapi.kernel32_GetTickCount(jit) + dwTime = jit.cpu.EAX + self.assertTrue(dwTime) + + def test_ToolHelpFunctions(self): + + # HANDLE WINAPI CreateToolhelp32Snapshot(_In_ DWORD dwFlags, _In_ DWORD th32ProcessID); + jit.vm_push_uint32_t(0) # th32ProcessID + jit.vm_push_uint32_t(0) # dwFlags + jit.vm_push_uint32_t(0) # @return + winapi.kernel32_CreateToolhelp32Snapshot(jit) + hSnap = jit.cpu.EAX + self.assertTrue(hSnap) + + # BOOL WINAPI Process32First(_In_ HANDLE hSnapshot, _Inout_ LPPROCESSENTRY32 lppe); + jit.vm_push_uint32_t(jit.stack_base) # lppe + jit.vm_push_uint32_t(hSnap) # hSnapshot + jit.vm_push_uint32_t(0) # @return + winapi.kernel32_Process32First(jit) + vBool = jit.cpu.EAX + self.assertTrue(vBool) + + # BOOL WINAPI Process32Next(_In_ HANDLE hSnapshot, _Out_ LPPROCESSENTRY32 lppe); + for i in xrange(3, -1, -1): + jit.vm_push_uint32_t(jit.stack_base) # lppe + jit.vm_push_uint32_t(hSnap) # hSnapshot + jit.vm_push_uint32_t(0) # @return + winapi.kernel32_Process32Next(jit) + vBool = jit.cpu.EAX + if i: self.assertTrue(vBool) + else: self.assertFalse(vBool) + + +if __name__ == '__main__': + testsuite = unittest.TestLoader().loadTestsFromTestCase(TestWinAPI) + report = unittest.TextTestRunner(verbosity=2).run(testsuite) + exit(len(report.errors + report.failures)) + diff --git a/test/test_all.py b/test/test_all.py index d822b244..ae1ca741 100644 --- a/test/test_all.py +++ b/test/test_all.py @@ -43,11 +43,15 @@ all_tests = { ["ir/ir2C.py"], ["ir/symbexec.py"], ], + "jitter": [ + ["jitter/os_dep/win_api_x86_32.py"], + ], "order": [ "architecture", "core", "expression", "ir", + "jitter", ], }, "example": { |