使用 010 Editor 模板 MachO.bt 去分析 Mach-O 文件格式,提示一个错误 Hit an unknown or unsupported load command : [-2147483608],如下图:

对比出错的地方,仔细查看模板文件的代码,找到了是因为 LC_MAIN 这个 loadcommand 的错误信息,需要修改两个地方,第 331 行的
MAIN = 0x28 修改成 MAIN = 0x28 | REQ_DYLD,然后在 838 行 switch 语句的 default 上面添加以下代码。

case MAIN:uint64  entryoff;  /* file (__TEXT) offset of main() */uint64  stacksize;/* if not zero, initial stack size */break;

保存模板文件之后再运行,就发现解析正常了,效果如下图:

修改后的 MachO.bt 如下:

//------------------------------------------------
//--- 010 Editor v3.2.2 Binary Template
//
//   File: MachO.bt
//   Authors: Tim "diff" Strazzere
//   Revisor: exchen
//   E-mail: diff@lookout.com, strazz@gmail.com
//   Version: 1.4
//   Purpose: Quick template for parsing Mach-o binaries,
//            including Mac OS X executables, .o and .dylib files.
//  Category: Executable
// File Mask: *,*.o,*.dylib
//  ID Bytes: CF FA ED FE, CE FA ED FE, BE BA FE CA, CA FE BA BE
//   History:
//   1.4   2017-03-17 swigger at gmail.com: enable encryption segment 64.
//   1.3   2016-06-08 N Moinvaziri: Fixed definition of section_64. Offset should have been uint64 and reserved3 missing.
//   1.2   2016-02-12 SweetScape Software: Updated header for repository submission.
//   1.1   T Strazzere: - Minimum version load command now properly outputs the format for better readability
//                      - Added a readvalue function for the header, helps understand headers at a glance
//   1.0   T Strazzere: - Correctly parses FAT headers and will continue to parse the rest of the combined
//                        binary
//                      - Added many todo's to make the output more pretty
//                      - Fixed some broken LoadCommands (64bit ones mainly), will gracefully fail if unknown
//                        LoadCommand is hit
//                      - Found some bugs in 010Editor and added fixes to try to avoid those
//   1.0   T Strazzere: - First stab it this, lots of issues - FAT binaries don't work at all
//
// Known issues:
//  - Needs optimized structures otherwise anything of a decent size will kill it
//    (Related to an 010Editor template bug)
//------------------------------------------------// Mach-o's should be Little Endian only -- except for the fat_header/fat_arch
LittleEndian();typedef enum <uint> {MACHO_32        = 0xFEEDFACE, // 32-bit mach object fileMACHO_64        = 0xFEEDFACF, // 64-bit mach object fileMACHO_FAT       = 0xCAFEBABE, // Universal object file / FAT_MAGICMACHO_FAT_CIGAM = 0xBEBAFECA
} Magic <format=hex>;#define CPU_ARCH_MASK       0xff000000
#define CPU_ARCH_ABI64      0x01000000// This looks ugly due to a limitation (bug?) in 010Editor template processing,
// basically we're unable to define more constant using other constants - it doesn't
// see them as already being processed when trying to define others (though it won't
// error on this until it hits this when trying to access that constant)
#define CPU_TYPE_X86        0x7
#define CPU_TYPE_I386       0x7 // CPU_TYPE_X86
#define CPU_TYPE_X86_64     (0x7 | 0x01000000) // (CPU_TYPE_X86 | CPU_ARCH_ABI64)
#define CPU_TYPE_POWERPC    0x12
#define CPU_TYPE_POWERPC64  (0x12 | 0x01000000) // (CPU_TYPE_POWERPC | CPU_ARCH_ABI64)
#define CPU_TYPE_ARM        0xCtypedef enum <uint> {MACH_OBJECT       = 0x1,MACH_EXECUTE      = 0x2,MACH_FVMLIB       = 0x3,MACH_CORE         = 0x4,MACH_PRELOAD      = 0x5,MACH_DYLIB        = 0x6,MACH_DYLINKER     = 0x7,MACH_BUNDLE       = 0x8,MACH_DYLIB_STUB   = 0x9,MACH_DSYM         = 0xA,MACH_KEXT_BUNDLE  = 0xB,
} FileType;typedef enum <uint> {i386_THREAD_STATE       = 0x1,i386_FLOAT_STATE        = 0x2,i386_EXCEPTION_STATE    = 0x3
} i386ThreadFlavor <format=hex>;typedef struct {uint32 eax <format=hex>;uint32 ebx <format=hex>;uint32 ecx <format=hex>;uint32 edx <format=hex>;uint32 edi <format=hex>;uint32 esi <format=hex>;uint32 ebp <format=hex>;uint32 esp <format=hex>;uint32 ss <format=hex>;uint32 eflags <format=hex>;uint32 eip <format=hex>;uint32 cs <format=hex>;uint32 ds <format=hex>;uint32 es <format=hex>;uint32 fs <format=hex>;uint32 gs <format=hex>;
} i386ThreadState;typedef enum <uint> {x86_THREAD_STATE32      = 0x1,x86_FLOAT_STATE32       = 0x2,x86_EXCEPTION_STATE32   = 0x3,x86_THREAD_STATE64      = 0x4,x86_FLOAT_STATE64       = 0x5,x86_EXCEPTION_STATE64   = 0x6,x86_THREAD_STATE        = 0x7,x86_FLOAT_STATE         = 0x8,x86_EXCEPTION_STATE     = 0x9,x86_DEBUG_STATE32       = 0xA,x86_DEBUG_STATE64       = 0xB,x86_DEBUG_STATE         = 0xC,THREAD_STATE_NONE       = 0xD
} x86ThreadFlavor <format=hex>;typedef struct {uint64 rax <format=hex>;uint64 rbx <format=hex>;uint64 rcx <format=hex>;uint64 rdx <format=hex>;uint64 rdi <format=hex>;uint64 rsi <format=hex>;uint64 rbp <format=hex>;uint64 rsp <format=hex>;uint64 r8 <format=hex>;uint64 r9 <format=hex>;uint64 r10 <format=hex>;uint64 r11 <format=hex>;uint64 r12 <format=hex>;uint64 r13 <format=hex>;uint64 r14 <format=hex>;uint64 r15 <format=hex>;uint64 rip <format=hex>;uint64 rflags <format=hex>;uint64 cs <format=hex>;uint64 fs <format=hex>;uint64 gs <format=hex>;
} x86ThreadState;typedef enum <uint> {PPC_THREAD_STATE        = 0x1,PPC_FLOAT_STATE         = 0x2,PPC_EXCEPTION_STATE     = 0x3,PPC_VECTOR_STATE        = 0x4,PPC_THREAD_STATE64      = 0x5,PPC_EXCEPTION_STATE64   = 0x6
} PPCThreadFlavor <format=hex>;typedef struct {uint32 r0 <format=hex>;uint32 r1 <format=hex>;uint32 r2 <format=hex>;uint32 r3 <format=hex>;uint32 r4 <format=hex>;uint32 r5 <format=hex>;uint32 r6 <format=hex>;uint32 r7 <format=hex>;uint32 r8 <format=hex>;uint32 r9 <format=hex>;uint32 r10 <format=hex>;uint32 r11 <format=hex>;uint32 r12 <format=hex>;uint32 r13 <format=hex>;uint32 r14 <format=hex>;uint32 r15 <format=hex>;uint32 r16 <format=hex>;
} ARMThreadState;typedef struct {uint32 __srr0 <comment="Instruction address register (PC)">;uint32 __srr1 <comment="Machine state register (supervisor)">;uint32 __r0;uint32 __r1;uint32 __r2;uint32 __r3;uint32 __r4;uint32 __r5;uint32 __r6;uint32 __r7;uint32 __r8;uint32 __r9;uint32 __r10;uint32 __r11;uint32 __r12;uint32 __r13;uint32 __r14;uint32 __r15;uint32 __r16;uint32 __r17;uint32 __r18;uint32 __r19;uint32 __r20;uint32 __r21;uint32 __r22;uint32 __r23;uint32 __r24;uint32 __r25;uint32 __r26;uint32 __r27;uint32 __r28;uint32 __r29;uint32 __r30;uint32 __r31;uint32 __cr <comment="Condition register">;uint32 __xer <comment="User's integer exception register">;uint32 __lr <comment="Link register">;uint32 __ctr <comment="Count register">;uint32 __mq <comment="MQ Register (601 only)">;uint32 __vrsave <comment="Vector save register">;
} PPCThreadState;typedef enum <uint> {MACH_NOUNDEFS                   = 0x1,MACH_INCRLINK                   = 0x2,MACH_DYLDLINK                   = 0x4,MACH_BINDATLOAD                 = 0x8,MACH_PREBOUND                   = 0x10,MACH_SPLIT_SEGS                 = 0x20,MACH_LAZY_INIT                  = 0x40,MACH_TWOLEVEL                   = 0x80,MACH_FORCE_FLAT                 = 0x100,MACH_NOMULTIDEFS                = 0x200,MACH_NOFIXPREBINDING            = 0x400,MACH_PREBINDABLE                = 0x800,MACH_ALLMODSBOUND               = 0x1000,MACH_SUBSECTIONS_VIA_SYMBOLS    = 0x2000,MACH_CANONICAL                  = 0x4000,MACH_WEAK_DEFINES               = 0x8000,MACH_BINDS_TO_WEAK              = 0x10000,MACH_ALLOW_STACK_EXECUTION      = 0x20000,MACH_ROOT_SAFE                  = 0x40000,MACH_SETUID_SAFE                = 0x80000,MACH_NO_REEXPORTED_DYLIBS       = 0x100000,MACH_PIE                        = 0x200000,MACH_DEAD_STRIPPABLE_DYLIB      = 0x400000,MACH_HAS_TLV_DESCRIPTORS        = 0x800000,MACH_NO_HEAP_EXECUTION          = 0x1000000
} Flags;typedef struct {uint32 cpu_type <comment="CPU specifier", format=hex>;// TODO : Extract out capabilities hereuint32 cpu_sub_type <comment="Machine specifier", format=hex>;uint32 file_offset  <comment="Offset of header in file">;uint32 size  <comment="Size of object file">;uint32 align  <comment="alignment as a power of two">;
} Fat_Arch;typedef struct {Magic magic <comment="Magic bytes for the file">;if(magic == MACHO_FAT || magic == MACHO_FAT_CIGAM) {// Need to switch to BigEndian!BigEndian();uint32 fat_arch_size <comment="Number of fat_arch structs">;Fat_Arch fat_arch[fat_arch_size];// Switch back to LittleEndian for rest of parsingLittleEndian();} else {uint32 cpu_type <comment="CPU specifier", format=hex>;uint32 cpu_sub_type <comment="Machine specifier", format=hex>;FileType file_type;uint32 num_load_commands;uint32 size_of_load_commands;Flags flags;}if(magic == MACHO_64) {uint32 reserved;}
} Header <read=HeaderRead>;string HeaderRead(Header &header) {local string header_string;switch(header.magic) {case MACHO_FAT :case MACHO_FAT_CIGAM :header_string = "FAT header";break;case MACHO_32 :header_string = "32bit Mach-O header";break;case MACHO_64 :header_string = "64bit Mach-O header";break;default :header_string = "Unknown header!";}return header_string;
}#define REQ_DYLD (0x80000000)typedef enum <uint> {SEGMENT                 = 0x1,SYM_TAB                 = 0x2,SYM_SEG                 = 0x3,THREAD                  = 0x4,UNIX_THREAD             = 0x5,LOAD_FVM_LIB            = 0x6,ID_FVM_LIB              = 0x7,IDENT                   = 0x8,FVM_FILE                = 0x9,PREPAGE                 = 0xA,DY_SYM_TAB              = 0xB,LOAD_DYLIB              = 0xC,ID_DYLIB                = 0xD,LOAD_DYLINKER           = 0xE,ID_DYLINKER             = 0xF,PREBOUND_DYLIB          = 0x10,ROUTINES                = 0x11,SUB_FRAMEWORK           = 0x12,SUB_UMBRELLA            = 0x13,SUB_CLIENT              = 0x14,SUB_LIBRARY             = 0x15,TWOLEVEL_HINTS          = 0x16,PREBIND_CKSUM        = 0x17,LOAD_WEAK_DYLIB         = 0x18 | REQ_DYLD,SEGMENT_64              = 0x19,ROUTINES_64             = 0x1A,UUID                    = 0x1B,RPATH                   = 0x1C | REQ_DYLD,CODE_SIGNATURE          = 0x1D,SEGMENT_SPLIT_INFO      = 0x1E,REEXPORT_DYLIB          = 0x1F | REQ_DYLD,LAZY_LOAD_DYLIB         = 0x20,ENCRYPTION_INFO         = 0x21,DYLD_INFO               = 0x22,DYLD_INFO_ONLY          = 0x22 | REQ_DYLD,LOAD_UPWARD_DYLIB       = 0x23 | REQ_DYLD,VERSION_MIN_MAC_OSX     = 0x24,VERSION_MIN_IPHONE_OS   = 0x25,FUNCTION_STARTS         = 0x26,DYLD_ENVIRONMENT        = 0x27,MAIN                    = 0x28 | REQ_DYLD,DATA_IN_CODE            = 0x29,SOURCE_VERSION          = 0x2A,DYLIB_CODE_SIGN_DRS     = 0x2B,ENCRYPTION_INFO_64 = 0x2c,
} LoadCommandType <read=LoadCommandTypeRead>;string LoadCommandTypeRead(LoadCommandType &loadCommandType) {switch(loadCommandType) {case SEGMENT :return "SEGMENT";case SYM_TAB :return "SYM_TAB";case SYM_SEG :return "SYM_SEG";case THREAD :return "THREAD";case UNIX_THREAD :return "UNIX_THREAD";case LOAD_FVM_LIB :return "LOAD_FVM_LIB";case ID_FVM_LIB :return "ID_FVM_LIB";case IDENT :return "IDENT";case FVM_FILE :return "FVM_FILE";case PREPAGE :return "PREPAGE";case DY_SYM_TAB :return "DY_SYM_TAB";case LOAD_DYLIB :return "LOAD_DYLIB";case ID_DYLIB :return "ID_DYLIB";case LOAD_DYLINKER :return "LOAD_DYLINKER";case ID_DYLINKER :return "ID_DYLINKER";case PREBOUND_DYLIB :return "PREBOUND_DYLIB";case ROUTINES :return "ROUTINES";case SUB_FRAMEWORK :return "SUB_FRAMEWORK";case SUB_UMBRELLA :return "SUB_UMBRELLA";case SUB_CLIENT :return "SUB_CLIENT";case SUB_LIBRARY :return "SUB_LIBRARY";case TWOLEVEL_HINTS :return "TWOLEVEL_HINTS";case PREBIND_CKSUM :return "PREBIND_CKSUM";case LOAD_WEAK_DYLIB :return "LOAD_WEAK_DYLIB";case SEGMENT_64 :return "SEGMENT_64";case ROUTINES_64 :return "ROUTINES_64";case UUID :return "UUID";case RPATH :return "RPATH";case CODE_SIGNATURE :return "CODE_SIGNATURE";case SEGMENT_SPLIT_INFO :return "SEGMENT_SPLIT_INFO";case REEXPORT_DYLIB :return "REEXPORT_DYLIB";case LAZY_LOAD_DYLIB :return "LAZY_LOAD_DYLIB";case ENCRYPTION_INFO :return "ENCRYPTION_INFO";case DYLD_INFO :return "DYLD_INFO";case DYLD_INFO_ONLY :return "DYLD_INFO_ONLY";case LOAD_UPWARD_DYLIB :return "LOAD_UPWARD_DYLIB";case VERSION_MIN_MAC_OSX :return "VERSION_MIN_MAC_OSX";case VERSION_MIN_IPHONE_OS :return "VERSION_MIN_IPHONE_OS";case FUNCTION_STARTS :return "FUNCTION_STARTS";case DYLD_ENVIRONMENT :return "DYLD_ENVIRONMENT";case MAIN :return "MAIN";case DATA_IN_CODE :return "DATA_IN_CODE";case SOURCE_VERSION :return "SOURCE_VERSION";case DYLIB_CODE_SIGN_DRS :return "DYLIB_CODE_SIGN_DRS";case ENCRYPTION_INFO_64:return "ENCRYPTION_INFO_64";default :return "Error";}
}typedef struct {char section_name[16];char segment_name[16];uint32 address <format=hex>;uint32 size <format=hex>;uint32 offset;uint32 section_alignment;uint32 relocation_entry_offset;uint32 number_of_relocation_entries;uint32 flags <format=hex>;uint32 reserved1;uint32 reserved2;
} Section <optimize=false>;typedef struct {char section_name[16];char segment_name[16];uint64 address <format=hex>;uint64 size <format=hex>;uint32 offset;uint32 section_alignment;uint32 relocation_entry_offset;uint32 number_of_relocation_entries;uint32 flags <format=hex>;uint32 reserved1;uint32 reserved2;uint32 reserved3;
} Section64 <optimize=false>;typedef uint vm_proc;typedef enum <uint> {HIGH_VM                 = 0x1,FVM_LIB                 = 0x2,NO_RELOC                = 0x4,PROTECTION_VERSION_1    = 0x8
} SegmentFlags <format=hex>;typedef struct {uint32 load_command_string_offset <comment="Offset in respect to the start of load command to string data">; local int64 pos = FTell();// We need to goto beginning of LoadCommand, then goto the offsetFSeek(FTell() - (sizeof(uint32) * 3) + load_command_string_offset);string string_data <comment="Load command string">;FSeek(pos);
} LoadCommandString <read=LoadCommandStringRead>;string LoadCommandStringRead(LoadCommandString &loadCommandString) {return loadCommandString.string_data;
};typedef ubyte Uuid[16] <read=UuidRead, format=hex>;// TODO : Clean this ugly thing up
string UuidRead(Uuid uuid) {local string ret, tmp;local int i;for(i = 0; i<4; i++) {SPrintf(tmp, "%.2X", uuid[i]);ret += tmp;}ret += "-";for(i = 0; i<2; i++) {SPrintf(tmp, "%.2X", uuid[i+4]);ret += tmp;}ret += "-";for(i = 0; i<2; i++) {SPrintf(tmp, "%.2X", uuid[i+6]);ret += tmp;}ret += "-";for(i = 0; i<2; i++) {SPrintf(tmp, "%.2X", uuid[i+8]);ret += tmp;}ret += "-";for(i = 0; i<6; i++) {SPrintf(tmp, "%.2X", uuid[i+10]);ret += tmp;}return ret;
}typedef struct {uint32 version;
} Version <read=VersionRead>;string VersionRead(Version &version) {local string version_string;if(version.version & 0xFF == 0) {SPrintf(version_string, "%u.%u", version.version >> 16, (version.version >> 8) & 0xFF);} else {SPrintf(version_string, "%u.%u.%u", version.version >> 16, (version.version >> 8) & 0xFF, version.version & 0xFF);}return version_string;
}typedef struct {//LoadCommandHead loadCommandHead <comment="Load command type and size">;LoadCommandType command;uint command_size;// Process rest of load command based on command typeswitch(command) {case ID_DYLIB :case LOAD_DYLIB :case LOAD_WEAK_DYLIB :case REEXPORT_DYLIB :LoadCommandString name;// TODO : Pretty print thisuint32 timestamp;// TODO : Pretty print thisuint32 current_version;// TODO : Pretty print thisuint32 compatibility_version;// Seek to the beginning of the LoadCommandFSeek(FTell() - (sizeof(uint32) * 6));// Then skip to the end of the command based on the command_sizeFSkip(command_size);break;case SYM_TAB :uint32 symbol_table_offset <comment="Symbol table offsett address">;uint32 number_of_symbol_table_entries <comment="Number of symbol table entries">;uint32 string_table_offset <comment="String table offset">;uint32 string_table_size <comment="String table size in bytes">;break;case DYLD_INFO :case DYLD_INFO_ONLY :uint32 rebase_offset;uint32 rebase_size;uint32 bind_offset;uint32 bind_size;uint32 weak_bind_offset;uint32 weak_bind_size;uint32 lazy_bind_offset;uint32 lazy_bind_size;uint32 export_offset;uint32 export_size;break;case DY_SYM_TAB :uint32 index_local_symbols;uint32 local_symbols_size;uint32 index_externally_defined_symbols;uint32 externally_defined_symbols_size;uint32 index_undefined_symbols;uint32 undefined_symbols_size;uint32 table_contents_offset;uint32 enteries_toc_size;uint32 file_offset_module_table;uint32 module_table_entries_size;uint32 external_references_symbol_table_offset;uint32 external_references_symbol_table_size;uint32 indirect_symbol_table_offset;uint32 indirect_symbol_table_size;uint32 external_relocation_entries_offset;uint32 external_relocation_entries_size;uint32 local_relocation_entries_offset;uint32 local_relocation_entries_size;break;case UUID :Uuid uuid;break;case VERSION_MIN_MAC_OSX :case VERSION_MIN_IPHONE_OS :// TODO : Pretty print thisVersion version;uint32 reserved <comment="Should be zero">;break;case FUNCTION_STARTS :case CODE_SIGNATURE :case SEGMENT_SPLIT_INFO:case DATA_IN_CODE:uint32 data_offset;uint32 data_size;break;case UNIX_THREAD :case THREAD :switch(cpu_typer) {case CPU_TYPE_X86 :case CPU_TYPE_I386 :i386ThreadFlavor flavor;// TODO : Pretty print thisuint32 count;switch(flavor) {case i386_THREAD_STATE :i386ThreadState threadState;// TODO : Flesh these guys outcase i386_FLOAT_STATE :case i386_EXCEPTION_STATE :}break;case CPU_TYPE_X86_64 :x86ThreadFlavor flavor;// TODO : Pretty print thisuint32 count;switch(flavor) {case x86_THREAD_STATE64 :x86ThreadState threadState;break;// TODO : Flesh these guys outcase x86_FLOAT_STATE64 :case x86_EXCEPTION_STATE64 :case x86_DEBUG_STATE64 :}break;case CPU_TYPE_POWERPC :case CPU_TYPE_POWERPC64 :PPCThreadFlavor flavor;// TODO : Pretty print thisuint32 count;switch(flavor) {case PPC_THREAD_STATE :PPCThreadState threadState;break;// TODO : Flesh these guys outcase  PPC_FLOAT_STATE  :case PPC_EXCEPTION_STATE :case PPC_VECTOR_STATE :case PPC_THREAD_STATE64 :case PPC_EXCEPTION_STATE64 :}break;case CPU_TYPE_ARM :// TODO: Unsure if this is correct ?
//                uint32 flavor;
//                uint32 count;ARMThreadState threadState;break;}break;case FVM_LIB :case ID_FVM_LIB :LoadCommandString name <comment="Fixed virtual memory library's target path name">;uint32 minor_version <comment="Library's minor version number">;uint32 header_address <comment="Library's header address">;//        Reposition(command_size, sizeof(uint32) * 5);// Seek to the beginning of the LoadCommandFSeek(FTell() - (sizeof(uint32) * 5));// Then skip to the end of the command based on the command_sizeFSkip(command_size);break;case SUB_FRAMEWORK :LoadCommandString umbrella <comment="Umbrella framework name">;// Seek to the beginning of the LoadCommandFSeek(FTell() - (sizeof(uint32) * 3));// Then skip to the end of the command based on the command_sizeFSkip(command_size);break;case SUB_CLIENT :LoadCommandString client <comment="Client name">;// Seek to the beginning of the LoadCommandFSeek(FTell() - (sizeof(uint32) * 3));// Then skip to the end of the command based on the command_sizeFSkip(command_size);break;case SUB_UMBRELLA :LoadCommandString sub_umbrella <comment="Sub umbrella framework name">;// Seek to the beginning of the LoadCommandFSeek(FTell() - (sizeof(uint32) * 3));// Then skip to the end of the command based on the command_sizeFSkip(command_size);break;case SUB_LIBRARY :LoadCommandString sub_library <comment="Sub library name">;// Seek to the beginning of the LoadCommandFSeek(FTell() - (sizeof(uint32) * 3));// Then skip to the end of the command based on the command_sizeFSkip(command_size);break;case PREBOUND_DYLIB :LoadCommandString name <comment="Library's path name">;uint32 modules_size <comment="Number of modules inside library">;LoadCommandString linked_modules <comment="Bit vector of linked modules">;// Seek to the beginning of the LoadCommandFSeek(FTell() - (sizeof(uint32) * 5));// Then skip to the end of the command based on the command_sizeFSkip(command_size);break;case ID_DYLINKER :case LOAD_DYLINKER :LoadCommandString name <comment="Dynamic linker's path name">;// Seek to the beginning of the LoadCommandFSeek(FTell() - (sizeof(uint32) * 3));// Then skip to the end of the command based on the command_sizeFSkip(command_size);break;case ROUTINES_64 :uint64 init_address <comment="Address of initialization routine">;uint64 init_module <comment="Index into module table that init routine is defined">;uint32 reversed_1;uint32 reversed_2;uint32 reversed_3;uint32 reversed_4;uint32 reversed_5;uint32 reversed_6;break;case ROUTINES :uint32 init_address <comment="Address of initialization routine">;uint32 init_module <comment="Index into module table that init routine is defined">;uint32 reversed_1;uint32 reversed_2;uint32 reversed_3;uint32 reversed_4;uint32 reversed_5;uint32 reversed_6;break;case TWOLEVEL_HINTS :uint32 offset <comment="Offset into the hint table">;uint32 hints_size <comment="Number of hints inside the hints table">;break;case PREBIND_CKSUM :uint32 cksum <comment="Checksum or zero">;break;case RPATH:LoadCommandString path <comment="Path to add to run path">;// Seek to the beginning of the LoadCommandFSeek(FTell() - (sizeof(uint32) * 3));// Then skip to the end of the command based on the command_sizeFSkip(command_size);break;case ENCRYPTION_INFO :uint32 crypt_offset <comment="File offset of encrypted range">;uint32 crypt_size <comment="File size of the encrypted range">;uint32 crypt_id <comment="Which encryption system, 0 means not-encrypted yet">;break;case IDENT :break;case FVM_FILE :LoadCommandString name <comment="File's pathname">;uint32 header_address <comment="File's virtual address">;// Seek to the beginning of the LoadCommandFSeek(FTell() - (sizeof(uint32) * 4));// Then skip to the end of the command based on the command_sizeFSkip(command_size);break;case SEGMENT_64 :char segment_name[16];uint64 vm_address <format=hex>;uint64 vm_size <format=hex>;uint64 file_off;uint64 file_size;vm_proc maximum_protection <format=hex>;vm_proc initial_protection <format=hex>;uint32 number_of_sections;// TODO : Fix this enumSegmentFlags flags;// Having this if statement will prevent warnings in 010Editorif(number_of_sections > 0) {Section64 section[number_of_sections];}break;case SEGMENT :char segment_name[16];uint32 vm_address <format=hex>;uint32 vm_size <format=hex>;uint32 file_off;uint32 file_size;vm_proc maximum_protection <format=hex>;vm_proc initial_protection <format=hex>;uint32 number_of_sections;// TODO : Fix this enumSegmentFlags flags;// Having this if statement will prevent warnings in 010Editorif(number_of_sections > 0) {Section section[number_of_sections];}break;case SOURCE_VERSION:uint32 unka;uint32 unkb;break;case ENCRYPTION_INFO_64:uint32 cryptoff  <format=hex>; /* file offset of encrypted range */uint32   cryptsize <format=hex>; /* file size of encrypted range */uint32 cryptid;    /* which enryption system, 0 means not-encrypted yet */uint32   pad;        /* padding to make this struct's size a multiple of 8 */break;case MAIN:uint64  entryoff;  /* file (__TEXT) offset of main() */uint64  stacksize;/* if not zero, initial stack size */break;default :Warning("Hit an unknown or unsupported load command : [%d]", command);Exit(-1);}
} LoadCommand <read=LoadCommandReader, optimize=false>;string LoadCommandReader(LoadCommand &loadCommand) {return LoadCommandTypeRead(loadCommand.command) + " load command";
}Header header <comment="Mach-o header information">;
local uint32 cpu_typer;
if(header.magic == MACHO_32 || header.magic == MACHO_64) {cpu_typer = header.cpu_type;// If we didn't find a FAT header, then just process the load commandsLoadCommand loadCommand[header.num_load_commands];
} else {// Otherwise we need to grab the new headers againlocal int i;for(i = 0; i < header.fat_arch_size; i++) {FSeek(header.fat_arch[i].file_offset);Header machHeader;cpu_typer = machHeader.cpu_type;LoadCommand loadCommand[machHeader.num_load_commands];}
}

原文地址:https://www.exchen.net/ios-hacker-%E4%BF%AE%E6%AD%A3-010-editor-%E6%A8%A1%E6%9D%BF%E6%96%87%E4%BB%B6-macho-bt-%E7%9A%84%E9%94%99%E8%AF%AF.html

修正 010 Editor 模板文件 MachO.bt 的错误相关推荐

  1. 十六进制编辑器 010 Editor

    010Editor脚本语法入门:https://www.jianshu.com/p/ba60ebd8f916 宇宙最强 010 Editor 模板开发教程(附带示例):https://bbs.pedi ...

  2. Java操作word模板文件

    关于导出word文档,之前想过用ireport但模板文件比较复杂不容易画.所以采取了Java操作word文件,替换word中的元素方法 模板文件如下 单位名称:$ACCTNAME$ NO: $SN$ ...

  3. 【Android 逆向】ELF 文件格式 ( 安装 010 Editor 二进制查看工具的 ELF.bt 插件模板 | 安装 ELF.bt 模板 | 打开 ELF 文件 )

    文章目录 一.搜索并下载 ELF.bt 模板 二.安装 ELF.bt 模板 三.打开 ELF 文件 一.搜索并下载 ELF.bt 模板 进入 010 Editor 工具的插件模板下载页面 http:/ ...

  4. 【开发环境】010 Editor 工具 ( 工具下载 | 二进制文件分析模板模板安装 | 快捷键查看与设置 )

    文章目录 一.010 Editor 工具下载 二.010 Editor 安装二进制文件分析模板 三.010 Editor 快捷键查看与设置 一.010 Editor 工具下载 下载地址 : https ...

  5. 010 Editor没有Template Results -DEX.bt 解决方法

    问题描述: 打开010 Editor 把classes.dex拖进去 发现没有Template Results -DEX.bt 解决方法: 打开模板仓库-找到操作系统模块属性下的DEX.bt 安装后 ...

  6. 16进制 转为图片 php_十六进制编辑器(010 Editor)官方版下载_十六进制编辑器(010 Editor) v11.0中文汉化版64位...

    010 Editor是一款专业的文本编辑器和十六进制编辑器,它可以编辑文本文件,包括 Uni code 文件.批处理文件.C/C++.XML 等,功能全面且强大,可以说是目前最强大的十六进制编辑器了. ...

  7. 使用 010 Editor 分析二进制文件格式

    010 Editor 是一款很好用的编辑器,其中有一个很好的特点是可以运行模板文件来分析二进制文件. 官网地址是:http://www.sweetscape.com 模板文件地址是:http://ww ...

  8. 010 Editor:二进制文件编辑利器

    使用010 Editor编辑二进制文件非常简单,只需打开目标文件即可.你可以使用导航面板轻松浏览文件内容,并直接在十六进制编辑器中进行编辑. 010 Editor还提供了强大的模板功能,通过自定义模板 ...

  9. 010 Editor 注册码

    正如官方宣言一样,Edit anyting,功能是非常强大的. 用户名:www.budingwang.com 注册码:CR96-4B9C-6470-303F 用户名:www.budingwang.co ...

最新文章

  1. 剑指offer-调整数组顺序使奇数位于偶数前面
  2. 查看Unix/Linux的CPU个数和内存大小,系统位数(转载)
  3. linux centos grub grub2 加密、清除
  4. xamarin 学习笔记02- IOS Simulator for windows 安装
  5. 012_Redis的aof持久化方式
  6. Windows——蓝屏[失败的操作:WdFilter.sys]解决方案
  7. Python入门学习之异常处理机制
  8. 计算机配置 凭据分配,win7怎样添加凭据?-win7添加凭证的方法 - 河东软件园
  9. 文字描边_巧用Illustrator“3D”和“凸出和斜角”功能,制作炫酷立体文字
  10. php网页错误404,php出现404错误页面的解决方法
  11. 实验设计与分析 (总结8)
  12. 位、字节、字、字长的概念以及存储单位的的换算
  13. Html中锚点的使用
  14. 怎么将pdf转换成excel转换器免费版
  15. H5二维码海报生成保存相关问题记录
  16. 基于道格拉斯普克算法的轮廓点简化
  17. 43-为什么要训练数据集与测试数据集
  18. Graph Theory 离散数学第六章
  19. rtmp jwplayer简单应用
  20. Plato Farm-以柏拉图为目标的农场元宇宙游戏

热门文章

  1. 驱动_Input输入子系统
  2. mysql 远程连接
  3. 作为我的第一篇csdn博客吧
  4. 分别用ToolBar和自定义导航栏实现沉浸式状态栏
  5. HTML 常用标签演示
  6. [备忘]WPF的Colors类
  7. WebKit 与 V8 的关系
  8. c++实现高精度乘法!
  9. PHP-代码审计-文件读取(下载)
  10. PHP XAMPP配置PHP环境和Apache80端口被占用解决方案