about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--miasm2/jitter/os_dep/win_api_x86_32.py14
-rw-r--r--test/jitter/os_dep/win_api_x86_32.py144
-rw-r--r--test/test_all.py4
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": {