2015年2月4日 星期三

初探手工爆破逆向Apk(反編+打補釘+回簽)

為什麼會有這一篇呢?...因為菜逼巴ADR想學學Apk怎麼逆向XD
好歹逆向在Windows上也不算太嫩但感覺技能遲遲無法拿上手機Apk逆向有點雷啊XD


參考文獻:
http://blog.sina.com.cn/s/blog_70677d110100xzht.html
http://blog.csdn.net/lucherr/article/details/39896549

首先
本文主角是這個XD
網路上找來練習逆向的小入門Apk
下載點我點我點我
安裝後,打開程式其實就沒啥功能,就一個控件會負責顯示文字Hello World而已
好惹,那麼來逆逆看它怎麼寫的ψ(`∇´)ψ


本次需要的工具有:
Dex2Jar , 把Apk內的.Dex文件從Android上的Byte Code轉回Java Jar文件

JdGUI , Java官方Jar反編譯工具,可以用來查看Jar內的Java Code怎麼寫的
Sign Tool , 當我們打完補釘需要包回去Apk的時候要用的(apk文件有自帶Hash驗證)
baksmali.jar , 這東西顧名思義就是幫你把.Dex的資料轉回Smali Code(我們才能patach)
smali.jar , 可以幫你把Smali Code的東西轉回Android 在吃的.Dex文件XD

Ok,進入逆向主文~


首先我們得先想辦法看看Apk內部是怎麼寫的,才能決定怎麼打補釘.
而一般Android的Apk Java Code最後編譯完都會把Byte Code存放在Apk內的classes.dex內
所以我們第一件事情是先用WinRAR解壓縮該文件出來.(不過這件事情只有在這支Apk是以SDK開發的時候才成立,如果是以NDK開發情況就不同了XD)
接下來就是把classes.dex文件餵給Dex2Jar.bat,它會開啟cmd介面跑一下,跑完就會生產出可愛的jar文件惹!
接著把剛剛熱呼呼的Jar文件餵給JdGUI就可以看到美麗的Apk的Code了XD
如果你只是想偷Apk技術的應該到這步就結束了
到這裡你可以很容易的看到,在MainActivity的程式碼上寫著:一個TextView類別的物件TV,在Apk的畫面被創建的時候(OnCreate)才會發送一個setText的請求,修改文字內容為"Hello World"

不過到這步,都只能看而已,因為從Dex的Code是Android上才能跑的Byte Code,但是我們需要方便看才把Byte Code"反編譯”回了Jar的Java Code. 如果想修改Dex的內容得採用smali Code才能做Patach.
接著開你的終端機,下指令: java -jar baksmali-2.0.3.jar -x [指定的.Dex文件]
這邊baksmali.jar是用來幫你把Dex文件轉回smali的文件, -x屬性是推回(看說明屬性上介紹)
下完指令後,就會看見資料夾下多了一個out資料夾,裡面通通存放的都是你的Dex文件內的smali的Code囉XD. 至於擺放的方式完全跟你在JdGUI內看到的管理方式是一模一樣的.

還記得我們這次的目標是,修改setText的"Hello World"的內容,所以我們得翻翻MainActivity的smali文件~~然後patach掉該段文字就可以了~
找到MainActivity的smali文件,然後用記事本打開
然後往下捲捲捲捲,就會找到要修改的文字(反白處),可以修改成你想改的.
例如我改:Adr Is Handsome Guy!,改好後就可以把它保存了
修改好指定的smali Code之後再來就是幫它包回去.Dex文件啦
開啟終端機,下指令:java -jar smali-2.0.3.jar -o [指定的Dex文件] out
下完後,就可以看到指定的Dex文件熱呼呼的躺在那邊,已經是被你patach過指定Code的Dex文件了
接著把Patach好的Dex文件塞回去原本的apk內(用WinRAR塞進去就對了)
現在這樣apk就是一個被你修改過的安裝包囉
理論上這樣應該就可以跑了,並且有被你修改過的痕跡,不過...
我們一開始有提到APK有Hash做驗證,如果你安裝包上的Hash跟原本的不一樣,
表示被修改過或者損毀,Android基本上是不會讓你安裝的

所以我們需要幫它簽一個新的Hash上去,簽名.
開啟該死的終端機(?)
然後下:
 java -jar signapk.jar platform.x509.pem platform.pk8 [待簽名的Apk] [簽名後Apk存放的檔案名]
就可以看到資料夾中長出新的Apk,是簽名完畢的Apk,這就是可以安裝的Apk囉!

最後,可以拿去給Android手機安裝看看:
\成功啦/
這句誠懇的話就出現在Apk內惹!