Add web-based .packed explorer, updated parser and ghidra untility script
This commit is contained in:
		
							parent
							
								
									8e0df74541
								
							
						
					
					
						commit
						58407ecc9f
					
				
					 35 changed files with 3897 additions and 353 deletions
				
			
		
							
								
								
									
										125
									
								
								tools/ghidra_scripts/mark_up_py.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								tools/ghidra_scripts/mark_up_py.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,125 @@ | |||
| import time | ||||
| try: | ||||
|     import ghidra_bridge | ||||
|     has_bridge=True | ||||
| except ImportError: | ||||
|     has_bridge=False | ||||
| 
 | ||||
| from contextlib import contextmanager | ||||
| 
 | ||||
| if has_bridge: | ||||
|     import ghidra_bridge | ||||
|     b = ghidra_bridge.GhidraBridge(namespace=globals(), hook_import=True) | ||||
|     @contextmanager | ||||
|     def transaction(): | ||||
|         start() | ||||
|         try: | ||||
|             yield | ||||
|         except Exception as e: | ||||
|             end(False) | ||||
|             raise e | ||||
|         end(True) | ||||
| else: | ||||
|     @contextmanager | ||||
|     def transaction(): | ||||
|         yield | ||||
| 
 | ||||
| import ghidra.program.model.symbol.SymbolType as SymbolType | ||||
| import ghidra.program.model.symbol.SourceType as SourceType | ||||
| from ghidra.app.cmd.label import CreateNamespacesCmd | ||||
| from ghidra.program.model.data.DataUtilities import createData | ||||
| from ghidra.program.model.data.DataUtilities import ClearDataMode | ||||
| from ghidra.program.model.listing.CodeUnit import PLATE_COMMENT | ||||
| 
 | ||||
| listing = currentProgram.getListing() | ||||
| dtm = currentProgram.getDataTypeManager() | ||||
| py_mod = dtm.getDataType("/PyModuleDef") | ||||
| py_meth = dtm.getDataType("/PyMethodDef") | ||||
| 
 | ||||
| NULL=toAddr(0) | ||||
| 
 | ||||
| def make_namespace(parts): | ||||
|     ns_cmd = CreateNamespacesCmd("::".join(parts), SourceType.USER_DEFINED) | ||||
|     ns_cmd.applyTo(currentProgram) | ||||
|     return ns_cmd.getNamespace() | ||||
| 
 | ||||
| def create_data(addr,dtype): | ||||
|     return createData(currentProgram,addr,dtype,0,False,ClearDataMode.CLEAR_ALL_CONFLICT_DATA) | ||||
| 
 | ||||
| def create_str(addr): | ||||
|     if addr.equals(NULL): | ||||
|         return None | ||||
|     str_len = (findBytes(addr, b"\0").offset - addr.offset) + 1 | ||||
|     clearListing(addr, addr.add(str_len)) | ||||
|     return createAsciiString(addr) | ||||
| 
 | ||||
| def get_call_obj(addr): | ||||
|     func = getFunctionContaining(addr) | ||||
|     if func is None: | ||||
|         disassemble(addr) | ||||
|         func = createFunction(addr,None) | ||||
|     call_obj = {"this": None, "stack": []} | ||||
|     for inst in currentProgram.listing.getInstructions(func.body, True): | ||||
|         affected_objs = [r.toString() for r in inst.resultObjects.tolist()] | ||||
|         inst_name = inst.getMnemonicString() | ||||
|         if inst_name == "PUSH": | ||||
|             val=inst.getScalar(0) | ||||
|             if val is not None: | ||||
|                 call_obj["stack"].insert(0, toAddr(val.getValue()).toString()) | ||||
|         elif inst_name == "MOV" and "ECX" in affected_objs: | ||||
|             this = inst.getScalar(1) | ||||
|             if this is not None: | ||||
|                 call_obj["this"] = toAddr(this.getValue()).toString() | ||||
|         elif inst_name == "CALL": | ||||
|             break | ||||
|     func=func.symbol.address | ||||
|     return func, call_obj | ||||
| 
 | ||||
| def data_to_dict(data): | ||||
|     ret={} | ||||
|     for idx in range(data.dataType.getNumComponents()): | ||||
|         name=data.dataType.getComponent(idx).getFieldName() | ||||
|         value=data.getComponent(idx).getValue() | ||||
|         ret[name]=value | ||||
|     return ret | ||||
| 
 | ||||
| def try_create_str(addr): | ||||
|     ret=create_str(addr) | ||||
|     if ret: | ||||
|         return ret.getValue() | ||||
| 
 | ||||
| with transaction(): | ||||
|     PyInitModule=getSymbolAt(toAddr("006f31c0")) | ||||
|     for ref in getReferencesTo(PyInitModule.address).tolist(): | ||||
|         func,args=get_call_obj(ref.fromAddress) | ||||
|         print(func,args) | ||||
|         module_name=create_str(toAddr(args['stack'][0])).getValue() | ||||
|         methods=toAddr(args['stack'][1]) | ||||
|         module_doc=create_str(toAddr(args['stack'][2])) | ||||
|         if module_doc: | ||||
|             module_doc=module_doc.getValue() | ||||
|         print(methods,module_name,module_doc) | ||||
|         mod_ns = make_namespace(["Python", module_name]) | ||||
|         createLabel(func, "__init__", mod_ns, True, SourceType.USER_DEFINED) | ||||
|         if module_doc: | ||||
|             listing.getCodeUnitAt(func).setComment(PLATE_COMMENT,module_doc) | ||||
|         while True: | ||||
|             mod_data=data_to_dict(create_data(methods,py_meth)) | ||||
|             if mod_data['name'] is None: | ||||
|                 clearListing(methods, methods.add(16)) | ||||
|                 break | ||||
|             mod_data['name']=try_create_str(mod_data['name']) | ||||
|             try: | ||||
|                 mod_data['doc']=try_create_str(mod_data['doc']) | ||||
|             except: | ||||
|                 mod_data['doc']=None | ||||
|             print(mod_data) | ||||
|             createLabel(mod_data['ml_method'], mod_data['name'], mod_ns, True, SourceType.USER_DEFINED) | ||||
|             if mod_data['doc']: | ||||
|                 listing.getCodeUnitAt(mod_data['ml_method']).setComment(PLATE_COMMENT,module_doc) | ||||
|             methods=methods.add(16) | ||||
|             try: | ||||
|                 if getBytes(methods,4).tolist()==[0,0,0,0]: | ||||
|                     break | ||||
|             except: | ||||
|                 break | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue