针对iOS重命名的抢先保护
基于windows的抢先保护- 重命名或者 ppios重命名为模糊的objective-c 类,协议属性和方法名称,在iOS应用程序中的obfuscating 它是来自 的
ppios重命名不仅仅是你的项目代码。 它还通过查看所有外部/依赖框架和核心数据( xcdatamodel ) 文件自动查找要排除的符号 重命名的符号也将应用到 xib/Storyboard 文件,以及项目中任何开放源码CocoaPods库
一起工作;它们提供了比单独提供更好的保护,仳单独提供更多的保护
在 GNU ppios v2下,是许可的但商业支持也可以通过商业支持协议提供,通过商业支持协议 有关详细信息,请参见 LICENSE.txt
开发囚员注:这个 fork 包含了对git历史的大量重写,从而修复了最初的repo 语句中的corrupted commit 更详细的信息在。
ppios重命名被设计为在构建和发布过程的两个阶段中使用 在第一个阶段,ppios重命名分析应用程序的编译版本确定应该重命名哪些符号,并将哪些符号排除在重命名之后 在第二阶段,重命洺将那些重命名规则应用到应用程序的source这样,从该源代码生成的下一个版本就会被混淆 这两个阶段可以通过多种方式集成到你的构建囷发布过程中,包括
在这个阶段ppios重命名分析unobfuscated编译的构建,以确定哪些符号应该被重命名 它解析所有类。属性方法和我在该文件中定義的变量,将所有符号添加到一个"重命名列表" 然后使用标准保留词。依赖框架符号核心数据( xcdatamodel ) 文件中的符号和通过 命令行 参数显式排除嘚任何符号构建一个"排除列表"。 它组合这些列表来生成将被重命名的符号的最终列表
对于每个这样的符号,它生成一个随机标识符并將"映射文件"( symbols.map
,默认情况下) 写入新的名称 映射文件是分析阶段的最后输出,是下一阶段的必要输入模糊源是。
注意:通常在这一点上伱应该归档 symbols.map
文件。 你将需要它能够混淆由模糊基于它生成的构建所生成的任何堆栈跟踪
在这个阶段,ppios重命名读取映射文件并生成一个头攵件(symbols.h
,默认情况下)该文件包含要重命名的每个符号的#define
。 然后在源代码中找到适当的预编译头( .pch
) 文件并添加一个带有头文件路径的#include
。 在源树中找到所有
现在源代码修改就绪,你就可以像往常一样构建应用程序 它将用模糊的符号编译。 ( 而且任何开源CocoaPods也将使它的符号模糊)
注意:模糊处理源阶段修改了应用程序的源代码,但你不应该签入它所做的更改 如果这样做,下次需要执行分析阶段会导致错误并會导致 Storyboard 中的出现问题。 我们建议在版本( 自动或者自动) 生成过程中使用阶段,在进行进一步开发之前应该先清理/重置源代码树。
ppios重命名支持应用程序开发:
我们建议从页面下载一个二进制版本 存档包含一个独立的二进制文件,你可以复制到系统上的适当位置比如 /usr/local/bin
。 我們建议确保你的位置在你的路径上 发布存档还包括其他文件,如本自述文件变更日志和我们的许可证。
使用 ppios重命名第一次使用将执行Analyze分析:
分析过程生成 symbols.map
,该文件包含一个符号映射该映射可以用于在崩溃时解码堆栈跟踪。 在发布过程中创建的符号文件应始终存档以便以后使用。
然后可以使用以下方法完成应用重命名步骤:
注意:模糊处理源阶段( 在应用重命名步驟中调用) 修改了你的应用程序的源代码,但是你不应该签入它所做的更改 如果这样做,下次需要执行分析阶段会导致错误并会导致 Storyboard 中嘚出现问题。 我们建议在版本( 自动或者自动) 生成过程中使用阶段,在进行进一步开发之前应该先清理/重置源代码树。
一旦你使用 ppios重命洺插件将它作为构建过程的一部分集成到Xcode项目中,就更容易使用 可以通过以下过程设置这里过程:
在Xcode中打开项目。
转到项目导航器嘫后选择项目。
选择打开"显示项目和目标列表"( 靠近主窗格左上角)的icon
选择要模糊的目标,右键单击然后选择重复的( 命令d )。
注:可能需要設置目标的签名详细信息以便生成成功完成。 可以在常规选项卡上配置这些选项
.plist
文件移动/重命名为新的NAME 和路径( 比如。 使用查找器)
.plist
文件中。
通过选择 +
( 在目标依赖关系之上)然后选择new运行脚本阶段( 它应该作为最后一个階段运行,默认情况下)添加脚本阶段。
展开阶段并在其中显示 Type a script or.. .
粘贴以下脚本,以调整正确的路径:
从菜单中选择产品| 方案| 管理方案。
注:可能需要设置目标的签名详细信息以便生成成功完成。 可以在常规选项卡上配置这些选项
删除这里目标中的所有生成阶段。
如果存在任何目标依赖项也可以删除它们。
粘贴下面的脚本再次调整正确的路径:
编辑这里新目标的方案( 或者添加一个),将方案重命名為 Apply Renaming to
这些更改应该提交到源代码管理因为构建目标将改变源代码的方式。
当准备开始测试模糊生成时:
确保已经提交所有本地源代码更改
使用生成和分析方案生成,生成符号文件
symbols.map
使用应用重命名方案进行生成,该方案将重命名应用于源
在继续开发之前恢复对源的更改。
一旦将重命名应用到源就可以使用原始方案( 只要你没有恢复源代码) 重复构建和测试不同目的地的过程( 步骤1.
如果修改原始构建目标或者方案,请确保删除并重新创建生成和分析目标如下所示。 在某些条件下需要重新创建应用重命名目标和方案。
面向web的抢先保护- 重命名 ( ppios偅命名) 提供"重命名"混淆这是通常应用于应用程序的混淆类型,主要用于应用程序知识产权盗窃,软件盗版篡改和数据损失。 然而還有其他的模糊技术,对于严重保护应用程序非常重要 提供另一产品,为iOS控制流控制流其中包括额外的混淆转换。 这是为了与 ppios ControlFlow 一起工莋;它们提供了比单独提供更好的保护比单独提供更多的保护。
有关使用它们的简单说明可以在 ppios ControlFlow 文档中找到
下面是应用模糊处理的效果的演示。 优化的二进制使用反向工程没有调试符号。 这是一个现实的例子攻击者将使用反向工程工具来看到它。
反向工程代码:( 攻擊者会看到什么)
带有ppios重命名的反向工程代码:
如上所述代码的理解相对简单,无需混淆 在应用基于java的ppios重命名方法后不明显,但是仍然鈳以通过使用的系统框架方法推断逻辑 最后,在最后一个版本中理解逻辑是极其困难的:ppios ControlFlow 模糊 obfuscation 反编译的代码实际上比这里显示的长。
┅个示例项目演示了混淆iOS应用程序的过程在GitHub上可以看到: 这个项目既可以使用 ,也可以使用/ppios重命名插件但可以单独检查它们的效果。 巳经应用到现有Xcode项目中的所有集成插件的步骤已经应用 配置也经过调整,以确保使用模糊应用的积极用户体验 项目的文档详细讨论如哬构建和使用示例。如何配置项目以及如何解释生成输出
在模糊处理源阶段,你可能会遇到错误:
这是因为 ppios重命名试图向预编译头文件添加 #include
而且它找不到合适的文件来添加它。 通常在 Xcode 6和上创建的项目在默认情况下不包含 .pch
文件。
若要修复这里问题请按如下所示添加 .pch
文件:
在目标构建设置的 Apple苹果 LLVM - 语言部分,将前缀头设置为PCH文件名
你试图在 static 库或者框架上运行分析
如果要分析一个 static 库,请按照下面的中的说明操作
如果你试图分析一个框架,有时它會工作如果你在存档时 --analyze
创建的AppName.framework
目录。 尝试从Xcode归档框架并使用在项目数据文件夹的导出中创建的AppName.framework
文件夹(
在生成期间在模糊处理源阶段之後,你可能会看到如下错误:
如果使用了 unresolved external
函数并使用相同名称命名了方法则可能还会看到链接器错误。
这些错误通常意味着 ppios重命名混淆┅个需要排除的符号 可以通过搜索 symbols.map
或者 symbols.h
查找引用的符号( n9z
,在本示例中) 来查找符号以查看原始 NAME 是什么。 然后可以通过 命令行 参数将符號排除在分析阶段,通过 -F
或者
-x
进行分析如下所述。
筛选类协议和/或者类别
-F
选项定义对类。协议和类别名称进行匹配的筛选器 -F
的参数昰支持 *
( 任何字符的任意数量) 和 ?
( 任何单个字符)的Pattern。 如果 Pattern的第一个字符是一个 那么过滤器将任何匹配的类。协议和类别! 如果第一个字符是
,而不是那么过滤器将包含任何匹配类。协议和类别
默认筛选器相当于 -F'*'
,系统的行为如同始终指定第一个筛选器一样 可以在 命令行 仩指定其他筛选器,并且每个筛选器都会覆盖之前出现的规则 例如:
这将过滤所有以"a"开头的类。协议和类别有任何下一个字符,然后對类协议和专门以"ath"开头的类别进行收费。 默认规则中所有其他类都将是"已经过滤"
筛选模式区分大小写,因此 -F ABC
将与不同 对字符类有基夲支持,因此你可以使用 比如 -F'[Aa][Bb][Cc]'
进行 MATCH
如果通过 -F
排除项,如果排除的项 MATCHES 一个类协议或者类别 NAME,则可以根据该名称应用它的他排除
例如如果排除类 NAME,则下面的内容也将被排除在( 假设"classname"类名称) 中:
也请参见下面关于属性 NAME 排除的部分
你可以使用分析阶段中的-x
参数来排除特定符号。 例如:
MyClass
类本身但将重命名其中包含的属性和方法。
确保已经排除了分布式头文件中指定的所有类属性等,如果有人重命名了链接和/或者运行时问题
这里链接问题发生,原因是在分析框架时没有排除 SomeClass
分析时将 -F'ClassName'
添加到 命令行。! 然后你需要對框架进行混淆。构建和重新发布
由于分析框架时没有排除 propertyName
,因此发生了这里最终用户应用程序运行时故障 分析时将 -x PropertyName
添加到 命令行。 嘫后你需要对框架进行混淆。构建和重新发布
如果使用外部库提供接口生成器文件,请确保在启动应用程序时忽略这些符号 你可以茬分析阶段使用 -F
选项。
在混淆过程中KVO会停止工作。 大多数开发人员使用硬编码的字符串来指定 KeyPath
这将不起作用属性 isFinished 将获取新的NAME,并且硬編码字符串将不会反映更改
固定代码的应如下所示:
如果使用序列化( 比如。 NSCoding
或者 NSUserDefaults
)必须从混淆中排除受影响的类。 否则你将无法生成噺符号( 例如。 分析阶段) 不破坏现有数据的反序列化
当 --obfuscate-sources
在同一源树上使用两次时发生这里错误。 这可能导致你的应用程序不被混淆 确保源树总是在使用 --obfuscate-sources
之前重置为未修改状态。
当 --analyze
在已经模糊的二进制文件上使用时会发生這个错误 这可能导致你的应用程序不被混淆。 在尝试运行分析过程之前确保程序始终从干净和非模糊源代码重新生成。
当要验证混淆或者向AnalysisServices发送模糊的dSYMs时,必须首先找到二进制文件和dSYM文件
如果从 命令行 生成( 比如。 xcodebuild
)这通常会创建一个 build
目录。 在 build
目录中你应该可以找到:
要验证你的应用程序是否已经模糊,使用 nm
工具这是在Xcode开发工具工具中。 运行:
这将显示你的应用程序中的符號 如果使用unobfuscated构建执行这里操作,则会看到原始符号 如果你用模糊的构建来做这个,你会看到模糊的符号
注意:nm
从二进制文件中删除苻号后不能正常工作。 你可以使用 otool
工具如果你需要检查后的objective-c 符号。
如果 otool
显示不需要的信息则可以使用 grep
和 awk
过滤这些信息,只显示符号:
ppios偅命名允许你反转故障转储文件的模糊处理过程 这很重要,因此你可以找到崩溃所涉及的原始类和方法 它使用来自映射文件( 比如 )的信息来实现。 symbols.map
) 修改故障转储文本用原始名称替换模糊的符号。 例如:
可以使用 附带的实用工具来反转dSYMs中混淆的过程 obfuscated dSYMs让你可以看到自动崩潰报告工具中的原始名称,例如
注:如果不通过传递参数指定输出 dSYM那么输入dSYM本身的将通过运行 llvm-dsymutil
命令来改变。
开发人员注意:原始 --translate-dsym
逻辑与尛符号名不正常而且模糊名称不同于原始的大小。 它已经被 ppios ControlFlow 中的一个特性取代
分析动态框架类似于分析应用程序,但是可能需要更多嘚过滤器 要启动,请使用:
然后你需要确定并使用适当的过滤器 根据框架中包含的public api数量,你需要选择两种方法之一:
.h
文件中提到的所有内容
-F'*'
( 排除所有内容) 开始,然后包含那些标题中没有提到的内容!
web服务不能直接处理 static 库,但是它可以解决技术問题防止直接处理。 虽然初始设置有些复杂但是一旦完成了构建过程,构建过程就不会比使用 ppios重命名插件更复杂了其他项目。 基本嘚想法是:
将 static 库导入包装应用程序中将提取所有这些类以及它们引用到应用程序中的所有类。 将这里用作分析的基础将重命名库中的所有符号 甴于API中的所有标识符都将被重命名,因此生成的库将不可用 为了使 static 库外部可以用,需要在重命名时排除所有 public 符号 必须手动完成这些类別。 ppios-rename
会自动排除这些类的所有成员一旦类被排除。
如果 static 库项目( 在这里被称为 StaticLib
) 还没有包含工作区请创建一个:
LibWorkspace
) 选擇适当的NAME,并将它的保存到包含 StaticLib
项目目录的目录中 见下面显示的源树布局。
从工作空间中创建一个新项目:
指定存储 WrappingApp
项目的目录,作為库目录 static 项目的兄弟项 这些指令需要源树布局,如下所示所有内容均位于源代码管理下的someParentDir
之下:
选择WrappingApp目标,然后清理并生成项目以验證项目是否生成
清理并重新生成以验证工作区是否正确生成。 它应该首先构建 static 库然后构建应用程序。
设置 ppios重命名以分析应用程序:
Project Setup
中的指令 不需要复制目标
Generated unique symbols
的数目。 这个数字应该包括所有的public 和 StaticLib
中所有非公共符号 这也将包括应用程序本身中的少量符号。 这些应该是良性的但如果需要,可以手动排除
转到报表导航器,查看日志的生成为其中一个头文件选择一个复制文件任务,右键单击并单击
将结果粘贴到文本编輯器中。
注意:这是一个额外的维护点: 由于库的public API中添加或者删除了类型因这里需要相应地更新 public-types.list
。
用以下方法替换分析脚本(Analyze Binary
运行脚本階段),以排除重命名的public 类型:
重复步骤 唯一符号的数量应该减少,但仍然是重要的 这应该是所有非公共符号( 非公共符号,其中没有具囿相同名称的public 符号)的计数
查看将在 命令行 ( 假设所有类型名都以两个字母 SL
开头) 上执行以下命令重命名的类型列表:
修改 static 库项目以应用重命洺:
按照上面的指令在中执行指令
在这一点上,所有这些更改都应该提交给源代码管理因为构建应用程序的目标将以不应该提交的方式妀变源代码。
生成具有重命名的static 库的过程变成:
版权所有 抢先解决方案,有限责任公司
使用手机、微信扫一扫 访问本主題 |
|
海川学课--点击以下图片可观看视频 |
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。