Separated configuration for analysis into YAML file
This commit is contained in:
		
							parent
							
								
									d46d725409
								
							
						
					
					
						commit
						7f34e298b8
					
				
					 3 changed files with 219 additions and 233 deletions
				
			
		
							
								
								
									
										6
									
								
								NOTES.md
									
										
									
									
									
								
							
							
						
						
									
										6
									
								
								NOTES.md
									
										
									
									
									
								
							|  | @ -2,6 +2,7 @@ | ||||||
| 
 | 
 | ||||||
| - Engine: ScrapEngine | - Engine: ScrapEngine | ||||||
| - Ingame Scripting Language: Python 1.5.2 | - Ingame Scripting Language: Python 1.5.2 | ||||||
|  | - Interesting memory locations and functions are noted in `config.yml` | ||||||
| 
 | 
 | ||||||
| # Launch options: | # Launch options: | ||||||
| 
 | 
 | ||||||
|  | @ -32,11 +33,6 @@ | ||||||
|   * `idiota` |   * `idiota` | ||||||
|   * `capullo` |   * `capullo` | ||||||
| 
 | 
 | ||||||
| ## Python Stuff |  | ||||||
| 
 |  | ||||||
| - `0x79C698`: Modules List (Module Name as `char*`  followed by Pointer to Init Function) |  | ||||||
| - `0x5A8FB0`: InitPyMod |  | ||||||
| - `0x5A8390`: PyExec |  | ||||||
| 
 | 
 | ||||||
| ## Other interesting Memory Addresses | ## Other interesting Memory Addresses | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										195
									
								
								config.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										195
									
								
								config.yml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,195 @@ | ||||||
|  | notes: | | ||||||
|  |   0x7faa4c: temp storage? | ||||||
|  |   0x7d2094: some reference count | ||||||
|  | 
 | ||||||
|  | comments: | ||||||
|  |   0x6113f9: Check if Window exists | ||||||
|  | 
 | ||||||
|  | flags: | ||||||
|  |   0x7FE944: P_World | ||||||
|  |   0x7FBE4C: P_Vars | ||||||
|  |   0x79C698: Py_Mods | ||||||
|  |   0x852914: P_D3D8_Dev | ||||||
|  |   0x7FCC00: N_Paks_opened | ||||||
|  |   0x7fcbec: Hash_Index_Size | ||||||
|  |   0x7fcbf0: P_Hash_Index | ||||||
|  |   0x7fcc08: Lst_File | ||||||
|  |   0x7fcc04: Pak_Locked | ||||||
|  |   0x7fc1b0: Pak_Index | ||||||
|  |   0x84cb64: P_ConHandler | ||||||
|  |   0x801e10: num_arrows | ||||||
|  |   0x7fac84: P_Callbacks | ||||||
|  |   0x80b2cc: P_ActClassList | ||||||
|  |   0x807a20: P_Scorer | ||||||
|  |   0x80a398: P_SoundSys | ||||||
|  |   0x84cb58: H_RichEd | ||||||
|  |   0x84cb4c: P_HWND_Console | ||||||
|  |   0x80cb40: Console_Win_Buffer | ||||||
|  |   0x84d400: Lib_preloaded | ||||||
|  |   0x7fac1c: Activate_Viewer | ||||||
|  |   0x8b18f0: P_Models | ||||||
|  |   0x8b18f4: P_Scenes | ||||||
|  |   0x8b18f8: P_ActiveModels | ||||||
|  |   0x803bc0: net_is_server | ||||||
|  |   0x8045e4: net_is_master | ||||||
|  |   0x8038a8: net_is_client | ||||||
|  |   0x7fadd8: is_python | ||||||
|  |   0x7fc084: pak_lock | ||||||
|  |   0x7fbe7c: current_language | ||||||
|  |   0x7d2094: py_refcnt_unk | ||||||
|  | 
 | ||||||
|  | VMTs: | ||||||
|  |   0x78d4d8: Py_entity | ||||||
|  |   0x78cc6c: World | ||||||
|  |   0x78b680: FilePak_1 | ||||||
|  |   0x78b6a4: FilePak_2 | ||||||
|  |   0x78b638: AbstractFile | ||||||
|  |   0x78b4d8: App | ||||||
|  |   0x78b480: Window | ||||||
|  |   0x78b5c0: File | ||||||
|  |   0x78b65c: FileMem | ||||||
|  |   0x78b6d0: IDevice_1 | ||||||
|  |   0x78b6f4: IDevice_2 | ||||||
|  |   0x78b6fc: IDevice_Kb | ||||||
|  |   0x78b720: IDevice_Mouse | ||||||
|  |   0x78b74c: IDevice_Joy | ||||||
|  |   0x7933ac: 3d_Gfx | ||||||
|  |   0x7933a0: NodeFX | ||||||
|  | 
 | ||||||
|  | types: | ||||||
|  |   - "struct PyMethodDef { char *ml_name; void *ml_meth; int ml_flags; char *ml_doc;};" | ||||||
|  |   - "struct GameVar { struct GameVar* next; const char* name; const char* desc; uint64_t d_type; void* value; void* def_value; };" | ||||||
|  |   - "struct HT_Entry { void* data; const char* key; struct HT_Entry* next;};" | ||||||
|  |   - "struct PakEntry { unsigned char* filename; bool locked; void* data; uint32_t seek;};" | ||||||
|  |   - "struct HashIndexEntry { uint32_t offset; uint32_t size; uint32_t status; const char* name; struct HashIndexEntry* next; };" | ||||||
|  |   - "struct HashIndex { uint32_t size; struct HashIndexEntry** data; };" | ||||||
|  |   - "struct HashTableEntry { void* data; const char *key; struct HashTableEntry* next; };" | ||||||
|  |   - "struct HashTable { uint32_t size; struct HashTableEntry** data; };" | ||||||
|  | 
 | ||||||
|  | function_signatures: | ||||||
|  |   0x5A8390: "int PyRun_SimpleString(const char* command);" | ||||||
|  |   0x5BB9D0: "int PyArg_ParseTuple(void* PyObj, char* format, ...);" | ||||||
|  |   0x413ee0: "int dbg_log(const char* fmt,...);" | ||||||
|  |   0x4134C0: "int write_log(unsigned int color, const char* msg);" | ||||||
|  |   0x47C1E0: "int ht_hash_ent_list(const char* str);" | ||||||
|  |   0x404BB0: "int ht_hash_ent(const char* str);" | ||||||
|  |   0x4016F0: "int reg_get_val(const char* value);" | ||||||
|  |   0x414280: "int prepare_html_log(const char* filename);" | ||||||
|  |   0x6597d0: "bool read_ini_entry(void* dest,const char* key, const char* section);" | ||||||
|  |   0x5A8FB0: "void* Py_InitModule(const char* name,void* methods);" | ||||||
|  |   0x5E3800: "int fopen_from_pak(const char* filename);" | ||||||
|  |   0x419950: "int fopen_2(const char* filename);" | ||||||
|  |   0x41AB50: "int open_pak(const char* filename, int unk_1,void* unk_ptr);" | ||||||
|  |   0x404460: "int register_c_callback(const char* name,void* func);" | ||||||
|  |   0x414070: "void throw_assertion_2(const char* check,const char* file,const char* date, unsigned int line);" | ||||||
|  |   0x5FBC50: "void throw_assertion_1(const char* check,const char* file, unsigned int line);" | ||||||
|  |   0x5BC140: "static char* convertsimple1(void *arg, char **p_format, void *p_va);" | ||||||
|  |   0x5E3800: "int32_t fopen_from_pak(const char* filename,const char* mode);" | ||||||
|  |   0x5a90f0: "void* Py_BuildValue(const char* format, ...);" | ||||||
|  |   0x5B9E70: "void* PyObject_GetAttrString(void* obj, const char* attr);" | ||||||
|  | 
 | ||||||
|  | functions: | ||||||
|  |   0x6B1C70: strcmp | ||||||
|  |   0x5BB9D0: PyArg_ParseTuple | ||||||
|  |   0x5DD510: init_engine_3d | ||||||
|  |   0x401180: create_window | ||||||
|  |   0x401240: create_main_window | ||||||
|  |   0x4016F0: reg_get_val | ||||||
|  |   0x4134C0: write_log | ||||||
|  |   0x414280: prepare_html_log | ||||||
|  |   0x418220: get_version_info | ||||||
|  |   0x4137E0: write_html_log | ||||||
|  |   0x402190: handle_console_input | ||||||
|  |   0x5F9520: handle_render_console_input | ||||||
|  |   0x404A50: find_entity | ||||||
|  |   0x47C1E0: ht_hash_ent_list | ||||||
|  |   0x404BB0: ht_hash_ent | ||||||
|  |   0x404460: register_c_callback | ||||||
|  |   0x417470: load_game | ||||||
|  |   0x5E3800: fopen_from_pak | ||||||
|  |   0x5e3500: fopen | ||||||
|  |   0x403370: init_debug | ||||||
|  |   0x401770: init | ||||||
|  |   0x4026D0: init_py | ||||||
|  |   0x405B40: init_py_sub | ||||||
|  |   0x5A8FB0: Py_InitModule | ||||||
|  |   0x41AB50: open_pak | ||||||
|  |   0x5A8390: PyRun_SimpleString | ||||||
|  |   0x414570: setup_game_vars | ||||||
|  |   0x5FBC50: throw_assertion_1 | ||||||
|  |   0x414070: throw_assertion_2 | ||||||
|  |   0x5F7000: read_ini | ||||||
|  |   0x650F80: load_sm3 | ||||||
|  |   0x6665A0: load_m3d_1 | ||||||
|  |   0x666900: load_m3d_2 | ||||||
|  |   0x479B20: world_constructor | ||||||
|  |   0x479B40: init_world | ||||||
|  |   0x402510: deinit_world | ||||||
|  |   0x479870: make_world | ||||||
|  |   0x602A70: render_frame | ||||||
|  |   0x6B738C: handle_exception | ||||||
|  |   0x5B9E70: PyObject_GetAttrString | ||||||
|  |   0x413ee0: dbg_log | ||||||
|  |   0x5f75e0: init_d3d | ||||||
|  |   0x63a2f0: gdi_draw_line | ||||||
|  |   0x5e3250: read_stream | ||||||
|  |   0x5e3bb0: read_stream_wrapper | ||||||
|  |   0x50b9b0: init_scorer | ||||||
|  |   0x582e10: init_action_class_list | ||||||
|  |   0x528910: init_sound_sys | ||||||
|  |   0x5268d0: try_init_sound_sys | ||||||
|  |   0x404280: cPyFunction_set_func | ||||||
|  |   0x414680: load_config | ||||||
|  |   0x414810: save_config | ||||||
|  |   0x4f42a0: close_server_socket | ||||||
|  |   0x4f4d10: close_server | ||||||
|  |   0x4f48e0: close_client | ||||||
|  |   0x4f4fb0: is_server | ||||||
|  |   0x4f4a10: is_client | ||||||
|  |   0x4fac50: is_master | ||||||
|  |   0x526910: close_sound_sys | ||||||
|  |   0x526520: shutdown_sound_sys | ||||||
|  |   0x5dd700: close_3d_engine | ||||||
|  |   0x5a7320: close_window | ||||||
|  |   0x5dff20: set_exception_handler | ||||||
|  |   0x5a7f20: get_console_wnd | ||||||
|  |   0x5a73a0: show_console | ||||||
|  |   0x666c60: read_m3d | ||||||
|  |   0x417df0: snprintf | ||||||
|  |   0x5fc930: printf | ||||||
|  |   0x6597d0: read_ini_entry | ||||||
|  |   0x5fc0a0: engine_debug_log | ||||||
|  |   0x5a7440: create_console_window | ||||||
|  |   0x6114e0: setup_window | ||||||
|  |   0x404420: clear_functions | ||||||
|  |   0x405ca0: close_py_subsys | ||||||
|  |   0x50bcb0: close_scorer | ||||||
|  |   0x479b20: close_world | ||||||
|  |   0x582e70: close_action_class | ||||||
|  |   0x50b6a0: get_scorer | ||||||
|  |   0x50ea20: scorer_parse_type | ||||||
|  |   0x636580: list_models | ||||||
|  |   0x5a90f0: Py_BuildValue | ||||||
|  |   0x41c5a0: has_lst_file | ||||||
|  |   0x5a8e90: py_error | ||||||
|  |   0x5a9890: get_module_dict | ||||||
|  |   0x5c7bb0: get_current_thread | ||||||
|  |   0x5aa140: preload_lib | ||||||
|  |   0x413c10: sprintf | ||||||
|  |   0x405850: check_is_python | ||||||
|  |   0x47bf90: setup_ent_list | ||||||
|  |   0x474f80: ent_list_get_set | ||||||
|  | 
 | ||||||
|  | script: | | ||||||
|  |   e asm.cmt.right = true | ||||||
|  |   e cmd.stack = true | ||||||
|  |   e scr.utf8 = true | ||||||
|  |   e asm.describe = false | ||||||
|  |   e graph.cmtright = true | ||||||
|  |   e cfg.sandbox = false | ||||||
|  |   e cfg.newtab = true | ||||||
|  |   e cfg.fortunes.type = tips,fun,creepy,nsfw | ||||||
|  |   e dbg.status = true | ||||||
|  |   e pdb.autoload = true | ||||||
|  |   e emu.str = true | ||||||
|  |   e asm.flags.offset = true | ||||||
							
								
								
									
										251
									
								
								r2_analyze.py
									
										
									
									
									
								
							
							
						
						
									
										251
									
								
								r2_analyze.py
									
										
									
									
									
								
							|  | @ -7,14 +7,16 @@ from tqdm import tqdm | ||||||
| from pprint import pprint | from pprint import pprint | ||||||
| import os | import os | ||||||
| import sys | import sys | ||||||
|  | import yaml | ||||||
| 
 | 
 | ||||||
| r2cmds = [] | r2cmds = [] | ||||||
| x64_dbg_script=[] | x64_dbg_script=[] | ||||||
|  | script_path = os.path.dirname(os.path.abspath(__file__)) | ||||||
| scrap_exe = os.path.abspath(sys.argv[1]) | scrap_exe = os.path.abspath(sys.argv[1]) | ||||||
| folder = os.path.abspath(os.path.dirname(scrap_exe)) | scrapland_folder = os.path.abspath(os.path.dirname(scrap_exe)) | ||||||
| script_path=os.path.join(folder, "scrap_dissect.r2") | r2_script_path=os.path.join(scrapland_folder, "scrap_dissect.r2") | ||||||
| x64_dbg_script_path=os.path.join(folder, "scrap_dissect.x32dbg.txt") | x64_dbg_script_path=os.path.join(scrapland_folder, "scrap_dissect.x32dbg.txt") | ||||||
| json_path=os.path.join(folder, "scrap_dissect.json") | json_path=os.path.join(scrapland_folder, "scrap_dissect.json") | ||||||
| 
 | 
 | ||||||
| assert os.path.isfile(scrap_exe), "File not found!" | assert os.path.isfile(scrap_exe), "File not found!" | ||||||
| r2 = r2pipe.open(scrap_exe) | r2 = r2pipe.open(scrap_exe) | ||||||
|  | @ -75,237 +77,33 @@ def analysis(full=False): | ||||||
|         print(f"[*] Running '{ac}'") |         print(f"[*] Running '{ac}'") | ||||||
|         r2_cmd(f"{ac} 2>NUL") |         r2_cmd(f"{ac} 2>NUL") | ||||||
| 
 | 
 | ||||||
| # 0x7fac20 | with open(os.path.join(script_path,"config.yml")) as cfg: | ||||||
| # 0x7fac19 |     print("[*] Loading config") | ||||||
| # 0x7faa4c |     config = type("Config",(object,),yaml.load(cfg,Loader=yaml.SafeLoader)) | ||||||
| # 0x7fac1c # activate viewer |  | ||||||
| # 0x84d400 # lib preloaded |  | ||||||
| 
 | 
 | ||||||
| # 0x413ee0 | for line in config.script.strip().splitlines(): | ||||||
| 
 |  | ||||||
| # 0x7d2094 refcnt |  | ||||||
| 
 |  | ||||||
| comments= { |  | ||||||
|     0x6113f9:"Check if Window exists" |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| flags = { |  | ||||||
|     0x7FE944: "P_World",  |  | ||||||
|     0x7FBE4C: "P_Vars",  |  | ||||||
|     0x79C698: "Py_Mods",  |  | ||||||
|     0x852914: "P_D3D8_Dev",  |  | ||||||
|     0x7FCC00: "N_Paks_opened",  |  | ||||||
|     0x7fcbec: "Hash_Index_Size",  |  | ||||||
|     0x7fcbf0: "P_Hash_Index",  |  | ||||||
|     0x7fcc08: "Lst_File",  |  | ||||||
|     0x7fcc04: "Pak_Locked",  |  | ||||||
|     0x7fc1b0: "Pak_Index",  |  | ||||||
|     0x84cb64: "P_ConHandler",  |  | ||||||
|     0x801e10: "num_arrows",  |  | ||||||
|     0x7fac84: "P_Callbacks",  |  | ||||||
|     0x80b2cc: "P_ActClassList",  |  | ||||||
|     0x807a20: "P_Scorer",  |  | ||||||
|     0x80a398: "P_SoundSys",  |  | ||||||
|     0x84cb58: "H_RichEd", |  | ||||||
|     0x84cb4c: "P_HWND_Console", |  | ||||||
|     0x80cb40: "Console_Win_Buffer", |  | ||||||
|     0x84d400: "Lib_preloaded", |  | ||||||
|     0x7fac1c: "Activate_Viewer", |  | ||||||
|     0x8b18f0: "P_Models", |  | ||||||
|     0x8b18f4: "P_Scenes", |  | ||||||
|     0x8b18f8: "P_ActiveModels", |  | ||||||
|     0x803bc0: "net_is_server", |  | ||||||
|     0x8045e4: "net_is_master", |  | ||||||
|     0x8038a8: "net_is_client", |  | ||||||
|     0x7fadd8: "is_python", |  | ||||||
|     0x7fc084: "pak_lock", |  | ||||||
|     0x7fbe7c: "current_language", |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| VMTs = { |  | ||||||
|     0x78d4d8: "Py_entity", |  | ||||||
|     0x78cc6c: "World", |  | ||||||
|     0x78b680: "FilePak_1", |  | ||||||
|     0x78b6a4: "FilePak_2", |  | ||||||
|     0x78b638: "AbstractFile", |  | ||||||
|     0x78b4d8: "App", |  | ||||||
|     0x78b480: "Window", |  | ||||||
|     0x78b5c0: "File", |  | ||||||
|     0x78b65c: "FileMem", |  | ||||||
|     0x78b6d0: "IDevice_1", |  | ||||||
|     0x78b6f4: "IDevice_2", |  | ||||||
|     0x78b6fc: "IDevice_Kb", |  | ||||||
|     0x78b720: "IDevice_Mouse", |  | ||||||
|     0x78b74c: "IDevice_Joy", |  | ||||||
|     0x7933ac: "3d_Gfx", |  | ||||||
|     0x7933a0: "NodeFX", |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| types = [ |  | ||||||
|     "struct PyMethodDef { char *ml_name; void *ml_meth; int ml_flags; char *ml_doc;};", |  | ||||||
|     "struct GameVar { struct GameVar* next; const char* name; const char* desc; uint64_t d_type; void* value; void* def_value; };", |  | ||||||
|     "struct HT_Entry { void* data; const char* key; struct HT_Entry* next;};", |  | ||||||
|     "struct PakEntry { unsigned char* filename; bool locked; void* data; uint32_t seek;};", |  | ||||||
|     "struct HashIndexEntry { uint32_t offset; uint32_t size; uint32_t status; const char* name; struct HashIndexEntry* next; };", |  | ||||||
|     "struct HashIndex { uint32_t size; struct HashIndexEntry** data; };", |  | ||||||
|     "struct HashTableEntry { void* data; const char *key; struct HashTableEntry* next; };", |  | ||||||
|     "struct HashTable { uint32_t size; struct HashTableEntry** data; };", |  | ||||||
| ] |  | ||||||
| 
 |  | ||||||
| func_sigs = { |  | ||||||
|     0x5A8390: "int py_exec(const char* script);", |  | ||||||
|     0x5BB9D0: "int PyArg_ParseTuple(void* PyObj, char* format, ...);", |  | ||||||
|     0x413ee0: "int dbg_log(const char* fmt,...);", |  | ||||||
|     0x4134C0: "int write_log(unsigned int color, const char* msg);", |  | ||||||
|     0x47C1E0: "int ht_hash_ent_list(const char* str);", |  | ||||||
|     0x404BB0: "int ht_hash_ent(const char* str);", |  | ||||||
|     0x4016F0: "int reg_get_val(const char* value);", |  | ||||||
|     0x414280: "int prepare_html_log(const char* filename);", |  | ||||||
|     0x6597d0: "bool read_ini_entry(void* dest,const char* key, const char* section);", |  | ||||||
|     0x5A8FB0: "void* Py_InitModule(const char* name,void* methods);", |  | ||||||
|     0x5E3800: "int fopen_from_pak(const char* filename);", |  | ||||||
|     0x419950: "int fopen_2(const char* filename);", |  | ||||||
|     0x41AB50: "int open_pak(const char* filename, int unk_1,void* unk_ptr);", |  | ||||||
|     0x404460: "int register_c_callback(const char* name,void* func);", |  | ||||||
|     0x414070: "void throw_assertion_2(const char* check,const char* file,const char* date, unsigned int line);", |  | ||||||
|     0x5FBC50: "void throw_assertion_1(const char* check,const char* file, unsigned int line);", |  | ||||||
|     0x5BC140: "static char* convertsimple1(void *arg, char **p_format, void *p_va);", |  | ||||||
|     0x5E3800: "int32_t fopen_from_pak(const char* filename,const char* mode);", |  | ||||||
|     0x5a90f0: "void* Py_BuildValue(const char* format, ...);" |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| functions = { |  | ||||||
|     0x6B1C70: "strcmp", |  | ||||||
|     0x5BB9D0: "PyArg_ParseTuple", |  | ||||||
|     0x5DD510: "init_engine_3d", |  | ||||||
|     0x401180: "create_window", |  | ||||||
|     0x401240: "create_main_window", |  | ||||||
|     0x4016F0: "reg_get_val", |  | ||||||
|     0x4134C0: "write_log", |  | ||||||
|     0x414280: "prepare_html_log", |  | ||||||
|     0x418220: "get_version_info", |  | ||||||
|     0x4137E0: "write_html_log", |  | ||||||
|     0x402190: "handle_console_input", |  | ||||||
|     0x5F9520: "handle_render_console_input", |  | ||||||
|     0x404A50: "find_entity", |  | ||||||
|     0x47C1E0: "ht_hash_ent_list", |  | ||||||
|     0x404BB0: "ht_hash_ent", |  | ||||||
|     0x404460: "register_c_callback", |  | ||||||
|     0x417470: "load_game", |  | ||||||
|     0x5E3800: "fopen_from_pak", |  | ||||||
|     0x5e3500: "fopen", |  | ||||||
|     0x403370: "init_debug", |  | ||||||
|     0x401770: "init", |  | ||||||
|     0x4026D0: "init_py", |  | ||||||
|     0x405B40: "init_py_sub", |  | ||||||
|     0x5A8FB0: "Py_InitModule", |  | ||||||
|     0x41AB50: "open_pak", |  | ||||||
|     0x5A8390: "py_exec", |  | ||||||
|     0x414570: "setup_game_vars", |  | ||||||
|     0x5FBC50: "throw_assertion_1", |  | ||||||
|     0x414070: "throw_assertion_2", |  | ||||||
|     0x5F7000: "read_ini", |  | ||||||
|     0x650F80: "load_sm3", |  | ||||||
|     0x6665A0: "load_m3d_1", |  | ||||||
|     0x666900: "load_m3d_2", |  | ||||||
|     0x479B20: "world_constructor", |  | ||||||
|     0x479B40: "init_world", |  | ||||||
|     0x402510: "deinit_world", |  | ||||||
|     0x479870: "make_world", |  | ||||||
|     0x602A70: "render_frame", |  | ||||||
|     0x6B738C: "handle_exception", |  | ||||||
|     0x5B9E70: "py_getattr", |  | ||||||
|     0x413ee0: "dbg_log", |  | ||||||
|     0x5f75e0: "init_d3d", |  | ||||||
|     0x63a2f0: "gdi_draw_line", |  | ||||||
|     0x5e3250: "read_stream", |  | ||||||
|     0x5e3bb0: "read_stream_wrapper", |  | ||||||
|     0x50b9b0: "init_scorer", |  | ||||||
|     0x582e10: "init_action_class_list", |  | ||||||
|     0x528910: "init_sound_sys", |  | ||||||
|     0x5268d0: "try_init_sound_sys", |  | ||||||
|     0x404280: "cPyFunction_set_func", |  | ||||||
|     0x414680: "load_config", |  | ||||||
|     0x414810: "save_config", |  | ||||||
|     0x4f42a0: "close_server_socket", |  | ||||||
|     0x4f4d10: "close_server", |  | ||||||
|     0x4f48e0: "close_client", |  | ||||||
|     0x4f4fb0: "is_server", |  | ||||||
|     0x4f4a10: "is_client", |  | ||||||
|     0x4fac50: "is_master", |  | ||||||
|     0x526910: "close_sound_sys", |  | ||||||
|     0x526520: "shutdown_sound_sys", |  | ||||||
|     0x5dd700: "close_3d_engine", |  | ||||||
|     0x5a7320: "close_window", |  | ||||||
|     0x5dff20: "set_exception_handler", |  | ||||||
|     0x5a7f20: "get_console_wnd", |  | ||||||
|     0x5a73a0: "show_console", |  | ||||||
|     0x666c60: "read_m3d", |  | ||||||
|     0x417df0: "snprintf", |  | ||||||
|     0x5fc930: "printf", |  | ||||||
|     0x6597d0: "read_ini_entry", |  | ||||||
|     0x5fc0a0: "engine_debug_log", |  | ||||||
|     0x5a7440: "create_console_window", |  | ||||||
|     0x6114e0: "setup_window", |  | ||||||
|     0x404420: "clear_functions", |  | ||||||
|     0x405ca0: "close_py_subsys", |  | ||||||
|     0x50bcb0: "close_scorer", |  | ||||||
|     0x479b20: "close_world", |  | ||||||
|     0x582e70: "close_action_class", |  | ||||||
|     0x50b6a0: "get_scorer", |  | ||||||
|     0x50ea20: "scorer_parse_type", |  | ||||||
|     0x636580: "list_models", |  | ||||||
|     0x5a90f0: "Py_BuildValue", |  | ||||||
|     0x41c5a0: "has_lst_file", |  | ||||||
|     0x5a8e90: "py_error", |  | ||||||
|     0x5a9890: "get_module_dict", |  | ||||||
|     0x5c7bb0: "get_current_thread", |  | ||||||
|     0x5aa140: "preload_lib", |  | ||||||
|     0x413c10: "sprintf", |  | ||||||
|     0x405850: "check_is_python", |  | ||||||
|     0x47bf90: "setup_ent_list", |  | ||||||
|     0x474f80: "ent_list_get_set", |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # 0x853954 ??? some obj ptr |  | ||||||
| 
 |  | ||||||
| # [0x7fbe98] |  | ||||||
| 
 |  | ||||||
| # [0x853954]+0x2a3cc debug flag, checked in 0x006113a0 called from 0x005dd5ea |  | ||||||
| cfg=""" |  | ||||||
| e asm.cmt.right = true |  | ||||||
| e cmd.stack = true |  | ||||||
| e scr.utf8 = true |  | ||||||
| e asm.describe = false |  | ||||||
| e graph.cmtright = true |  | ||||||
| e cfg.sandbox = false |  | ||||||
| e cfg.newtab = true |  | ||||||
| e cfg.fortunes.type = tips,fun,creepy,nsfw |  | ||||||
| e dbg.status = true |  | ||||||
| e pdb.autoload = true |  | ||||||
| e emu.str = true |  | ||||||
| e asm.flags.offset = true |  | ||||||
| """.strip().splitlines() |  | ||||||
| for line in cfg: |  | ||||||
|     r2_cmd(line) |     r2_cmd(line) | ||||||
| 
 | 
 | ||||||
| analysis(False) | analysis(False) | ||||||
| 
 | 
 | ||||||
| for addr,comment in comments.items(): | for addr,comment in config.comments.items(): | ||||||
|     r2_cmd(f"CC {comment} @ {hex(addr)}") |     r2_cmd(f"CC {comment} @ {hex(addr)}") | ||||||
| 
 | 
 | ||||||
| for t in types: | for t in config.types: | ||||||
|     r2_cmd(f'"td {t}"') |     r2_cmd(f'"td {t}"') | ||||||
| 
 | 
 | ||||||
| for addr, name in flags.items(): | for addr, name in config.flags.items(): | ||||||
|     x64_dbg_label(addr,name,"loc") |     x64_dbg_label(addr,name,"loc") | ||||||
|     r2_cmd(f"f loc.{name} 4 {hex(addr)}") |     r2_cmd(f"f loc.{name} 4 {hex(addr)}") | ||||||
| 
 | 
 | ||||||
| for addr, name in functions.items(): | 
 | ||||||
|  | for addr, name in config.functions.items(): | ||||||
|     x64_dbg_label(addr,name,"fcn") |     x64_dbg_label(addr,name,"fcn") | ||||||
|     r2_cmd(f"afr fcn.{name} {hex(addr)}") |     r2_cmd(f"afr fcn.{name} {hex(addr)}") | ||||||
|     if addr in func_sigs: | 
 | ||||||
|         r2_cmd(f'"afs {func_sigs[addr]}" @{hex(addr)}') | for addr,sig in config.function_signatures: | ||||||
|  |     r2_cmd(f'"afs {config.function_signatures[addr]}" @{hex(addr)}') | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def vtables(): | def vtables(): | ||||||
|  | @ -314,7 +112,7 @@ def vtables(): | ||||||
|     vtables = r2_cmdJ("avj") |     vtables = r2_cmdJ("avj") | ||||||
|     for c in tqdm(vtables, ascii=True): |     for c in tqdm(vtables, ascii=True): | ||||||
|         methods = [] |         methods = [] | ||||||
|         name=VMTs.get(c.offset,f"{c.offset:08x}") |         name=config.VMTs.get(c.offset,f"{c.offset:08x}") | ||||||
|         x64_dbg_label(c.offset,name,"vmt") |         x64_dbg_label(c.offset,name,"vmt") | ||||||
|         r2_cmd(f"f vmt.{name} 4 {hex(c.offset)}") |         r2_cmd(f"f vmt.{name} 4 {hex(c.offset)}") | ||||||
|         for idx,m in enumerate(tqdm(c.methods, ascii=True, leave=False)): |         for idx,m in enumerate(tqdm(c.methods, ascii=True, leave=False)): | ||||||
|  | @ -389,17 +187,14 @@ def bb_refs(addr): | ||||||
|             ret[hit]["asm"].append(ins.disasm) |             ret[hit]["asm"].append(ins.disasm) | ||||||
|     return ret |     return ret | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| def world(): | def world(): | ||||||
|     print("[*] Parsing World offsets") |     print("[*] Parsing World offsets") | ||||||
|     return bb_refs("loc.P_World") |     return bb_refs("loc.P_World") | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| def render(): | def render(): | ||||||
|     print("[*] Parsing D3D_Device offsets") |     print("[*] Parsing D3D_Device offsets") | ||||||
|     return bb_refs("loc.P_D3D8_Dev") |     return bb_refs("loc.P_D3D8_Dev") | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| def py_mods(): | def py_mods(): | ||||||
|     print("[*] Parsing Python modules") |     print("[*] Parsing Python modules") | ||||||
|     res = r2_cmd("/r fcn.Py_InitModule ~CALL[1]").splitlines() |     res = r2_cmd("/r fcn.Py_InitModule ~CALL[1]").splitlines() | ||||||
|  | @ -498,7 +293,7 @@ with open(x64_dbg_script_path,"w") as of: | ||||||
| 
 | 
 | ||||||
| print("[+] Wrote scrap_dissect.x32dbg.txt") | print("[+] Wrote scrap_dissect.x32dbg.txt") | ||||||
| 
 | 
 | ||||||
| with open(script_path, "w") as of: | with open(r2_script_path, "w") as of: | ||||||
|     wcmds = [] |     wcmds = [] | ||||||
|     for cmd in r2cmds: |     for cmd in r2cmds: | ||||||
|         record=True |         record=True | ||||||
|  | @ -524,7 +319,7 @@ print("[+] Analysis took:",datetime.today()-t_start) | ||||||
| 
 | 
 | ||||||
| print("[+] Executing Cutter") | print("[+] Executing Cutter") | ||||||
| try: | try: | ||||||
|     start_program(['cutter','-A','0','-i',script_path,scrap_exe],cwd=folder,shell=False) |     start_program(['cutter','-A','0','-i',r2_script_path,scrap_exe],cwd=scrapland_folder,shell=False) | ||||||
| except FileNotFoundError: | except FileNotFoundError: | ||||||
|     print("[-] cutter not installed, falling back to r2") |     print("[-] cutter not installed, falling back to r2") | ||||||
|     start_program(['r2','-i',script_path,scrap_exe],cwd=folder,shell=False) |     start_program(['r2','-i',r2_script_path,scrap_exe],cwd=scrapland_folder,shell=False) | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue