diff options
Diffstat (limited to 'example/unpack_gen.py')
| -rw-r--r-- | example/unpack_gen.py | 169 |
1 files changed, 11 insertions, 158 deletions
diff --git a/example/unpack_gen.py b/example/unpack_gen.py index c60063dc..ffca512e 100644 --- a/example/unpack_gen.py +++ b/example/unpack_gen.py @@ -1,168 +1,21 @@ -import sys, os -from optparse import OptionParser -from miasm2.analysis.machine import Machine -from miasm2.jitter.jitload import vm_load_pe, preload_pe, libimp -from miasm2.jitter.jitload import bin_stream_vm -from miasm2.jitter.os_dep import win_api_x86_32, win_api_x86_32_seh -from miasm2.analysis import debugging - -# Debug settings -import inspect +import os from pdb import pm +from miasm2.analysis.sandbox import Sandbox_Win_x86_32 -# Environment settings +# Python auto completion filename = os.environ.get('PYTHONSTARTUP') if filename and os.path.isfile(filename): execfile(filename) -parser = OptionParser(usage = "usage: %prog [options] file") -parser.add_option('-a', "--address", dest="address", metavar="ADDRESS", - help="Force entry point address", default=None) -parser.add_option('-s', "--segm", dest="usesegm", action="store_true", - help="Use segments fs:", default=False) -parser.add_option('-o', "--hdr", dest="loadhdr", action="store_true", - help="Load pe hdr", default=False) -parser.add_option('-l', "--loadbasedll", dest="loadbasedll", - action="store_true", help="Load base dll (path './win_dll')", - default=False) -parser.add_option('-x', "--dumpall", dest="dumpall", action="store_true", - help="Load base dll", default=False) -parser.add_option('-e', "--loadmainpe", dest="loadmainpe", action="store_true", - help="Load main pe", default=False) -parser.add_option('-r', "--parseresources", dest="parse_resources", - action="store_true", help="Load resources", default=False) -parser.add_option('-b', "--dumpblocs", dest="dumpblocs", action="store_true", - help="Log disasm blocks", default=False) -parser.add_option('-y', "--useseh", dest="use_seh", action="store_true", - help="Use windows SEH", default=False) -parser.add_option('-z', "--singlestep", dest="singlestep", action="store_true", - help="Log single step", default=False) -parser.add_option('-d', "--debugging", dest="debugging", action="store_true", - help="Debug shell", default=False) -parser.add_option('-g', "--gdbserver", dest="gdbserver", - help="Listen on port @port", default=False) -parser.add_option("-j", "--jitter", dest="jitter", - help="Jitter engine. Possible values are : tcc (default),\ -llvm, python", - default="tcc") - -(options, args) = parser.parse_args(sys.argv[1:]) -if not args: - parser.print_help() - sys.exit(0) - -#### INSERT HERE CUSTOM DLL METHODS ### -####################################### - -fname = args[0] -machine = Machine("x86_32") - -myjit = machine.jitter(options.jitter) -if options.usesegm: - myjit.ir_arch.do_stk_segm= True - myjit.ir_arch.do_ds_segm= True - myjit.ir_arch.do_str_segm = True - myjit.ir_arch.do_all_segm = True - -bs = bin_stream_vm(myjit.vm) -myjit.jit.bs = bs - -# Init stack -myjit.stack_size = 0x100000 -myjit.init_stack() - -# Import manager -libs = libimp() - -# Set libs for win_32 api -win_api_x86_32.winobjs.runtime_dll = libs - -all_imp_dll = [] -if options.loadbasedll: - - # Load library - all_imp_dll = ["ntdll.dll", "kernel32.dll", "user32.dll", - "ole32.dll", "urlmon.dll", - "ws2_32.dll", 'advapi32.dll', "psapi.dll" - ] - mod_list = all_imp_dll - all_pe = [] - # Load libs in memory - for n in mod_list: - fname_dll = os.path.join('win_dll', n) - e_lib = vm_load_pe(myjit.vm, fname_dll) - - libs.add_export_lib(e_lib, n) - all_pe.append(e_lib) - - # Patch libs imports - for ee in all_pe: - preload_pe(myjit.vm, ee, libs) +# Insert here user defined methods +# Parse arguments +parser = Sandbox_Win_x86_32.parser() +parser.add_argument("filename", help="PE Filename") +options = parser.parse_args() -# Load main pe -e = vm_load_pe(myjit.vm, fname) - -# Fix mainpe imports -preload_pe(myjit.vm, e, libs) - -# Library calls handler -myjit.add_lib_handler(libs, globals()) - -# Manage SEH -if options.use_seh: - win_api_x86_32_seh.main_pe_name = fname - win_api_x86_32_seh.main_pe = e - win_api_x86_32_seh.loaded_modules = all_imp_dll - win_api_x86_32_seh.init_seh(myjit) - win_api_x86_32_seh.set_win_fs_0(myjit) - -# Get entry point address -if options.address is not None: - addr = int(options.address, 16) -else: - addr = e.rva2virt(e.Opthdr.AddressOfEntryPoint) - -# Logging options -if options.singlestep: - myjit.jit.log_mn = True - myjit.jit.log_regs = True - -if options.dumpblocs: - myjit.jit.log_newbloc = True - -# Pre-stack some arguments -myjit.vm_push_uint32_t(2) -myjit.vm_push_uint32_t(1) -myjit.vm_push_uint32_t(0) -myjit.vm_push_uint32_t(0x1337beef) - -# Set the runtime guard -def code_sentinelle(myjit): - print 'emulation stop' - myjit.run = False - return False - -myjit.add_breakpoint(0x1337beef, code_sentinelle) - -#### INSERT HERE CUSTOM BREAKPOINTS ### -####################################### +# Create sandbox +sb = Sandbox_Win_x86_32(options.filename, options, globals()) # Run -if any([options.debugging, options.gdbserver]): - dbg = debugging.Debugguer(myjit) - dbg.init_run(addr) - - if options.gdbserver is not False: - port = int(options.gdbserver) - print "Listen on port %d" % port - gdb = machine.gdbserver(dbg, port) - gdb.run() - else: - cmd = debugging.DebugCmd(dbg) - cmd.cmdloop() - -else: - print "Start emulation", hex(addr) - myjit.init_run(addr) - print myjit.continue_run() +sb.run() |