iOS 应用程序 Mach-O 中没有 LC_UNIXTHREAD 段

逆向工程 ios 男子气概
2021-06-20 00:39:57

我正在分析 iOS 9.3.3 中可执行 Mach-O 文件的加载命令部分,Twitter 应用程序用于说明。

# otool -hV Twitter 
Twitter:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64 16777228          0  0x00     EXECUTE    49       4208   NOUNDEFS DYLDLINK TWOLEVEL PIE

我读过每个可执行文件都包含 LC_UNIXTHREAD 命令,该命令负责启动二进制文件的主线程。但是,在检查的文件中没有这样的命令。

# otool -l Twitter | grep LC_
      cmd LC_SEGMENT_64
      cmd LC_SEGMENT_64
      cmd LC_SEGMENT_64
      cmd LC_SEGMENT_64
     cmd LC_SYMTAB
            cmd LC_DYSYMTAB
          cmd LC_LOAD_DYLINKER
     cmd LC_UUID
          cmd LC_LOAD_DYLIB
          cmd LC_LOAD_DYLIB
          cmd LC_LOAD_DYLIB
          [...repetition omitted...]
          cmd LC_RPATH
          cmd LC_RPATH
      cmd LC_CODE_SIGNATURE

我不明白为什么它不在那里。它与此应用程序以移动用户权限运行或它是第三方的专有应用程序有什么共同之处吗?我发现这个 LC 命令例如用于 /bin/ls,但不适用于任何经过测试的专有应用程序。

1个回答

自从几个版本之前,LC_UNIXTHREAD已被弃用,取而代之的是新命令LC_MAIN.

#define LC_MAIN (0x28|LC_REQ_DYLD) /* replacement for LC_UNIXTHREAD */
struct entry_point_command {
    uint32_t  cmd;  /* LC_MAIN only used in MH_EXECUTE filetypes */
    uint32_t  cmdsize;  /* 24 */
    uint64_t  entryoff; /* file (__TEXT) offset of main() */
    uint64_t  stacksize;/* if not zero, initial stack size */
};

可能你otool的有点老,不支持它。