about summary refs log tree commit diff stats
path: root/miasm2/analysis/binary.py
diff options
context:
space:
mode:
authorFabrice Desclaux <fabrice.desclaux@cea.fr>2014-08-29 16:03:17 +0200
committerFabrice Desclaux <fabrice.desclaux@cea.fr>2014-08-29 16:03:17 +0200
commitacd7a0615498d7f8b296b141a7a20ec0dcab1c96 (patch)
tree5846fde0fad7cf097a883093f81da615b8d46fc2 /miasm2/analysis/binary.py
parent261291e245bc5dc3842c3c4417c356ac6e160d45 (diff)
downloadmiasm-acd7a0615498d7f8b296b141a7a20ec0dcab1c96.tar.gz
miasm-acd7a0615498d7f8b296b141a7a20ec0dcab1c96.zip
analysis: add container for elf/pe/str manipulation
Diffstat (limited to 'miasm2/analysis/binary.py')
-rw-r--r--miasm2/analysis/binary.py47
1 files changed, 47 insertions, 0 deletions
diff --git a/miasm2/analysis/binary.py b/miasm2/analysis/binary.py
new file mode 100644
index 00000000..d2b0aa5a
--- /dev/null
+++ b/miasm2/analysis/binary.py
@@ -0,0 +1,47 @@
+from miasm2.core.bin_stream import *
+import logging
+from miasm2.jitter.jitload import vm_load_pe, vm_load_elf
+
+log = logging.getLogger("binary")
+console_handler = logging.StreamHandler()
+console_handler.setFormatter(logging.Formatter("%(levelname)-5s: %(message)s"))
+log.addHandler(console_handler)
+log.setLevel(logging.INFO)
+
+class Container(object):
+    def __init__(self, filename, vm = None, addr = None):
+        data = open(filename).read()
+        log.info('load binary')
+        e, bs, ep = None, None, None
+
+        if data.startswith('MZ'):
+            try:
+                if vm is not None:
+                    e = vm_load_pe(vm, filename)
+                else:
+                    e = pe_init.PE(data)
+                if e.isPE() and e.NTsig.signature_value == 0x4550:
+                    bs = bin_stream_pe(e.virt)
+                    ep = e.rva2virt(e.Opthdr.AddressOfEntryPoint)
+            except:
+                log.error('Cannot read PE!')
+        elif data.startswith('\x7fELF'):
+            try:
+                if vm is not None:
+                    e = vm_load_elf(vm, filename)
+                else:
+                    e = elf_init.ELF(data)
+                bs = bin_stream_elf(e.virt)
+                ep = e.Ehdr.entry
+            except:
+                log.error('Cannot read ELF!')
+        else:
+            bs = bin_stream_str(data)
+            if vm is not None:
+                if addr is None:
+                    raise ValueError('set load addr')
+                vm.vm_add_memory_page(addr,
+                                      PAGE_READ,
+                                      data)
+
+        self.e, self.bs, self.ep = e, bs, ep