标签: otool

如何从iOS应用中删除这些变形的选择器

我需要帮助来删除我的iOS应用程序中已知的错误选择器。

苹果拒绝了我的应用程序,说:

关于准则2.3.1,此应用已通过验证,包含错误的选择器,例如- x7kQPFEZS4af59md1eVMqf42YSTGAZVO:i5B8qlaSJwvmVviceDOQkqQ0vwGq35XMmtV81zlsmHnws

我尝试运行列出所有符号的nm命令,然后使用grep搜索上述选择器:

grep -r x7kQPFEZS4af59md1eVMqf42YSTGAZVO。

grep -r i5B8qlaSJwvmVviceDOQkqQ0vwGq35XMmtV81zlsmHnws。

两个grep都显示以下结果:

二进制文件./Payload/MyAppName.app/MyAppName匹配

MyAppName是一个二进制文件(unix可执行文件)。

如何进一步进行操作,并从我的iOS应用程序中删除这些错误的选择器?(或至少找到创建此选择器的代码/框架)

obfuscation otool app-store ios nm

6
推荐指数
1
解决办法
1013
查看次数

使用otool(递归)查找应用程序所需的共享库

我有一个Cocoa应用程序,它使用otool来查找应用程序需要正常运行所需的共享库.例如,假设我在使用QTKit.framework的应用程序上运行otool -L.我得到了程序使用的共享库列表(包括Cocoa.framework和AppKit.framework等基本框架):

/System/Library/Frameworks/QTKit.framework/Versions/A/QTKit (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 476.0.0)
    /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 949.0.0)

..... and so on for a bunch of other frameworks
Run Code Online (Sandbox Code Playgroud)

这表明该应用程序使用QTKit.framework.但是,如果我在QTKit.framework(/System/Library/Frameworks/QTKit.framework/Versions/A/QTKit)的二进制文件上再次使用"otool -L",我会得到:

/System/Library/Frameworks/QTKit.framework/Versions/A/QTKit (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox (compatibility version 1.0.0, current version 1.0.0)
/System/Library/PrivateFrameworks/CoreMedia.framework/Versions/A/CoreMedia (compatibility version 1.0.0, current version 1.0.0)
/System/Library/PrivateFrameworks/MediaToolbox.framework/Versions/A/MediaToolbox (compatibility version 1.0.0, current version 1.0.0)
/System/Library/PrivateFrameworks/VideoToolbox.framework/Versions/A/VideoToolbox (compatibility version 1.0.0, current version 1.0.0)
/System/Library/PrivateFrameworks/CoreMediaIOServices.framework/Versions/A/CoreMediaIOServices (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version …
Run Code Online (Sandbox Code Playgroud)

cocoa frameworks shared-libraries otool

5
推荐指数
1
解决办法
5953
查看次数

如何确定反汇编代码在可执行文件中的位置?

我有一个包含错误的可执行文件(C++,i386,在 MacOS/X Tiger 下编译,如果重要的话)。该错误的修复很简单——代码中有一个地方调用 fork() 而它不应该。因为修复很简单,而且因为此时从头开始重新编译可执行文件会很困难(不要问),我想直接修补可执行文件/二进制文件。

作为迈出的第一步,我在我的可执行文件上运行了“otool -tV MyExecutableName”,瞧,我在反汇编输出中发现了这个:

./MyExecutableName:
(__TEXT,__text) section
[... many lines omitted ...]
0002ce0d        subl    $0x10,%esp
0002ce10        calll   0x0051adac
0002ce15        movzbl  0x14(%ebp),%esi
0002ce19        calll   0x00850ac9      ; symbol stub for: _fork
0002ce1e        cmpl    $0x00,%eax
0002ce21        jll     0x0002cf02
0002ce27        jle     0x0002ce34
[... many more lines omitted ...]
Run Code Online (Sandbox Code Playgroud)

所以我想做的是替换第 0002ce19 行的操作码,这样它就不会调用 _fork,而是无条件地跳转到失败情况(即它应该像 fork() 返回 -1 一样)

不幸的是,我在反汇编/二进制补丁方面是一个完全的新手,所以我不确定如何去做。特别是,我的问题是:

1)我应该将哪些字节写入位置 0002ce19 到 0002xe1d 以获得我想要的?我假设它是“jmp 0x0002cf02”的组装等价物,但我如何弄清楚这些字节是什么?

2) "otool -tV" 打印的偏移量似乎是到可执行文件的 __TEXT 段的偏移量。如何找出打印偏移量和文件顶部之间的字节增量,以便我可以编辑/修补文件中的正确字节?

感谢您提供的任何建议!

assembly executable patch otool

5
推荐指数
1
解决办法
1166
查看次数

install_name_tool -change静默失败,并忽略-headerpad_max_install_names标志

我有一个命令行可执行文件,其中包含指向dylib的链接,这些链接在分发时不会位于所返回的指定位置otool -L

例如,给定一个二进制文件foo

$ otool -L foo
  /opt/local/lib/libgcc/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.18.0)
  ...
Run Code Online (Sandbox Code Playgroud)

在我的安装程序中,我有一个试图install_name_tool -change用于修复此问题的安装后脚本,以便foo在其新位置链接到dylib。

例如:

$ sudo install_name_tool -change /opt/local/lib/libgcc/libstdc++.6.dylib /somewhere/else/more/sensible/libstdc++.6.dylib foo
Run Code Online (Sandbox Code Playgroud)

但是,此更改将被忽略,并且会静默失败。当我otool -L再次运行时:

$ otool -L foo
  /opt/local/lib/libgcc/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.18.0)
  ...
Run Code Online (Sandbox Code Playgroud)

没有改变。

我正在编译胖二进制文件,并尝试将-headerpad_max_install_names编译标志添加到32位Makefile中。这并没有解决问题,因为它install_name_tool -change仍然会静默失败。

我读到-headerpad_max_install_names在64位平台上没有任何作用,但是无论如何我还是将其添加到了64位Makefile中。可以预见,这也不能解决问题。

如何解决我的编译过程,以便最终可以更改链接的dylib的路径install_name_tool

macos gcc dylib otool install-name-tool

5
推荐指数
0
解决办法
964
查看次数

未加载 QMYSQL 驱动程序,尝试了所有提示

我正在使用 QT-Creator 作为 macOS 10.8 上的 IDE 使用 QT 5.3 编写 C++ 应用程序。当我尝试加载 QMYSQL 插件时出现问题

db = QSqlDatabase::addDatabase("QMYSQL");
Run Code Online (Sandbox Code Playgroud)

它导致

QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7
Run Code Online (Sandbox Code Playgroud)

所以我试过了

loader.setFileName("/Users/kilian/Qt/5.3/clang_64/plugins/sqldrivers/libqsqlmysql_debug.dylib");
qDebug() << loader.load();
qDebug() << loader.errorString();
Run Code Online (Sandbox Code Playgroud)

获得更好的输出

"Die Bibliothek /Users/foob/Qt/5.3/clang_64/plugins/sqldrivers/libqsqlmysql_debug.dylib kann nicht geladen werden:
(dlopen(/Users/foob/Qt/5.3/clang_64/plugins/sqldrivers/libqsqlmysql_debug.dylib, 5):
Library not loaded: libmysqlclient.18.dylib
Referenced from: /Users/foob/Qt/5.3/clang_64/plugins/sqldrivers/libqsqlmysql_debug.dylib
Reason: image not found)"
Run Code Online (Sandbox Code Playgroud)

所以我尝试了 otool

otool -L build-$appname-Desktop-Debug/$appname.app/Contents/MacOS/$appname 
build-$appname-Desktop-Debug/$appname.app/Contents/MacOS/$appname:
/usr/local/mysql/lib/libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
/Users/foob/Qt/5.3/clang_64/lib/QtWidgets.framework/Versions/5/QtWidgets (compatibility version 5.3.0, …
Run Code Online (Sandbox Code Playgroud)

c++ mysql macos qt otool

5
推荐指数
1
解决办法
1690
查看次数

使用位码更改 LC_ID_DYLIB 重新编译

我正在从启用位码的 iOS 源代码构建一个动态框架(使用cmakexcodebuild)。我使用lipoinstall_name_tool制作一个胖二进制文件并 update LC_ID_DYLIB,以便正确加载二进制文件。当我归档应用程序时,框架已正确签名并与应用程序一起打包。这是以下的输出file

MyFramework: Mach-O universal binary with 3 architectures: [arm_v7: Mach-O dynamically linked shared library arm_v7] [arm_v7s] [arm64]
MyFramework (for architecture armv7):   Mach-O dynamically linked shared library arm_v7
MyFramework (for architecture armv7s):  Mach-O dynamically linked shared library arm_v7s
MyFramework (for architecture arm64):   Mach-O 64-bit dynamically linked shared library arm64
Run Code Online (Sandbox Code Playgroud)

查看otool -l输出LC_ID_DYLIB显示:

Load command 4
          cmd LC_ID_DYLIB
      cmdsize 64
         name @rpath/MyFramework.framework/MyFramework (offset 24) …
Run Code Online (Sandbox Code Playgroud)

frameworks mach-o dylib otool ios

5
推荐指数
1
解决办法
999
查看次数

如何打印 mach-o 二进制文件从 dylibs 导入的所有符号?

我是 MacOS 和 MacOS 编程新手。我想知道应用程序是如何工作的(只需浏览一下二进制文件的导入系统 API 即可进行学习)。

我尝试了 otool,打印了帮助消息,我看到消息说-L 打印使用的共享库。然后我运行了otool -L <binary-file>,但它只打印了所使用的库的名称,没有任何导入的符号。

也许我错过了 otool 中的某些内容,或者是否有其他工具可以帮助在 mach-o 二进制文件中获取导入符号?

macos mach-o otool

5
推荐指数
1
解决办法
3457
查看次数

iOS otool检测私有api

我是第一次使用ios开发人员,无法找到有关私有api的任何文档.所以我一直在寻找关于如何使用otool的某种类型的教程.我能找到的唯一确定的事情是我必须通过xcode首选项下载命令行工具.我也一直看到将它链接到.app文件的引用,但我不知道在哪里可以找到它以及如何在工具中使用它.有任何链接或建议吗?

xcode otool iphone-privateapi ios

4
推荐指数
1
解决办法
1万
查看次数

使用nm(1)列出OS X上为arm64构建的目标文件中的符号

有谁知道如何列出我为arm64架构构建的目标文件中的符号?

我尝试使用,nm但它给了我一个错误:

bfd_mach_o_scan: unknown architecture0x100000c/0x0 
File format not recognized
Run Code Online (Sandbox Code Playgroud)

是否可以使用相同的东西otool

macos otool ios nm arm64

4
推荐指数
1
解决办法
1011
查看次数

从静态库中删除/删除调试符号和存档名称

我有一个使用 clang 在我的 Mac 上编译的静态库(C++)(例如,libmylib_DARWIN.a对于2 种架构)(如果有任何相关性的话)。libmylib_LINUX.aApple LLVM version 9.0.0 (clang-900.0.39.2)

目前,有两个问题:

  1. 静态库(使用当前构建配置)包含调试符号
  2. 它还显示用于存档的目标文件的名称

    otool -Iv libmylib_DARWIN.a

    Archive : libmylib_DARWIN.a libmylib_DARWIN.a(firstobjectfile.cpp.o) libmylib_DARWIN.a(secondobjectfile.cpp.o) ....

我想从此库中删除调试符号和存档文件名。我想知道是否有一种方便的方法可以在不改变我的构建配置的情况下做到这一点。

  • Mac 上是否可以strip同时为 DARWIN 和 LINUX 构建的库执行此操作?我还有什么要注意的吗?
  • strip似乎没有删除存档文件名

SO上也有一些类似的问题;然而,我发现的那些涉及 iOS、Objective C,不谈论多平台,也不提及存档名称。

c++ static-libraries debug-symbols otool

4
推荐指数
1
解决办法
1万
查看次数