十、Proguad使用与配置

mac下使用反编译命令:

使用命令:chmod +x jadx-gui 将jadx-gui变成可执行文件。
(在terminal中输入 chmod +x 然后将jadx-gui直接拖入terminal中 enter键 即可)
然后你会发现apktool文件图标变成了了可执行文件;

一、反编译

常用工具

  • 1、apktool
    https://ibotpeaches.github.io/Apktool/
    平常开发中,主要资源文件的获取(AndroidManifest/res等)
    解包: java -jar apktool_xx.jar d *.apk -o outPutFileName
    重打包: java -jar apktool_xx.jar b outPutFileName -o *.apk

例如:
解包: java -jar apktool_2.3.1.jar d bjjj.apk -o bjjj
重新打包:java -jar apktool_2.3.1.jar b bjjj -o bjjj.apk

备注:1.apktool_xx.jar是自己获取不同版本的.jar;

二、Proguard

对java代码进行压缩(Shrink),优化(Optimize),混淆(Obfuscate),预检(Preverify);
1.压缩(Shrink):在压缩处理这一步中,用于检测和删除没有用到的类,字段,方法和属性;
2.优化(Optimize):在优化处理这一步中,对字节码进行优化,并且移除无用的指令;
3.混淆(Obfuscate):在混淆处理这一步中,使用a、b、c等无意义的名称,对类、字段和方法进行重命名;
4.预检(Preverify):在预检这一步中,主要是在java平台上对处理后的代码进行预检检查;

三、几种keep的区别
#=====================keep===================================

# 外界没有使用此类中的方法,类名没有被混淆,所有的方法都被移除,属性不会移除,属性名被混淆;
# 使用了要混淆的类Bug中的方法,类名没有混淆,但是使用的方法名混淆了,没有被使用的方法被移除了,属性不会移除,属性名被混淆;
#-keep class com.zcbl.airport_assist.obfuscatedemo.Bug

#类中的方法名和属性名都没有被混淆,不管是否被外界使用所有的方法和属性都被保留
#-keep class com.zcbl.airport_assist.obfuscatedemo.Bug{
#    *;
#}

#=====================keepclasseswithmembers===================================

# 外界没有使用此类中的任何方法,类名不被混淆,但是里面的方法都被移除,属性不会移除,属性名被混淆;
# 外界使用此类中的方法,类名没有混淆,但是使用的方法保留且方法名被混淆,没有被使用的方法被移除了,属性不会移除,属性名被混淆;
#-keepclasseswithmembers class com.zcbl.airport_assist.obfuscatedemo.Bug


# 外界不管是否使用类中的属性和方法,都全部被保留,且名称都没有被混淆;
#-keepclasseswithmembers class com.zcbl.airport_assist.obfuscatedemo.Bug{
#   *;
#}

# 不管外界是否使用此类中的方法,类名和testOne方法名都没有被混淆,属性名被混淆,其他的方法都会被移除;
#-keepclasseswithmembers class com.zcbl.airport_assist.obfuscatedemo.Bug{
#   void testOne();
#}

#=======================keepclasseswithmembernames=================================

# 外界没有使用此类中的任何属性和方法,此类直接会被移除;
# 外界使用此类中方法,方法名和类名被保留,其他属性和方法都被移除;
#-keepclasseswithmembernames class com.zcbl.airport_assist.obfuscatedemo.Bug{
#   void testOne();
#}

#============================keepclassmembers============================

#如果没有使用要混淆的类,下面的指令会将此类移除
#使用了要混淆的类Bug中的方法,下面的指令使类名被混淆,使用的方法名混淆了,没有使用的方法和属性都被移除了
#-keepclassmembers class com.zcbl.airport_assist.obfuscatedemo.Bug

#如果没有使用要混淆的类,下面的指令会将此类移除;
#如果外界使用了此类的方法,类名被混淆,使用的方法名没有混淆,没有使用的方法和属性被移除
#-keepclassmembers class com.zcbl.airport_assist.obfuscatedemo.Bug{
# void testOne();
#}

#只会保持com.zcbl.airport_assist.obfuscatedemo目录下的文件不被混淆,这个目录下的子目录名及里面的文件都会被混淆
#-keep class com.zcbl.airport_assist.obfuscatedemo.*{
# *;
#}

# 保持住com.zcbl包下的文件和子目录及子目录中的文件
-keep class com.zcbl.**{
 *;
}

#忽略com.zcbl包及子包中的警告,如果不忽略,有警告的话,编译出错
-dontwarn com.zcbl.**
  • 总结------待完成?????????
四、错误日志的还原

当开启混淆后,如果程序运行时打印错误日志,我们无法定位到是哪个类哪一行出现的错误,这时就要借助打包时产生的文件夹:


映射文件夹.png

结构说明:
dump.txt
说明 APK 中所有类文件的内部结构。
这个文件内容非常多,可读性也并不高;

mapping.txt
提供原始与混淆过的类、方法和字段名称之间的转换;

seeds.txt
列出未进行混淆的类和成员;我们保护的zip没有被混淆

image.png

usage.txt
列出从 APK 移除的代码。可以在这个文件中查看是不是有我们不想被移除的类


image.png

重要的当然就是我们的mapping文件了。通过这个文件我们就能定位到:

image.png

我们现在比较简单,所以一下子就能定位到错误函数,如果函数层级较深,光靠自己比对来查找难度就比较大了。所以sdk中提供了一个工具在tools/proguard/bin中
我们把logcat里面保存的错误堆栈复制到一个文件中:
[图片上传中...(image.png-8713f2-1539869578759-0)]
image.png

然后执行retrace 脚本(在 Windows 上为 retrace.bat;在 Mac/Linux 上为 retrace.sh)

retrace.bat|retrace.sh [-verbose] mapping.txt [<stacktrace_file>]


image.png

所以我们每次在发布版本之后都需要保留这个mapping文件。所以一般异常上报平台都会提供mapping上传然后帮助我们分析;

第一个问题解决的,第二个问题是行数显示的是Unknow Source


image.png

如果希望出现具体行数,我们需要在配置文件中加入
抛出异常时保留代码行号,在异常分析中可以方便定位

-keepattributes SourceFile,LineNumberTable

image.png

另外还可以配合
-renamesourcefileattribute AAA
使用字符串"AAA"来替代真正的类,避免泄漏更多的信息


image.png

虽然我们的代码经过了混淆,但是实际上,对于有耐心有条件的人来说,还是能够从混淆过后的代码中看到蛛丝马迹。

Jdx-gui工具可能对做到这一点的帮助不大,因为它不支持函数的跳转。现在我换一种工具来进行反编译。
dex2jar: java
<u>https://sourceforge.net/projects/dex2jar/</u>

enjarify: python3
<u>https://github.com/google/enjarify</u>

两种工具都可以,使用dex2jar


image.png

反编译后生成了一个jar


image.png

然后使用jd-gui打开:

<u>http://jd.benow.ca/</u>

image.png

直接跳到了


image.png

所以只要花功夫,混淆完全能够被完整的解读出来。当然并不是说混淆就没用。混淆之后解读难度更大了。
proguard移除无用代码还能缩小apk大小。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容