我需要帮助来删除我的iOS应用程序中已知的错误选择器。
苹果拒绝了我的应用程序,说:
关于准则2.3.1,此应用已通过验证,包含错误的选择器,例如
- x7kQPFEZS4af59md1eVMqf42YSTGAZVO:和i5B8qlaSJwvmVviceDOQkqQ0vwGq35XMmtV81zlsmHnws。
我尝试运行列出所有符号的nm命令,然后使用grep搜索上述选择器:
grep -r x7kQPFEZS4af59md1eVMqf42YSTGAZVO。
grep -r i5B8qlaSJwvmVviceDOQkqQ0vwGq35XMmtV81zlsmHnws。
两个grep都显示以下结果:
二进制文件./Payload/MyAppName.app/MyAppName匹配
MyAppName是一个二进制文件(unix可执行文件)。
如何进一步进行操作,并从我的iOS应用程序中删除这些错误的选择器?(或至少找到创建此选择器的代码/框架)
我有一个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) 我有一个包含错误的可执行文件(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 段的偏移量。如何找出打印偏移量和文件顶部之间的字节增量,以便我可以编辑/修补文件中的正确字节?
感谢您提供的任何建议!
我有一个命令行可执行文件,其中包含指向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?
我正在使用 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) 我正在从启用位码的 iOS 源代码构建一个动态框架(使用cmake和xcodebuild)。我使用lipo和install_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) 我是 MacOS 和 MacOS 编程新手。我想知道应用程序是如何工作的(只需浏览一下二进制文件的导入系统 API 即可进行学习)。
我尝试了 otool,打印了帮助消息,我看到消息说-L 打印使用的共享库。然后我运行了otool -L <binary-file>,但它只打印了所使用的库的名称,没有任何导入的符号。
也许我错过了 otool 中的某些内容,或者是否有其他工具可以帮助在 mach-o 二进制文件中获取导入符号?
我是第一次使用ios开发人员,无法找到有关私有api的任何文档.所以我一直在寻找关于如何使用otool的某种类型的教程.我能找到的唯一确定的事情是我必须通过xcode首选项下载命令行工具.我也一直看到将它链接到.app文件的引用,但我不知道在哪里可以找到它以及如何在工具中使用它.有任何链接或建议吗?
有谁知道如何列出我为arm64架构构建的目标文件中的符号?
我尝试使用,nm但它给了我一个错误:
bfd_mach_o_scan: unknown architecture0x100000c/0x0
File format not recognized
Run Code Online (Sandbox Code Playgroud)
是否可以使用相同的东西otool?
我有一个使用 clang 在我的 Mac 上编译的静态库(C++)(例如,libmylib_DARWIN.a对于2 种架构)(如果有任何相关性的话)。libmylib_LINUX.aApple LLVM version 9.0.0 (clang-900.0.39.2)
目前,有两个问题:
它还显示用于存档的目标文件的名称
otool -Iv libmylib_DARWIN.a
Archive : libmylib_DARWIN.a
libmylib_DARWIN.a(firstobjectfile.cpp.o)
libmylib_DARWIN.a(secondobjectfile.cpp.o)
....
我想从此库中删除调试符号和存档文件名。我想知道是否有一种方便的方法可以在不改变我的构建配置的情况下做到这一点。
strip同时为 DARWIN 和 LINUX 构建的库执行此操作?我还有什么要注意的吗?strip似乎没有删除存档文件名SO上也有一些类似的问题;然而,我发现的那些涉及 iOS、Objective C,不谈论多平台,也不提及存档名称。