我正在调试和没有符号表的iPhone应用程序。设备越狱了,我通过传递pid在设备上本地附加gdb(在gdb中启动应用程序似乎不适用于iOS 5)。我设置的断点都没有被触发。我将断点设置为来自类转储的偏移,但我认为它们没有因为iOS 5中的ASLR而受到攻击。
我尝试使用此处http://src.chromium.org/viewvc/chrome/trunk/src/build/mac/change_mach_o_flags.py?view=markup的脚本删除MH_PIE标记,并且otool显示已正确完成。但是,更改后,应用程序不再启动。
我设置的断点是错误的还是因为ASLR?如果是随机化,那么如何在设备上有效地禁用它呢?
答案 0 :(得分:1)
如果您要做的就是使用GDB调试应用程序,那么通过MH_PIE标志禁用ASLR就可以了。由于该程序修补了二进制文件,因此您需要重新签名该应用程序。使用名为ldid
的程序(来自Cydia中名为“链接标识编辑器”的程序包),您可以伪应用该应用程序。
root# cd /var/mobile/Applications/*/Example.app/
root# mach_flags --no-pie Example
root# ldid -s Example
root# gdb
(gdb) attach -waitfor Example
然后点按应用的图标。该应用程序似乎挂起。从这一点开始,返回GDB并加载它。现在,只需使用b *0x<address>
设置断点即可,因为它被禁用,您可以完全忽略ASLR。
答案 1 :(得分:-1)
我刚刚也遇到了这个问题。我找不到简单的解决方法,到目前为止我发现的最好的解决方法是使用include assert.h并在整个过程中使用它。
更新
你是对的。我想的是拥有自己的来源。但是,iOS监狱破坏设备上的gdb存在这个未发现断点的已知问题。我和那些最初将gdb带到Cydia的人讨论了这个问题,他们建议我自己尝试解决这个问题。没有任何空闲时间,我现在已经放弃了。这是对任何试图通过监狱破坏iOS上的gdb进行调试的人的警告,要么自己调查问题,要么放弃。它应该不会起作用,如果你正在使用自己的源代码而不是试图对其他人的应用程序进行逆向工程,那么使用断言是下一个最好的事情。
我并没有试图回答手头的问题,所以我确实应该得到这个问题。但无论如何,信息都应该存在。