一次逆向分析之旅

前言

最近一直在學(xué)習(xí)Android逆向方面的知識(shí),了解了APK的逆向流程,決定那小米的米家對(duì)講APP開刀作為練手。這次僅僅是對(duì)米家對(duì)講機(jī)APP進(jìn)行反編譯和回編譯操作,不涉及到代碼的注入。

開刀工具

1.常用逆向工具
   apktool:反編譯的利器
   dex2jar:將dex轉(zhuǎn)化成jar
   jd-gui:很好的查看jar文件的工具
   IDA:收費(fèi)的最全破解利器(分析dex和so都可以)
  2.逆向破解流程
   (1).拿到一個(gè)APK,先使用apktool進(jìn)行反編譯,輸入指令 
    apktool.bat b test.apk得到smali文件和其他的一些資源文件。
   (2).將apk文件后綴名(.apk)改寫成.zip文件,然后解壓得到 
    classes.dex文件。
   (3).將classes.dex文件拷貝到dex2jar路徑下,運(yùn)行指令(dex2jar
    classes.dex)得到j(luò)ar文件。
   (4).使用jd-gui文件打開jar文件即可以看到j(luò)ava源代碼。
   (5).如果要對(duì)源代碼進(jìn)行修改,則需要在smali文件基礎(chǔ)上改動(dòng),修
    改的前提是需要懂smali語法。
   (6).回編譯。對(duì)文件再次打包簽名生產(chǎn)新的apk,使用指令
  ?。╝pktool.bat b test -o new_test.apk)進(jìn)行回編譯,其中test為反
    編譯后得到的含有smali的文件。
   (7).簽名。目前android簽名有兩個(gè)工具,分別為jarsign工具簽名和
    signapk工具簽名。這兩種簽名方式大致區(qū)別如下:
     a.jarsign是Java本生自帶的一個(gè)工具,他可以對(duì)jar進(jìn)行簽名的。而
     signapk是后面專門為了Android應(yīng)用程序apk進(jìn)行簽名
     的工具。
     b.jarsign工具簽名時(shí)使用的是keystore文件,signapk工具簽名時(shí)
     使用的是pk8,x509.pem文件。
  在這里我使用的是signapk進(jìn)行簽名的,簽名是必須將pk8,x509.pem兩個(gè)文件放在同一個(gè)目錄下,使用指令(java -jar signapk.jar testkey.x509.pem testkey.pk8 debug.apk debug.sig.apk)進(jìn)行簽名。這兩個(gè)文件會(huì)在文章的尾部給出的共享資源下載地址提供下載,至于第一種簽名方式詳細(xì)解看一下博客鏈接地址。
  關(guān)于簽名的詳細(xì)講解可以查看尼古拉斯趙四大神的博客,博客地址為
http://www.wjdiankong.cn/android%E7%AD%BE%E5%90%8D%E6%9C%BA%E5%88%B6%E4%B9%8B-%E7%AD%BE%E5%90%8D%E8%BF%87%E7%A8%8B%E8%AF%A6%E8%A7%A3/
http://www.wjdiankong.cn/android%E7%AD%BE%E5%90%8D%E6%9C%BA%E5%88%B6%E4%B9%8B-%E7%AD%BE%E5%90%8D%E9%AA%8C%E8%AF%81%E8%BF%87%E7%A8%8B%E8%AF%A6%E8%A7%A3/

Smali文件分析

當(dāng)我們使用apktool工具反編譯后會(huì)得到smali文件,smali文件中包含了自己寫的代碼以及使用的第三方庫,如下圖,其中com開頭一般是自己編寫的代碼對(duì)應(yīng)的smali文件,下面的圖中還包括了butterknife和okhttp3一些第三方框架。

文件結(jié)構(gòu).png

  現(xiàn)在開始了分析自己編寫的代碼以及使用的一些資源文件,分析之前先瞅一下smali的真面容,如下圖


Paste_Image.png

初次看肯定有種懵逼的感覺,不過學(xué)習(xí)下smali基礎(chǔ)語法就會(huì)覺得小菜一碟。在samli文件中可以看出當(dāng)我們每編寫的一個(gè)類都會(huì)對(duì)應(yīng)一個(gè)smali文件,同時(shí)也包括資源文件,在資源文件下如drawable和layout中的xml文件也會(huì)生產(chǎn)唯一對(duì)應(yīng)的smali文件,這種文件一般以R$文件包名命名,如layout文件為R$layout.smali,同時(shí)也包括所有的id也會(huì)生成R$id.smali文件。如下圖

Paste_Image.png

在我們反編譯的過后的資源文件中,有兩個(gè)文件很重要,分別是public.xml和ids.xml,它保存了一個(gè)資源id的值及名稱,如上圖中的高亮部分的代碼(const v0,0x7f10011)在smali文件中調(diào)用資源文件時(shí)時(shí)通過值去調(diào)用的,我們都知道在java文件中設(shè)置布局文件只需要通過R.layout+文件名去調(diào)用資源文件,而在smali文件通過十六機(jī)制值調(diào)用,而在public.xml中將文件名與值進(jìn)行關(guān)聯(lián),而同時(shí)在ids.xml中聲明。這兩個(gè)文件當(dāng)我們在進(jìn)行hook代碼時(shí)中涉及到添加資源文件時(shí)很關(guān)鍵,當(dāng)我們添加了新的資源文件,都必須在這兩個(gè)文件中進(jìn)行聲明,分配想要的十六進(jìn)制值,然后在調(diào)用的地方進(jìn)行調(diào)用,這兩個(gè)文件一般都是values文件夾下。

牛刀初試

接下來我們就拿米家對(duì)講機(jī)APP開刀。
  (1)首先將下載好的apk 和apktool放在同一個(gè)目錄文件下,輸入指令(apktool.bat d test.apk)的到smali文件。

Paste_Image.png

上圖為反編譯后的文件目錄,從文件中可以看有兩個(gè)smali文件目錄,可以猜測到該app的方法數(shù)超過了65536的限制,在編譯時(shí)編譯出兩個(gè)dex文件,在第二步得到dex文件來驗(yàn)證下我們的猜測。
  (2)將Apk文件后綴改為.zip文件。然后解壓得出dex文件。

Paste_Image.png

  通過解壓后可以看出果然存在兩個(gè)dex文件,驗(yàn)證了我們第一步的猜想。
  (3)將dex文件和dex2jar放在同一個(gè)目錄下得到,輸入指令(dex2jar classes.dex)jar文件,然后使用jd-gui打開該文件。

Paste_Image.png

 ?。?)現(xiàn)在如果們想進(jìn)行代碼hook,那就可以在smali代碼的基礎(chǔ)上進(jìn)行修改,不過一般不建議直接修改smali代碼,一般都是寫好Java代碼然后轉(zhuǎn)換成smali代碼進(jìn)行注入。java轉(zhuǎn)smali咋Android studuio中有插件(jJava2Smali),裝插件后就可以輕松實(shí)現(xiàn)啦。我么這里不進(jìn)行代碼的注入,僅僅對(duì)該文件進(jìn)行回編譯得到新的apk。選擇文件輸入指令(apktool.bat b test -0 my_unsigned_test.apk)生產(chǎn)apk。在回編譯時(shí)我們遇到一個(gè)錯(cuò)誤 :
No resource found that matches the given name '@android style/Animation.LockScreen和No resource found that matches the given name '@android style/Animation.OptionsPanel
導(dǎo)致回編譯不能成功,剛開始以為該APK做了防止二次打包進(jìn)行的校驗(yàn),后來查閱資料知道是由于該APK引用第三庫導(dǎo)致的。正確的解決方法在將
Animation.LockScreen和Animation.OptionsPanel聲明的地方刪掉,回編譯通過。這個(gè)調(diào)用的一般格式如下

<style name="Base.TextAppearance.AppCompat.Widget.Button.Borderless.Colored" parent="@android:style/Animation.OptionsPanel" />
    <style name="Base.TextAppearance.AppCompat.Widget.Button.Colored" parent="@android:style/Animation.LockScreen" />

(5)將未簽名的Apk進(jìn)行簽名。
經(jīng)過以上的簡單五步就實(shí)現(xiàn)了對(duì)米家對(duì)講機(jī)APP的簡單逆向分析。
最后放大招,現(xiàn)在網(wǎng)上有很多獎(jiǎng)反編譯繼承在一起的逆向工具,將所有文件繼承與右鍵,分析很方便,如下圖

Paste_Image.png

逆向分析工具下載地址:鏈接: http://pan.baidu.com/s/1kUErd8F 密碼: xr6a

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容