diff options
| author | serpilliere <serpilliere@users.noreply.github.com> | 2023-04-23 21:24:51 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-23 21:24:51 +0200 |
| commit | 49ec4bc9a90391bc796ac6940a6d9b77deb17ac9 (patch) | |
| tree | 1a890a007c103e643ffe4e1b13caada32c901ef9 /example/jitter/unpack_generic.py | |
| parent | 230d528c50d8a2870a89011fc1e660fcab4910ff (diff) | |
| parent | b66becdead10f0bb2aa009dda61c422e79c567fe (diff) | |
| download | focaccia-miasm-49ec4bc9a90391bc796ac6940a6d9b77deb17ac9.tar.gz focaccia-miasm-49ec4bc9a90391bc796ac6940a6d9b77deb17ac9.zip | |
Merge pull request #1448 from cea-sec/generic-unpack
Generic import recovery (cheap ImpRec style)
Diffstat (limited to 'example/jitter/unpack_generic.py')
| -rw-r--r-- | example/jitter/unpack_generic.py | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/example/jitter/unpack_generic.py b/example/jitter/unpack_generic.py new file mode 100644 index 00000000..3329d2a9 --- /dev/null +++ b/example/jitter/unpack_generic.py @@ -0,0 +1,53 @@ +from __future__ import print_function +import os +import logging +from miasm.analysis.sandbox import Sandbox_Win_x86_32 +from miasm.jitter.loader.pe import vm2pe, ImpRecStrategy +from miasm.core.locationdb import LocationDB +from miasm.jitter.jitload import JitterException + +parser = Sandbox_Win_x86_32.parser(description="Generic & dummy unpacker") +parser.add_argument("filename", help="PE Filename") +parser.add_argument("--oep", help="Stop and dump if this address is reached") +parser.add_argument('-v', "--verbose", + help="verbose mode", action="store_true") +options = parser.parse_args() + +loc_db = LocationDB() +sb = Sandbox_Win_x86_32( + loc_db, options.filename, options, globals(), + parse_reloc=False +) + +if options.verbose is True: + logging.basicConfig(level=logging.INFO) +else: + logging.basicConfig(level=logging.WARNING) + +if options.verbose is True: + print(sb.jitter.vm) + +def stop(jitter): + logging.info('User provided OEP reached') + # Stop execution + return False + +if options.oep: + # Set callbacks + sb.jitter.add_breakpoint(int(options.oep, 0), stop) + +# Run until an error is encountered - IT IS UNLIKELY THE ORIGINAL ENTRY POINT +try: + sb.run() +except (JitterException, ValueError) as e: + logging.exception(e) + +out_fname = "%s.dump" % (options.filename) + +# Try a generic approach to rebuild the Import Table +imprec = ImpRecStrategy(sb.jitter, sb.libs, 32) +imprec.recover_import() + +# Rebuild the PE and dump it +print("Dump to %s" % out_fname) +vm2pe(sb.jitter, out_fname, libs=sb.libs, e_orig=sb.pe) |