使用 ProGuard 进行混淆时,-keepattributes SourceFile,LineNumberTable 是不是会使生成的 apk 更容易进行逆向工程?
Posted
技术标签:
【中文标题】使用 ProGuard 进行混淆时,-keepattributes SourceFile,LineNumberTable 是不是会使生成的 apk 更容易进行逆向工程?【英文标题】:When obfuscating with ProGuard, does -keepattributes SourceFile,LineNumberTable make the resulting apk easier to reverse engineer?使用 ProGuard 进行混淆时,-keepattributes SourceFile,LineNumberTable 是否会使生成的 apk 更容易进行逆向工程? 【发布时间】:2011-10-07 08:35:55 【问题描述】:我发现自己需要在报告的堆栈跟踪中提供更多详细信息,但我担心通过包含额外数据(通过使用 -keepattributes SourceFile,LineNumberTable)我会使我的应用程序更容易进行逆向工程。是这样吗,如果是的话,是多少?
【问题讨论】:
【参考方案1】:ProGuard manual > Examples > Producing useful obfuscated stack traces
SourceFile 属性是必需的,因为 Oracle/Sun 的 Java 虚拟机在堆栈跟踪中不包含行号,这是您真正想要的(并且它本身是无害的)。我还没有检查这是否适用于 android 的 Dalvik 虚拟机。
作为一种解决方案,ProGuard 可以保留 SourceFile 属性,但将其内容替换为您选择的无意义字符串,例如
-renamesourcefileattribute SourceFile
字符串的值对于解释堆栈跟踪并不重要。选择像“SourceFile”这样的字符串可以避免增加类文件的大小,因为这个字符串在定义上已经存在了。
【讨论】:
@Eric,如果你要保留源文件属性,为什么要乱码类名?当然堆栈跟踪将毫无用处,但这不是混淆的重点吗? @mP 上面的配置保留了 SourceFile 属性,但是替换了它的内容。然后,JVM 将打印出完整的堆栈跟踪,但名称会混淆。在 ProGuard 为开发人员生成的映射文件的帮助下,这些对于调试混淆的应用程序很有用。 "而且是相当无害的",如果有人在反编译后可以看到实际的文件名,它是如何无害的?这使得混淆完全没用。 @xmenW.K.见上面的 cmets——实际文件名不见了;它被一个无意义的字符串替换,例如“源文件”。 只有在使用'-renamesourcefileattribute'后才可以【参考方案2】:我不确定会发生什么,但鉴于源文件名包含类的实际名称,有人可以使用它来将混淆的类名映射到真实的类名。鉴于混淆已经使一切变得混乱,为什么要保留源文件呢?一切都应该并且仍然会运行,运行时不需要调试细节,因此保留它们是没有意义的。根据您的目标,您删除的越多越好。
【讨论】:
【参考方案3】:我认为你可以使用:
-keepattributes LineNumberTable
【讨论】:
【参考方案4】:-renamesourcefileattribute
-keepattributes SourceFile, LineNumberTable,Signature,Exceptions,InnerClasses,EnclosingMethod
或
-renamesourcefileattribute ''
-keepattributes SourceFile, LineNumberTable,Signature,Exceptions,InnerClasses,EnclosingMethod
让文件名为空就可以了
【讨论】:
以上是关于使用 ProGuard 进行混淆时,-keepattributes SourceFile,LineNumberTable 是不是会使生成的 apk 更容易进行逆向工程?的主要内容,如果未能解决你的问题,请参考以下文章
Android Proguard - dontobfuscate 不会禁用混淆
使用 Proguard 在 dist 上混淆 Play 2 Web 应用程序?
Android 安装包优化开启 ProGuard 混淆 ( 压缩 Shrink | 优化 Optimize | 混淆 Obfuscate | 预检 | 混淆文件编写 | 混淆前后对比 )