如何强化 iPhone/Android 应用程序,使其难以逆向工程?
防止软件的逆向工程是一个难题。
在硬件辅助较弱的通用计算平台(PC、iPhone 或 Android 手机)上,在相当长的一段时间(数月)内防止应用软件的逆向工程是一个非常困难的问题。
通常,代替保护整个应用程序,一种常见的替代方法是尝试保护应用程序使用的关键数据并放弃保护整个应用程序。
[1] 使应用程序难以破解,因为二进制文件将包含一些秘密令牌。
您虽然在这里暴露了“保护数据”的概念。您真正希望应用程序保护的是一些关键数据:秘密令牌。
当应用程序无法保护自己时,您如何保护数据?
您将责任传递给操作系统。操作系统可以提供两种类型的保护:访问控制和加密。当我们允许或拒绝读取数据或执行特定操作时,我们使用的大多数保护措施都是访问控制。
访问控制将操作和想要执行该操作的标识符作为输入。它的输出是批准或拒绝执行操作的权限。访问控制使用一组或规则或表来确定是否应允许标识符执行操作。
例如:Alice 在电脑上有一个游戏 FunGame。计算机的访问控制有一个规则,只有 Alice 可以运行 FunGame。Bob 坐在电脑前,尝试运行 FunGame。计算机的访问控制将“run FunGame”和“Bob”作为输入。基于“只有 Alice 可以运行 FunGame”的规则,访问控制的输出被拒绝。
访问控制提供了一种直接且通用的方式来决定允许或拒绝,而密码学提供了一种更间接的允许或拒绝方法。通过加密和解密,我们可以转换数据,使数据有意义或没有意义。
加密和解密至少需要一个加密密钥。密钥的值成为访问控制,具有“允许任何拥有密钥的人获取可理解的数据并使其难以理解”和“允许任何拥有密钥的人获取不可理解的数据并使其易于理解”这两条规则。使数据难以理解只会保护数据不被理解。个人可能仍然能够读取数据,但不会以他们理解的形式出现。
请注意,键而不是参与者的标识符成为关键组件。任何拥有密钥的人,无论他们如何获得它,都可以访问数据。这使得存储密钥成为问题。如果您将密钥与数据存储在同一系统上,则您为任何人提供了访问您数据的方法。这就是为什么密码短语需要记忆的原因。记住密码短语将密钥(密码短语)存储在您的脑海中,而不是系统中。
因此,为了保护您的令牌,您可以使用操作系统的访问控制,或者您可以加密令牌,或两者兼而有之。如果某人的操作系统不强制执行其自己的访问控制(越狱的 iPhone 或 root 的 Android 手机),那么您就不能依赖操作系统的访问控制。但是,只要用于加密令牌的密钥与加密令牌不在同一系统上,即使操作系统受到破坏,您的令牌仍将受到保护。
然而,将密钥远离相关系统是另一个难题,称为密钥管理。
[2] 如果它仍然可以被破解,应用程序有什么方法可以告诉某人或它自己它已被破解(比如检查一些校验和或证书或为应用程序执行的操作系统)并采取一些措施?
当程序在内存中时,应用程序二进制文件可能会被感染或恶意代码也可能被注入,因此建议的方法应该能够处理这两种情况
检查一段数据以查看它自上次检查以来是否未更改的概念称为完整性检查。评估数据块状态的一种有效方法称为加密哈希。要执行完整性检查,您必须首先计算一段数据的加密哈希,然后保护生成的哈希值。稍后在同一条数据上重新计算加密哈希。将重新计算的哈希值与受保护的哈希值进行比较。如果两个值相同,则数据不变。如果两个哈希值不同,则数据已被更改。
您可以将存储中的应用程序二进制文件视为一段数据并对其执行完整性检查。您还可以将内存中的应用程序二进制文件视为一条数据,并对其进行完整性检查。
检查正在运行的程序以查看它是否按设计处理的概念称为证明。检查运行代码使用的所有内存通常是不可行的,因此证明通常检查一些更简单的东西,例如某些数据集的值或运行程序的状态及其状态之间的转换。证明很难实现,因此在商业软件中没有广泛使用。