Skip to content

Commit 4f8db1e

Browse files
committed
Refactor module loader
1 parent 9dd500f commit 4f8db1e

File tree

9 files changed

+282
-439
lines changed

9 files changed

+282
-439
lines changed

example/jitter/run_with_linuxenv.py

+1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
ld_path = linux_env.filesystem.resolve_path(ld_path)
5959
cont_ld = Container.from_stream(
6060
open(ld_path, "rb"),
61+
loc_db=loc_db,
6162
vm=jitter.vm,
6263
addr=0x80000000,
6364
apply_reloc=True

example/jitter/unpack_upx.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ def kernel32_GetProcAddress(jitter):
2525

2626
# Get the generated address of the library, and store it in memory to
2727
# dst_ad
28-
ad = sb.loader.lib_get_add_func(args.libbase, fname, dst_ad)
28+
#ad = sb.loader.lib_get_add_func(args.libbase, fname, dst_ad)
29+
name = sb.loader.module_base_address_to_name[args.libbase]
30+
ad = sb.loader.resolve_function(name, fname, dst_ad=dst_ad)
2931
# Add a breakpoint in case of a call on the resolved function
3032
# NOTE: never happens in UPX, just for skeleton
3133
jitter.handle_function(ad)

miasm/analysis/dse.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -257,14 +257,14 @@ def add_lib_handler(self, loader, namespace):
257257

258258
# lambda cannot contain statement
259259
def default_func(dse):
260-
fname = loader.fad2cname[dse.jitter.pc]
260+
fname = loader.module_base_address_to_name(dse.jitter.pc)
261261
if isinstance(fname, tuple):
262262
fname = b"%s_%d_symb" % (force_bytes(fname[0]), fname[1])
263263
else:
264264
fname = b"%s_symb" % force_bytes(fname)
265265
raise RuntimeError("Symbolic stub '%s' not found" % fname)
266266

267-
for addr, fname in viewitems(loader.fad2cname):
267+
for addr, fname in viewitems(loader.function_address_to_canonical_name):
268268
if isinstance(fname, tuple):
269269
fname = b"%s_%d_symb" % (force_bytes(fname[0]), fname[1])
270270
else:

miasm/analysis/sandbox.py

+8-62
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ def init_loader(self, options):
232232
loader_start_address = int(options.loader_start_address, 0)
233233
else:
234234
loader_start_address = None
235-
loader = LoaderWindows(loader_start_address=loader_start_address)
235+
loader = LoaderWindows(self.jitter.vm, loader_start_address=loader_start_address)
236236
self.loader = loader
237237
winobjs.loader = loader
238238

@@ -242,60 +242,19 @@ def use_windows_structs(self):
242242
win_api_x86_32_seh.main_pe_name = self.fname_basename
243243
win_api_x86_32_seh.main_pe = self.pe
244244
win_api_x86_32.winobjs.hcurmodule = self.pe.NThdr.ImageBase
245-
win_api_x86_32_seh.name2module = self.name2module
245+
win_api_x86_32_seh.name2module = self.loader.module_name_to_module
246246
win_api_x86_32_seh.set_win_fs_0(self.jitter)
247247
win_api_x86_32_seh.init_seh(self.jitter)
248248

249249
def load_main_pe(self, options):
250250
from miasm.jitter.loader.pe import vm_load_pe
251251
from miasm.os_dep.win_api_x86_32 import winobjs
252252

253-
self.name2module = {}
254-
255-
# Load main pe
256-
with open(options.filename, "rb") as fstream:
257-
self.pe = vm_load_pe(
258-
self.jitter.vm,
259-
fstream.read(),
260-
load_hdr=options.load_hdr,
261-
name=options.filename,
262-
winobjs=winobjs,
263-
)
264-
self.name2module[self.fname_basename] = self.pe
253+
module_image_base = self.loader.load_module(options.filename)
254+
name = self.loader.module_base_address_to_name[module_image_base]
255+
self.pe = self.loader.module_name_to_module[name]
265256
winobjs.current_pe = self.pe
266257

267-
def load_base_dll(self):
268-
from miasm.os_dep.win_api_x86_32 import winobjs
269-
from miasm.jitter.loader.pe import vm_load_pe_libs, fix_pe_imports
270-
271-
# Load libs in memory
272-
self.name2module.update(
273-
vm_load_pe_libs(
274-
self.jitter.vm,
275-
self.LOADED_DLLS,
276-
self.loader,
277-
self.PATH_DLLS,
278-
winobjs=winobjs,
279-
)
280-
)
281-
282-
# Patch libs imports
283-
for name, pe in self.name2module.items():
284-
fix_pe_imports(self.jitter.vm, pe, self.loader, pe_name=name)
285-
286-
def load_dependencies(self):
287-
from miasm.os_dep.win_api_x86_32 import winobjs
288-
from miasm.jitter.loader.pe import vm_load_pe_and_dependencies
289-
290-
vm_load_pe_and_dependencies(
291-
self.jitter.vm,
292-
self.fname_basename,
293-
self.name2module,
294-
self.loader,
295-
self.PATH_DLLS,
296-
winobjs=winobjs,
297-
)
298-
299258
def set_call_handler(self, custom_methods):
300259
# Library calls handler
301260
from miasm.os_dep import win_api_x86_32
@@ -306,27 +265,14 @@ def set_call_handler(self, custom_methods):
306265
methods.update(custom_methods)
307266
self.jitter.add_lib_handler(self.loader, methods)
308267

309-
def fix_pe_imports(self):
310-
# Fix pe imports
311-
from miasm.jitter.loader.pe import fix_pe_imports
312-
313-
fix_pe_imports(
314-
self.jitter.vm, self.pe, self.loader, pe_name=self.fname_basename
315-
)
316-
317268
def __init__(self, jitter, options, custom_methods=None):
318269
self.fname_basename = os.path.basename(options.filename).lower()
319270
self.jitter = jitter
320271

321272
self.init_stack()
322273
self.init_loader(options)
323274
self.load_main_pe(options)
324-
if options.loadbasedll:
325-
self.load_base_dll()
326-
if options.dependencies:
327-
self.load_dependencies()
328275

329-
self.fix_pe_imports()
330276
self.set_call_handler(custom_methods)
331277

332278
# Manage SEH
@@ -419,7 +365,7 @@ def init_loader(self, options):
419365
loader_start_address = int(options.loader_start_address, 0)
420366
else:
421367
loader_start_address = None
422-
loader = LoaderWindows(apiset=apiset, loader_start_address=loader_start_address)
368+
loader = LoaderWindows(self.jitter.vm, apiset=apiset, loader_start_address=loader_start_address)
423369
self.loader = loader
424370
winobjs.loader = loader
425371

@@ -503,7 +449,7 @@ def __init__(self, jitter, options, custom_methods=None):
503449
self.jitter.init_stack()
504450

505451
# Import manager
506-
self.loader = LoaderUnix()
452+
self.loader = LoaderUnix(self.jitter.vm)
507453

508454
with open(options.filename, "rb") as fstream:
509455
self.elf = vm_load_elf(
@@ -562,7 +508,7 @@ def __init__(self, jitter, options, custom_methods=None):
562508
self.jitter.init_stack()
563509

564510
# Import manager
565-
self.loader = LoaderUnix()
511+
self.loader = LoaderUnix(self.jitter.vm)
566512

567513
data = open(options.filename, "rb").read()
568514
options.load_base_addr = int(options.load_base_addr, 0)

miasm/jitter/jitload.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,7 @@ def handle_lib(jitter):
491491
"""Resolve the name of the function which cause the handler call. Then
492492
call the corresponding handler from users callback.
493493
"""
494-
fname = jitter.libs.fad2cname[jitter.pc]
494+
fname = jitter.loader.function_address_to_canonical_name[jitter.pc]
495495
if fname in jitter.user_globals:
496496
func = jitter.user_globals[fname]
497497
else:
@@ -510,21 +510,21 @@ def handle_function(self, f_addr):
510510
"""Add a breakpoint which will trigger the function handler"""
511511
self.add_breakpoint(f_addr, self.handle_lib)
512512

513-
def add_lib_handler(self, libs, user_globals=None):
514-
"""Add a function to handle libs call with breakpoints
515-
@libs: libimp instance
513+
def add_lib_handler(self, loader, user_globals=None):
514+
"""Add a function to handle loader call with breakpoints
515+
@loader: Loader instance
516516
@user_globals: dictionary for defined user function
517517
"""
518518
if user_globals is None:
519519
user_globals = {}
520520

521-
self.libs = libs
521+
self.loader = loader
522522
out = {}
523523
for name, func in viewitems(user_globals):
524524
out[name] = func
525525
self.user_globals = out
526526

527-
for f_addr in libs.fad2cname:
527+
for f_addr in loader.function_address_to_canonical_name:
528528
self.handle_function(f_addr)
529529

530530
def eval_expr(self, expr):

miasm/jitter/loader/elf.py

+12-2
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def preload_elf(vm, e, loader, patch_vm_imp=True, loc_db=None):
4343
continue
4444
for ad in ads:
4545
ad_base_lib = loader.lib_get_add_base(libname)
46-
ad_libfunc = loader.lib_get_add_func(ad_base_lib, libfunc, ad)
46+
ad_libfunc = loader.resolve_function(vm, ad_base_lib, libfunc, ad)
4747

4848
libname_s = canon_libname_libfunc(libname, libfunc)
4949
dyn_funcs[libname_s] = ad_libfunc
@@ -317,7 +317,17 @@ def vm_load_elf(vm, fdata, name="", base_addr=0, loc_db=None, apply_reloc=False,
317317

318318

319319
class LoaderUnix(Loader):
320-
pass
320+
321+
def lib_get_add_base(self, name):
322+
name = name.lower().strip(' ')
323+
if name in self.module_name_to_base_address:
324+
ad = self.module_name_to_base_address[name]
325+
else:
326+
ad = self.fake_library_entry(name)
327+
return ad
328+
329+
def resolve_function(self, vm, libad, imp_ord_or_name, dst_ad=None):
330+
return self.fake_resolve_function(libad, imp_ord_or_name, dst_ad=dst_ad)
321331

322332

323333
class libimp_elf(LoaderUnix):

0 commit comments

Comments
 (0)