作者afz096 (我被淡水的路宠坏了)
看板AndroidDev
标题[分享] apk 的反-反组译(anti-decompiler) proguard
时间Fri Jan 21 15:25:43 2011
其实就是利用 proguard,对整个专案的程式码做"混淆",让人无法轻易的解析。混
淆的意思是将程式码中,原本有意义的变数或函数的名称,代换成无意义的文字。
诚如就像版友之前所说,就算被混乱过,只要花时间,还是可以看出程式的架构。不
过假设你有一个担心的老板,还是可以将 proguard 的混淆结果拿来说嘴一下:)。
另外一个考量的是时间成本,花时间解析这份经过混淆的 code,搞不好所花得时间
就可以硬刻出相同的功能外加 debug 好几回。就时间成本来考量,proguard 或许也有
些用处。
Android 从 ADT(Android Development Tools) 8.0.0 开始内建支援 proguard,
详细资料请参考网页。
http://developer.android.com/guide/developing/tools/proguard.html
而要将经过 proguard 的结果输出,要用
File -> Export -> Android -> Export Android Application,这在网页上没有描
述的非常清楚,当初有稍微找了一下。
proguard 预设是利用英文字母来替换原来变数或函数的名字,但是可以利用参数的
设定,利用其他的"符号"来代替英文字母。参数如下:
-obfuscationdictionary dic.txt
dic.txt 是字典档,存放我们希望替换的符号。之前在研究的时候,突然福至心灵,
用了神奇的字典档(我自己觉的还蛮神奇的)
麤 龘 贔 驫 矗 毳
(其实还有蛮多字 ptt 无法打出来,其实就是一堆难念笔划又多的中文字)
没错,就是利用这些我自己都不太会念的中文字,当初的想法很简单,我就是要让人
难以辨识,我知道中文是两个字元,如果在不支援的双 bytes 的电脑上,会显示乱码,
如果在支援的电脑上,会显示难以念出的中文字。但是中文字经过编译之後会变啥,程式
是否还能正常执行,我没把握也没概念,就抱着姑且一试的心情,反正 build 一次也两三
分钟而已。
结果比我预期的好,程式可以执行,混淆的结果也颇让人满意,节录一小段反组译之後
的 code:
http://pastebin.com/embed_iframe.php?i=35jiWneR
变数名称的地方,肉眼辨识下都是同一个符号。不过我无法担保你如果使用同样的字
典档,程式是否一样可以正确无误。或许这些复杂的中文字,在 progroud 处理的时候已
经是分开的字元了,这我就没有仔细研究了。
proguard 的参数请参考 proguard 的网页:
http://proguard.sourceforge.net/index.html#/manual/usage.html
小结:
android 已经将 prograd 内建了,透过适当修改混淆器的字典档,可以加强混淆的
程度。
最後的心得:
在机会成本的观念下,个人是觉的 proguard 还是有一点点的保护作用。想要做研究
深入了解,当然是可以好好的拆(猜)解别人的 code。但在金钱和时间考量下,这样的逆向
工程似乎就不是最佳解了。
当初是上面的老板担心,将来程式放到 market 上,我们能有什麽保护措施?所以才
花了点时间研究这些东西。但是这些东西真的可以保护到程式码吗?我反而想问,我们的
程式真的需要这样的保护吗?还是只是敝帚自珍而已?
总之我花了点时间,玩了一些东西,就整理一下和大家分享:)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.119.80.94
1F:→ qrtt1:不过 hacker 根本不看 code,是直接改变局部的流程。 01/21 15:43
2F:推 nowar100:收录至 z-3-2-3 01/21 16:11
3F:推 abccbaandy:不看code? 详细希望 01/21 21:12
4F:→ coronach:应该就直接挖 例如说某一步明显挡掉某行为 直接改那边 01/21 22:12
5F:→ coronach:要全部逆向工程太耗时了 01/21 22:12
6F:推 LoveCheer:有看有推!!! 01/21 23:15
7F:→ abccbaandy:正常不是都这样吗...谁会在乎你全部的功能 01/21 23:25
8F:推 gpc:改作porting卖机器比较实在 XD 01/23 12:52
9F:→ a1234957:现在PORTING的人一堆 01/23 18:07