从解密的 iOS 应用程序可执行文件中查找常量

Posted

技术标签:

【中文标题】从解密的 iOS 应用程序可执行文件中查找常量【英文标题】:Finding constants from a decrypted iOS app executable 【发布时间】:2013-06-11 22:18:42 【问题描述】:

我正在尝试从 ios 应用程序内部找到一个常量(类似于秘密令牌),以便使用未记录的 Web API 构建应用程序(顺便说一下,我不喜欢非法的东西)。到目前为止,我的 Mac 上有解密的应用程序可执行文件(越狱 + SSH + 将解密的可执行文件转储为文件)。我可以使用 strings 命令获取可读的字符串列表,并且可以使用 class-dump 工具 (http://stevenygard.com/projects/class-dump/) 获取类的接口定义(标题)列表。虽然这让我了解了应用程序的内部工作原理,但我仍然找不到我正在寻找的东西:我正在寻找的常量。在字符串命令转储中实际上有数千个字符串定义。有没有办法以一种我可以拥有 NSString 常量的名称及其值的方式转储字符串。我不需要方法的实现细节,我知道它是编译好的,我能得到的只是汇编代码。但如果我能得到字符串常量的名称(在字符串转储和类转储中)以及字符串值(在字符串转储中),我认为可能有一种方法可以将它们关联在一起。

谢谢,

可以。

【问题讨论】:

【参考方案1】:

不幸的是,不,除非有一些我不知道的黑魔法工具,或者除非可执行文件是用调试符号构建的(可能不是这种情况)。如果有调试符号,您应该能够通过调试器运行它并获取变量名称。

在编译时,编译器会去掉常量的名称,并将代码中所有出现的常量替换为它在内存中的位置地址(这通常是相同的字节偏移量如在可执行文件中)。正因为如此,常量的原始变量命名就丢失了,只留下了值。因此,您无法在任何地方找到常量的原因。

为了找到秘密令牌,我会做一些事情,即捕获应用程序创建的所有数据流量,然后在二进制文件中查找相同的模式。如果令牌确实在那里,并且没有以某种方式混淆,那么至少这大大缩小了你的范围。

祝你好运! RE 可能非常有回报,但有时真的很糟糕。

【讨论】:

令牌(必须)在可执行文件中的某处,因为 API 调用包含与其他一些变量散列的签名(它使用亚马逊 aws 服务,但不幸的是,这只是一部分的工作)。如果我无法获取常量名称,我至少可以获取使用哪个变量调用的 objc 方法(即使我不知道名称),这就足够了,因为我专注于特定的我知道名称的方法(并且我可以在标头转储后看到该方法),从逻辑上讲,我应该找出何时使用正确的工具调用它。 @canpoyrazoğlu 是的,令牌在可执行文件中的某处。您走在正确的轨道上,正在寻找使用它的方法名称。根据您的问题和对 Steve Nygard 的类转储的引用,我假设您有所有方法名称的列表? 是的,我(相信)我将它们都作为客观的 c 类标题。现在我正在使用 cycript analyzer 连接到正在工作的应用程序以找出令牌。 @canpoyrazoğlu 甜蜜!这听起来很有趣! @canpoyrazoğlu 太棒了!感谢您的跟进

以上是关于从解密的 iOS 应用程序可执行文件中查找常量的主要内容,如果未能解决你的问题,请参考以下文章

从 x86-64 可执行文件中查找类和函数名称

Linux可执二进制行文件和库依赖查看方法

什么叫静态库和动态库

目标的可执行性

[转载]/etc/ld.so.conf文件

PyCharm编写的代码生成可执行文件操作步骤