about summary refs log tree commit diff stats
path: root/miasm2/jitter
diff options
context:
space:
mode:
Diffstat (limited to 'miasm2/jitter')
-rw-r--r--miasm2/jitter/Jittcc.c8
-rw-r--r--miasm2/jitter/arch/JitCore_arm.c2
-rw-r--r--miasm2/jitter/jitcore_tcc.py2
-rw-r--r--miasm2/jitter/llvmconvert.py4
-rw-r--r--miasm2/jitter/loader/pe.py43
-rw-r--r--miasm2/jitter/vm_mngr.c13
6 files changed, 41 insertions, 31 deletions
diff --git a/miasm2/jitter/Jittcc.c b/miasm2/jitter/Jittcc.c
index 955491ad..88359147 100644
--- a/miasm2/jitter/Jittcc.c
+++ b/miasm2/jitter/Jittcc.c
@@ -219,25 +219,25 @@ PyObject* tcc_compil(PyObject* self, PyObject* args)
 		return NULL;
 
 	if (tcc_compile_string(tcc_state, func_code) != 0) {
-		fprintf(stderr, "Erreur de compilation !\n");
+		fprintf(stderr, "Error compiling !\n");
 		fprintf(stderr, "%s\n", func_code);
 		exit(1);
 	}
 	/* XXX configure tinycc install with --disable-static */
 	if (tcc_relocate(tcc_state, TCC_RELOCATE_AUTO) < 0) {
-		fprintf(stderr, "tcc relocate error\n");
+		fprintf(stderr, "TCC relocate error\n");
 		exit(1);
 	}
 	entry = tcc_get_symbol(tcc_state, func_name);
 	if (!entry){
-		fprintf(stderr, "Erreur de symbole %s!\n", func_name);
+		fprintf(stderr, "Error getting symbol %s!\n", func_name);
 		fprintf(stderr, "%s\n", func_name);
 		exit(1);
 	}
 
 	ret = PyTuple_New(2);
 	if (ret == NULL) {
-		fprintf(stderr, "Erreur alloc %s!\n", func_name);
+		fprintf(stderr, "Error alloc %s!\n", func_name);
 		fprintf(stderr, "%s\n", func_name);
 		exit(1);
 	}
diff --git a/miasm2/jitter/arch/JitCore_arm.c b/miasm2/jitter/arch/JitCore_arm.c
index d6e27acc..84716c2d 100644
--- a/miasm2/jitter/arch/JitCore_arm.c
+++ b/miasm2/jitter/arch/JitCore_arm.c
@@ -207,7 +207,7 @@ uint32_t clz(uint32_t arg)
 	int i;
 
 	for (i=0; i<32; i++) {
-		if (arg & (1 << (31-i)))
+		if (arg & (1ull << (31-i)))
 			break;
 	}
 	return i;
diff --git a/miasm2/jitter/jitcore_tcc.py b/miasm2/jitter/jitcore_tcc.py
index 5b47bf6d..28288400 100644
--- a/miasm2/jitter/jitcore_tcc.py
+++ b/miasm2/jitter/jitcore_tcc.py
@@ -69,7 +69,7 @@ class JitCore_Tcc(JitCore_Cc_Base):
         fname_out = os.path.join(self.tempdir, "%s.c" % block_hash)
 
         if os.access(fname_out, os.R_OK):
-            func_code = open(fname_out).read()
+            func_code = open(fname_out, "rb").read()
         else:
             func_code = self.gen_c_code(block.label, block)
 
diff --git a/miasm2/jitter/llvmconvert.py b/miasm2/jitter/llvmconvert.py
index 0f88d842..83349781 100644
--- a/miasm2/jitter/llvmconvert.py
+++ b/miasm2/jitter/llvmconvert.py
@@ -313,7 +313,7 @@ class LLVMContext_JIT(LLVMContext):
             # No need to overwrite
             return
 
-        open(fname_out, "w").write(buffer)
+        open(fname_out, "wb").write(buffer)
 
     @staticmethod
     def cache_getbuffer(module):
@@ -323,7 +323,7 @@ class LLVMContext_JIT(LLVMContext):
 
         fname_out = module.fname_out
         if os.access(fname_out, os.R_OK):
-            return open(fname_out).read()
+            return open(fname_out, "rb").read()
         return None
 
     def enable_cache(self):
diff --git a/miasm2/jitter/loader/pe.py b/miasm2/jitter/loader/pe.py
index 5c523c6c..65bf284b 100644
--- a/miasm2/jitter/loader/pe.py
+++ b/miasm2/jitter/loader/pe.py
@@ -66,20 +66,31 @@ def preload_pe(vm, e, runtime_lib, patch_vm_imp=True):
     return dyn_funcs
 
 
-def is_redirected_export(e, ad):
-    # test is ad points to code or dll name
-    out = ''
-    for i in xrange(0x200):
-        c = e.virt.get(ad + i)
-        if c == "\x00":
-            break
-        out += c
-        if not (c.isalnum() or c in "_.-+*$@&#()[]={}"):
-            return False
-    if not "." in out:
+def is_redirected_export(pe_obj, addr):
+    """Test if the @addr is a forwarded export address. If so, return
+    dllname/function name couple. If not, return False.
+
+    An export address is a forwarded export if the rva is in the export
+    directory of the pe.
+
+    @pe_obj: PE instance
+    @addr: virtual address of the function to test
+    """
+
+    export_dir = pe_obj.NThdr.optentries[pe.DIRECTORY_ENTRY_EXPORT]
+    addr_rva = pe_obj.virt2rva(addr)
+    if not (export_dir.rva <= addr_rva < export_dir.rva + export_dir.size):
         return False
-    i = out.find('.')
-    return out[:i], out[i + 1:]
+    addr_end = pe_obj.virt.find('\x00', addr)
+    data = pe_obj.virt.get(addr, addr_end)
+
+    dllname, func_info = data.split('.', 1)
+    dllname = dllname.lower()
+
+    # Test if function is forwarded using ordinal
+    if func_info.startswith('#'):
+        func_info = int(func_info[1:])
+    return dllname, func_info
 
 
 def get_export_name_addr_list(e):
@@ -223,7 +234,7 @@ def vm_load_pe_lib(vm, fname_in, libs, lib_path_base, **kargs):
     log.info('Loading module %r', fname_in)
 
     fname = os.path.join(lib_path_base, fname_in)
-    with open(fname) as fstream:
+    with open(fname, "rb") as fstream:
         pe = vm_load_pe(vm, fstream.read(), name=fname_in, **kargs)
     libs.add_export_lib(pe, fname_in)
     return pe
@@ -324,7 +335,7 @@ def vm2pe(myjit, fname, libs=None, e_orig=None,
             mye.DirRes.set_rva(s_res.addr)
             log.debug('%r', mye.DirRes)
     # generation
-    open(fname, 'w').write(str(mye))
+    open(fname, 'wb').write(str(mye))
     return mye
 
 
@@ -490,7 +501,7 @@ def vm_load_pe_and_dependencies(vm, fname, name2module, runtime_lib,
             pe_obj = name2module[name]
         else:
             try:
-                with open(fname) as fstream:
+                with open(fname, "rb") as fstream:
                     log.info('Loading module name %r', fname)
                     pe_obj = vm_load_pe(
                         vm, fstream.read(), name=fname, **kwargs)
diff --git a/miasm2/jitter/vm_mngr.c b/miasm2/jitter/vm_mngr.c
index 59cbdf6e..c628aeff 100644
--- a/miasm2/jitter/vm_mngr.c
+++ b/miasm2/jitter/vm_mngr.c
@@ -843,24 +843,23 @@ unsigned int rcr_rez_op(unsigned int size, unsigned int a, unsigned int b, unsig
     return tmp;
 }
 
-unsigned int x86_bsr(unsigned int size, uint64_t src)
+unsigned int x86_bsr(uint64_t size, uint64_t src)
 {
-	int i;
+	uint64_t i;
 
 	for (i=size-1; i>=0; i--){
-		if (src & (1<<i))
+		if (src & (1ull << i))
 			return i;
 	}
 	fprintf(stderr, "sanity check error bsr\n");
 	exit(0);
 }
 
-unsigned int x86_bsf(unsigned int size, uint64_t src)
+unsigned int x86_bsf(uint64_t size, uint64_t src)
 {
-	int i;
-
+	uint64_t i;
 	for (i=0; i<size; i++){
-		if (src & (1<<i))
+		if (src & (1ull << i))
 			return i;
 	}
 	fprintf(stderr, "sanity check error bsf\n");