about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorFabrice Desclaux <fabrice.desclaux@cea.fr>2015-11-26 10:23:23 +0100
committerFabrice Desclaux <fabrice.desclaux@cea.fr>2015-12-04 15:10:10 +0100
commite3bc26d99ea8ed95a71693b5b9bd145194177fac (patch)
treef8c1659798ed77a328a3f5af4baa1df209f6ad74
parent443a8450d26979ddcaa88306e36be0b5846b9e83 (diff)
downloadmiasm-e3bc26d99ea8ed95a71693b5b9bd145194177fac.tar.gz
miasm-e3bc26d99ea8ed95a71693b5b9bd145194177fac.zip
Loader/pe: fix load lib; vm2pe
Diffstat (limited to '')
-rw-r--r--miasm2/jitter/loader/pe.py24
-rw-r--r--miasm2/jitter/loader/utils.py6
2 files changed, 19 insertions, 11 deletions
diff --git a/miasm2/jitter/loader/pe.py b/miasm2/jitter/loader/pe.py
index d23d52a3..32d92164 100644
--- a/miasm2/jitter/loader/pe.py
+++ b/miasm2/jitter/loader/pe.py
@@ -242,7 +242,7 @@ def vm_fix_imports_pe_libs(lib_imgs, libs, lib_path_base,
 def vm2pe(myjit, fname, libs=None, e_orig=None,
           min_addr=None, max_addr=None,
           min_section_offset=0x1000, img_base=None,
-          added_funcs=None):
+          added_funcs=None, **kwargs):
     if e_orig:
         size = e_orig._wsize
     else:
@@ -288,7 +288,9 @@ def vm2pe(myjit, fname, libs=None, e_orig=None,
                 libbase, dllname = libs.fad2info[funcaddr]
                 libs.lib_get_add_func(libbase, dllname, addr)
 
-        new_dll = libs.gen_new_lib(mye, mye.virt.is_addr_in)
+        filter_import = kwargs.get(
+            'filter_import', lambda _, ad: mye.virt.is_addr_in(ad))
+        new_dll = libs.gen_new_lib(mye, filter_import)
     else:
         new_dll = {}
 
@@ -335,6 +337,10 @@ class libimp_pe(libimp):
         # will add real lib addresses to database
         if name in self.name2off:
             ad = self.name2off[name]
+            if e is not None and name in self.fake_libs:
+                log.error(
+                    "You are trying to load %r but it has been faked previously. Try loading this module earlier.", name)
+                raise RuntimeError("Bad import")
         else:
             log.debug('new lib %s', name)
             ad = e.NThdr.ImageBase
@@ -369,7 +375,6 @@ class libimp_pe(libimp):
                     else:
                         # import redirected lib from non loaded dll
                         if not exp_dname in self.name2off:
-                            log.warning("Create dummy entry for %r", exp_dname)
                             self.created_redirected_imports.setdefault(
                                 exp_dname, set()).add(name)
 
@@ -390,10 +395,10 @@ class libimp_pe(libimp):
                 self.fad2cname[ad] = c_name
                 self.fad2info[ad] = libad, imp_ord_or_name
 
-    def gen_new_lib(self, target_pe, flt=lambda _: True):
+    def gen_new_lib(self, target_pe, filter_import=lambda peobj, ad: True, **kwargs):
         """Gen a new DirImport description
         @target_pe: PE instance
-        @flt: (boolean f(address)) restrict addresses to keep
+        @filter_import: (boolean f(pe, address)) restrict addresses to keep
         """
 
         new_lib = []
@@ -405,8 +410,9 @@ class libimp_pe(libimp):
             for func_name, dst_addresses in self.lib_imp2dstad[ad].items():
                 out_ads.update({addr: func_name for addr in dst_addresses})
 
-            # Filter available addresses according to @flt
-            all_ads = [addr for addr in out_ads.keys() if flt(addr)]
+            # Filter available addresses according to @filter_import
+            all_ads = [
+                addr for addr in out_ads.keys() if filter_import(target_pe, addr)]
             log.debug('ads: %s', map(hex, all_ads))
             if not all_ads:
                 continue
@@ -476,10 +482,10 @@ def vm_load_pe_and_dependencies(vm, fname, name2module, runtime_lib,
         else:
             try:
                 with open(fname) as fstream:
-                    log.info('Loading module %r', name)
+                    log.info('Loading module name %r', fname)
                     pe_obj = vm_load_pe(vm, fstream.read(), **kwargs)
             except IOError:
-                log.warning('Cannot open %s' % fname)
+                log.error('Cannot open %s' % fname)
                 name2module[name] = None
                 continue
             name2module[name] = pe_obj
diff --git a/miasm2/jitter/loader/utils.py b/miasm2/jitter/loader/utils.py
index 8e09053a..83d1a796 100644
--- a/miasm2/jitter/loader/utils.py
+++ b/miasm2/jitter/loader/utils.py
@@ -4,7 +4,7 @@ log = logging.getLogger('loader_common')
 hnd = logging.StreamHandler()
 hnd.setFormatter(logging.Formatter("[%(levelname)s]: %(message)s"))
 log.addHandler(hnd)
-log.setLevel(logging.CRITICAL)
+log.setLevel(logging.INFO)
 
 
 def canon_libname_libfunc(libname, libfunc):
@@ -26,6 +26,7 @@ class libimp(object):
         self.fad2cname = {}
         self.fad2info = {}
         self.all_exported_lib = []
+        self.fake_libs = set()
 
     def lib_get_add_base(self, name):
         name = name.lower().strip(' ')
@@ -38,7 +39,8 @@ class libimp(object):
             ad = self.name2off[name]
         else:
             ad = self.libbase_ad
-            log.debug('new lib %s 0x%x', name, ad)
+            log.warning("Create dummy entry for %r", name)
+            self.fake_libs.add(name)
             self.name2off[name] = ad
             self.libbase2lastad[ad] = ad + 0x1
             self.lib_imp2ad[ad] = {}