diff options
Diffstat (limited to 'miasm2/jitter')
| -rw-r--r-- | miasm2/jitter/Jittcc.c | 8 | ||||
| -rw-r--r-- | miasm2/jitter/arch/JitCore_arm.c | 2 | ||||
| -rw-r--r-- | miasm2/jitter/jitcore_tcc.py | 2 | ||||
| -rw-r--r-- | miasm2/jitter/llvmconvert.py | 4 | ||||
| -rw-r--r-- | miasm2/jitter/loader/pe.py | 43 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr.c | 13 |
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"); |