我无法将iOS崩溃转储的堆栈跟踪中的偏移与otool输出的二进制反汇编中的偏移进行匹配.
任何人都可以确认我原则上如何匹配这些.例如,如果我在崩溃转储中获得一行:
0 myapp 0x00005b0a 0x1000 + 19210
Run Code Online (Sandbox Code Playgroud)
我希望二进制文件中违规指令的偏移量为0x5b0a,0x4b0a ....还是其他什么?
在解码头信息时,otool还提供了这样的信息(实际代码从文件中的偏移量0x0000224c开始):
Section
sectname __text
segname __TEXT
addr 0x0000224c
size 0x00063ad2
offset 4684
align 2^2 (4)
reloff 0
nreloc 0
type S_REGULAR
attributes PURE_INSTRUCTIONS SOME_INSTRUCTIONS
reserved1 0
reserved2 0
Run Code Online (Sandbox Code Playgroud)
所以,我并不是100%确定我正确地解释了这一点,但似乎是说代码在文件中的+ 0x224c处最终在内存中的偏移量0x124c,但后来我不确定这是怎么回事例如,安装在位置0x1000.
我遇到的问题是,假设偏移量为0x5b0a,那里的指令,0x4b0a和0x6b0a的指令都没有意义,因为它是有问题的实际指令(包括例如位于堆栈下方的位置然后不指向的事实)分支指令).
(我知道,至少在ARM的早期版本中,由于指令流水线,PC的值与相应的内存地址之间存在差异.我假设在报告的偏移量中会考虑这种差异在崩溃转储中,或者无论如何,我会看到有问题的分支指令,如果没有考虑到这样的差异,那么任何一方指示的指令......)
任何人都可以放弃任何光线吗?
我正在创建一个依赖于其他几个库的插件应用程序(dylib).这些其他库安装在我的系统上,但不保证安装在任何用户的系统上.所以我需要找到一种方法将依赖项与我的应用程序捆绑在一起.
我发现我可以otool用来列出或更改其他dylib的路径.这将允许创建一个文件夹,捆绑我的插件应用程序和所有需要的依赖项.
但是,手动执行此操作似乎是一项耗时且愚蠢的任务.是否有可用于实现自动化的实用程序?
或许我做错了,这个问题有更好更明显的方法吗?
编辑 我创建了一个自动完成大部分任务的脚本.
经过大量时间与Google合作,我决定在这里提出这个问题.但我无法得到我的问题的答案.以下是详细信息:
我有一个申请并最近发布到Cydia.它已被其他人破解并在torrent网站上发布.有趣的是我内部有一个二进制校验和验证机制,他们能够破解整个东西,并根据他们对二进制文件所做的更改创建了新的校验和文件.他们编辑了两个函数并对其进行反编译并将其发布给种子.
所以我已经用IDA Pro做了一些研究,发现可以看到函数和类的实际实现.但是为了编辑函数,他们必须找到该函数的地址并通过HEX EDITOR编辑它.这部分让我感到困惑,是否有人帮我这个?我不想让它"不可撼动":) ..我猜不是那么容易.:)但我真的想知道他们是如何破解的?:)
我的问题是如何编辑iOS二进制文件中的函数并重新编译它?例如,我的一个班级中有以下方法.
- (id) getSomething {
return @"Something";
}
Run Code Online (Sandbox Code Playgroud)
我想编辑这个函数的返回值.那可能吗?
我成功构建了动态库,依赖于boost库,这些库是使用自定义前缀(./b2 install --prefix=PREFIX)构建和安装的.但是,当我otool -L在我的库上运行时,我得到如下输出:
...
libboost_regex.dylib (compatibility version 0.0.0, current version 0.0.0)
libboost_system.dylib (compatibility version 0.0.0, current version 0.0.0)
...
Run Code Online (Sandbox Code Playgroud)
与其他依赖项不同,它没有完全通向这些boost库的路径.当我的lib被应用程序加载时,这会导致运行时错误.我知道可以使用install_name_tool手动修复此问题.但是,我想弄清楚,为什么它只发生在boost库中,并且不会发生在我的lib依赖的其他依赖项上?
编辑
我被要求给出一个构建命令的例子,但像往常一样,"现实生活"的例子有点复杂.就我而言,有一个libA.dylib依赖于提升的库.然后,我的图书馆libMy.dylib依赖libA.dylib和提升.在configure执行简单库存在检查(类似于自定义测试程序AC_CHECK_LIB)的步骤中出现问题.此检查尝试构建一个与之相关联的小测试程序,libA.dylib以证明其可用性libA.dylib并且失败 - 由于无法找到增强库的错误.当然它不会找到它们因为otool -L libA.dylib在没有完整路径的情况下给我提升库.
我已经在这个概念上挣扎了一段时间,我无法真正理解-change和之间的区别-id。手册页指出
-id name
Changes the shared library identification name of a dynamic shared library to name. If the Mach-O binary is not a dynamic
shared library and the -id option is specified it is ignored.
-change old new
Changes the dependent shared library install name old to new in the specified Mach-O binary. More than one of these options
can be specified. If the Mach-O binary does not contain the old install name in a specified …Run Code Online (Sandbox Code Playgroud) 我想用一些代码修补一块废弃软件.
该软件是基于碳的,所以我不能使用InputManager(至少,我认为我不能).我的想法是在mach-o标头中添加一个dylib引用,并在调用初始化例程时启动一个新线程.
我使用hexeditor添加了相应的加载命令(LC_ LOAD_DYLIB),并使用mach-o标头.
otool报告我期望看到的内容,因此我非常确信文件格式正确.
Load command 63
cmd LC_LOAD_DYLIB
cmdsize 60
name @executable_path/libAltInput.dylib (offset 24)
time stamp 1183743291 Fri Jul 6 19:34:51 2007
current version 0.0.0
compatibility version 0.0.0
但是,启动二进制文件会给我以下错误
dyld: bad external relocation length
我可以猜到这意味着我需要修改LC_ SYMTAB或LC_ DYNSYMTAB部分......
有人有主意吗?
我无法弄清楚为什么我的二进制文件无法加载。它是MATLAB加载的dylib(MEX文件),并链接到位于不同位置的许多dylib。MATLAB告诉我它无法加载MEX文件,但是我无法弄清它找不到哪个依赖项。
有人对如何调试这样的东西有任何建议吗?
在Linux上,ldd是调试此问题的理想工具。人们一直说otool -LMacOS与Linux等效ldd,但这不是事实。ldd实际上会查找这些库,并告诉您可以找到哪些库以及在何处找到它们。otool -L仅告诉您需要链接的库。无需检查它们是否存在。它甚至没有告诉您使用库时在哪里搜索库@rpath。
otool -l(小写的L)为您提供了“加载命令”的转储,您可以在LC_RPATH其中看到这些命令,这些命令确定了在何处@rpath搜索库。但是这些无法向我解释未找到哪个依赖项。
希望这不是重复的(我发现了很多类似的问题,但不完全是我要问的问题)。
\n\n当我运行时在linux上ldd <path/to/executable>,我会得到一个很好的共享库依赖项列表,以及动态链接器找到这些依赖项的路径(或者一条未找到依赖项的消息)。
在mac上使用时otool -L <path/to/executable>我得到依赖项,并且路径是相对于 rpath 的,即使依赖项不存在。本质上,它报告依赖关系应该相对于 rpath 的位置,而不是动态链接器发现的位置。据我了解,otool 直接从二进制文件中读取此信息,而不是像 ldd 那样调用链接器。
我知道我可以通过将 DYLD_PRINT_LIBRARIES 变量设置为 1 来运行可执行文件来获取这些路径,但这对于动态库不起作用,甚至对于可执行文件也不方便。
\n\n所以我的问题是,我可以在 mac 中获得与 ldd 完全相同的行为吗?
\n\no工具信息:
\n\n\xe2\x9e\x9c otool --version\nllvm-otool(1): Apple Inc. version cctools-906\nApple LLVM version 9.1.0 (clang-902.0.39.1)\n Optimized build.\n Default target: x86_64-apple-darwin17.5.0\n Host CPU: ivybridge\nRun Code Online (Sandbox Code Playgroud)\n 当我尝试用otool反汇编iOS应用程序(不是app store)时,它不会分成不同的方法.这只是一个巨大的部分.这是我正在使用的命令:
otool -tV theApp.app/theApp >~/Desktop/output.txt
有没有办法让反汇编拆分成方法?
我用cMake为ARM7构建了一些静态库.通常,当您对.a文件使用next命令时,它会显示以下体系结构:
FE
mac:libs User$ file ./libcurl.a
./libcurl.a: Mach-O universal binary with 3 architectures
./libcurl.a (for architecture armv6): current ar archive random library
./libcurl.a (for architecture armv7): current ar archive random library
./libcurl.a (for architecture i386): current ar archive random library
Run Code Online (Sandbox Code Playgroud)
或者fe
mac:libs User$ otool -vf ./libboost_regex.a
Fat headers
fat_magic FAT_MAGIC
nfat_arch 3
architecture armv6
cputype CPU_TYPE_ARM
cpusubtype CPU_SUBTYPE_ARM_V6
capabilities 0x0
offset 68
size 9550024
align 2^2 (4)
architecture armv7
cputype CPU_TYPE_ARM
cpusubtype CPU_SUBTYPE_ARM_V7
capabilities 0x0
offset 9550092
size 9390544
align …Run Code Online (Sandbox Code Playgroud)