为什么我要写这篇文章呢?第一,是对这一周实习中使用到的技巧进行总结与回顾;第二,是想把这一周对于反编译这一小众的技能分享出去。(其实只是周末比较无聊而已哈哈)
好的,首先简单的介绍一下,本人目前正在读研,假期闲得蛋疼所以在北京找了一家规模还不错的公司实习,主要是想学一点平时很少接触的技能,希望找工作的时候能成为加分项。(其实主要还是用来装逼的)
废话少说,进入正题 ->_<-。
1.怎么反编译?
首先介绍一个反编译神器 - Android Crack Tool,不开玩笑的说,这个工具几乎可以完成反编译的所有任务,吊炸天的棒👍
牛逼不?全都是可视化操作,先把apk文件拖进去,然后反编译apk,之后会生成一个如下所示的文件夹:
里面有 res 和 asset 的全部资源文件 (样式文件有什么用?反正我觉得没什么卵用...)
接下来就是关键了! 把apk文件的后缀改成.zip,然后解压,会得到一个 dex 文件,然后在拖进可视化工具中,选择 DEX2JAR 执行,之后呢会生成一个.jar后缀的文件,然后选择 JDGUI 再执行。这时会弹出一个JDGUI的代码查看界面,这里面就是项目源码了。 开心伐?😄
这个时候呢理论上应该激动地跳起来,但是先稳一手...我赌五毛钱你会看得头昏眼花 😲 因为估计关键部分的代码都被混淆了..你以为别人公司的代码这么容易就被你看穿了吗?😑
2.阅读反编译源码技巧
说到这里不得不申明一下,为什么公司会让我去搞反编译。原因很简单,只是想单纯的向竞争公司学习学习,顺便呢研究研究对手有没有在搞什么黑科技(绝不是抄袭嘿嘿:smirk:)
在刚拿到竞品源码的时候,我是比较懵逼的。作为一个从来没有看过大公司代码结构的战五渣来说,一上来就是以这样一种形式去研究别人公司的代码,对我来说是一个很不错的挑战吧。
如果知道程序的入口,可以从入口开始,一层层地深入去看。对于Android程序而言,在手机或模拟器上运行一下app,然后根据跳转和处理的事件来查看对应的逻辑代码,这是一种比较理想的方式吧。
这样对于整个代码也会有一个宏观的认识。
然而在阅读代码的过程中,可能会让你崩溃。因为很多地方的代码都被混淆了,比如下图所示的样子:
又或者是这种:
崩溃不?绝望不?遇到这种被混淆的方法,也只能说放弃,从别的地方着手吧。
但是呢,通过我一周以来的探路发现,有的时候其实也并不需要去解读某些方法的具体实现过程,也许你足够机智,可以大概猜到这个方法他想干嘛。就像第二张图里面的那些类似注释一样的代码块,
虽然这些完全没有逻辑,但是里面偶尔会夹杂着某些方法名,然后你就可以发挥你的想象,去猜想他在干嘛!
不得不说的一点就是,如果以后你想提高代码的安全程度,不想让别人反编译然后解读你的代码,我强烈建议多使用反射机制...这是我这周以来的强烈感受!因为在使用反射的地方,你根本就猜不到他是调用了哪个方法!气死我了。
反编译后的代码为什么难以解读?主要是:
代码会被混淆,就像刚才看到的那样,会让你崩溃。
变量名会改变,比如说方法中的变量名会变成 param1,param2..
if 和 while,for 循环的逻辑会改变!! 妈蛋啊,这些逻辑改变了还看个毛啊!? 还好,百度可以搜到一些常见的变化规则....
如果你也是为了破解和侦察敌方公司的代码而反编译的话,无从下手或者处于崩溃边缘,可以试着从手机中 data/user/0/files 中的文件入手,
因为可能一些比较关键的本地数据或文件都存放在这个文件夹下,一旦找到一些看似“黑科技”的文件,请务必在全局代码中去搜索哪里使用了该文件,
这可能会点燃你的希望 。
但是呢前提是得使用root过的手机哦 ~
找到sdk目录下的adb 然后在终端中执行 ./adb shell ,你就可以掌控你的手机了!
cp 手机文件 PC路径 将files里面的文件考到电脑上,然后认真研究一番。
除此之外,还有一个心得,除了利用这个Android Crack Tool 来阅读jar里面的反编译代码之外,还可以将jar包放进Android Studio 或者 IDEA 的Librabry里面,然后add Library ,其实这也是工具自带的反编译功能。为什么要这样呢? 因为有些代码(特别是混淆代码)在不同工具中会有不一样的显示哦!~
3.自己的理解
通过这一周对于竞品的研究,我深深地体会到这些公司的不容易。一方面要保证代码质量必须要高,另一方面还要想方设法为自己的代码“加密”。
确实对于互联网时代而言,技术壁垒和安全性是多么的重要。你的技术再牛逼,如果安全程度不高的话也是浮云吧~
所以我总结一下如何提高app的安全性吧,就一些自己的理解。
(1)多用一些语言的高级用法,比如java反射机制, 让你的代码不是那么一目了然。因为很多码农只是为了以实现功能为目的去写程序的话,有很大概率不会用上像反射这种高级的用法,甚至连听都没听说过...
确实,如果某段方法被混淆了,并且还是用了反射,那么的确会让解读你代码的人很绝望。
(2)将一些重要的数据或方法封装在一些罕见的格式中。比如就像我研究的竞品代码,我认为他们在安全性上确实是下了一番功夫的。
首先他们将一些数据封装在一些.obj后缀的文件里面,并且无论用什么方法去读里面的内容,都会是乱码。
后来发现,者使用了一种叫做Kryo的序列化方式,类似以Json,但是却非常隐蔽并且安全。因为一想要反序列化的话,必须register 注册那些用到的javaBean,少了一个也不行!
然而,里面用到的反射也是根据从obj文件中读取到的数据进行反射的,让我真是大开眼界! 原来还可以这么玩儿啊...
(3)利用 .SO 动态链接库文件去封装一些方法。 因为在研究竞品代码时,我发现有一些obj文件我根本就找不到在哪里调用的。后来组长提醒我,可能和这些SO文件有关。
然后我就找啊找..最后发现确实调用了SO文件里面的方法,而且这些SO文件里面的方法还很关键。(因为我不知道SO文件里面的方法有没有可能去读或者去找手机里面的文件,
如果真的可以,那这也太吊了吧...)
反编译并不是什么违法的事情,就对于个人而言只是一种学习的手段,向别人的代码借鉴和学习。毕竟多一门技术也并不是什么坏事,说不定什么时候就真正派上用场了呢~
一周的竞品研究虽说没有什么突破性的研究成果,但是确实让我一个反编译小白学到了很多一身受用东西。我也是抱着去公司学习和研究一些自己平时很少接触但很有用的东西的这么一个心态,
而不是一味的去写业务逻辑代码,研究一些有技术难度的东西挺好的。这一周下来,组长每次问我最多的一句话就是:“研究的怎么样了?崩溃了没有?”。
还好,反编译这种技术要的就是思维灵活,刚好我的脑洞比较大,找到了很多突破口,让竞品的研究有了些进展,不至于被喷哈哈。
第一次写类似博客的东西,技术性偏少吧...对技术博客的套路还没摸清楚门路...希望下次能写出高技术含量的东西,而不是这种旅游日记哈哈。