Android逆向工程

分析APK文件

要分析APK文件拭抬,首先要了解APK打包過程

安卓打包過程
  1. 打包資源文件(aapt)
    • 檢查Manifest合法性
    • 將res和asserts目錄的資源打包加密,生成resources.arsc
    • 生成加密后的Manifest
    • 將加密后的Manifest和resources.arsc打包壓縮成resource.ap_
    • 生成R.java
  2. 處理aidl文件,生成相應java文件
  3. javac編譯工程源代碼赦肋,生成相應class文件
  4. 轉換所有class文件块攒,生成classes.dex文件
    • 將依賴jar和class文件轉換為dex文件
  5. 打包生成apk
    • 將dex、resource.ap_以及so文件打包成apk
  6. 對apk文件進行簽名
    • 可在build.gradle中指定簽名文件
  7. apk文件對齊
    • 將apk包進行對齊處理佃乘,使apk包中的所有資源文件距離文件起始偏移為4字節(jié)整數(shù)倍囱井,這樣通過內(nèi)存映射訪問apk文件時速度會更快

打包過程就是一個編譯、加密和打包的過程趣避,因此逆向工程就是反編譯庞呕、解密和解壓了。

解壓特別容易,將apk文件后綴改為rar住练,用解壓工具就能將apk文件解壓了地啰。下圖是微信解壓的結果

微信apk解壓結果

不同的apk文件解壓后的內(nèi)容不盡相同,但分析的思路都是一樣的

  1. 一定包含加密后的Manifest文件
  2. 一定包含classes.dex文件讲逛。為了突破65536個方法數(shù)的限制亏吝,所以可能會有多個classes.dex。
  3. 如果項目中使用了so庫盏混,一般會在lib文件夾下
  4. 資源文件的中加密xml蔚鸥,可能在r文件夾,res文件夾下

使用了加殼措施的apk许赃,由于加殼方案不一樣止喷,所以資源文件和dex文件的處理會有差異,這里不做深入討論混聊。

dex2jar

如果只是要了解別人的實現(xiàn)方案弹谁,那么解壓后的classes.dex通過反編譯即可得到jar包,再通過JD-GUI就可以看到大部分的源碼了技羔。

這里不贅述怎么使用dex2jar和JD-GUI僵闯,下圖微信反編譯后的結果

JD-GUI查看dex2jar結果
  1. 由于微信方法數(shù)較多,所以進行了分包藤滥,需要使用2.1以上版本的dex2jar鳖粟,直接將apk文件作為輸入,就可以導出jar包了拙绊。
  1. Activity是沒有完全混淆向图,所以可讀性還比較高。其他代碼讀起來會比較困難标沪。

apktools

如需解密資源文件就要用到apktool榄攀。我們會用到的apktools的功能有:

  1. 反編譯資源文件和classes.dex
  2. 將反編譯的資源文件重新打包為apk

使用命令apktool d xxx.apk

微信反編譯后的結果

可以看到使用apktools反編譯的結果和直接解壓和類似,主要的不同在于:

  1. 包括Manifest和資源文件中的xml都已經(jīng)解密了
  2. class文件變成了smali文件夾金句,且里面的smali文件和反編譯的jar包的類基本對應

了解Smali文件和語法

Smali是Dalvik的寄存器語言檩赢,語法比較簡單,只是比較繞违寞。下面以一個簡單的Activity來了解Smali語法贞瞒。

package com.netease.smali;

  import android.app.Activity;
  import android.os.Bundle;

  public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      }
  }
 .class public Lcom/netease/smali/MainActivity;
  .super Landroid/app/Activity;
  .source "MainActivity.java"

  # direct methods
  .method public constructor <init>()V
    .locals 0

    .prologue
    .line 14
    invoke-direct {p0}, Landroid/app/Activity;-><init>()V

    return-void
  .end method

  # virtual methods
  .method protected onCreate(Landroid/os/Bundle;)V
    .locals 1
    .parameter "savedInstanceState"

    .prologue
    .line 18
    invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V

    .line 19
    const/high16 v0, 0x7f03

    invoke-virtual {p0, v0}, Lcom/fusijie/helloworld/MainActivity;->setContentView(I)V

    .line 20
    return-void
  .end method
  • 前三行指明了類名,父類名趁曼,和源文件名军浆。
  • 類名以“L”開頭相信熟悉Jni的童鞋都比較清楚。
  • “#”是smali中的注釋挡闰。
  • “.method”和“.end method”類似于Java中的大括號乒融,包含了方法的實現(xiàn)代碼段掰盘。
  • 方法的括號后面指明了返回類型,這同樣類似與Jni的調(diào)用赞季。
  • “.locals”指明了這個方法用到的寄存器數(shù)量愧捕,當然寄存器可以重復利用,從“V0”起算碟摆。
  • “.prologue”指定了代碼開始處晃财。
  • “.line”表明這是在java源碼中的第幾行,其實這個值無所謂是多少典蜕,可以任意修改断盛,主要用于調(diào)試。
  • “invoke-direct”這是對方法的調(diào)用愉舔,可以看到這里調(diào)用了是Android.app.Activity的init方法钢猛,這在java里是隱式調(diào)用的。
  • “return-void”表明了返回類型轩缤,這和java不一樣命迈,即使沒有返回值,也需要這樣寫火的。
  • 接下來是onCreate方法壶愤,“.parameter”指明了參數(shù)名,但是一般沒有用馏鹤,需要注意的是p0代表的是this征椒,p1開始代表函數(shù)參數(shù),靜態(tài)函數(shù)沒有this湃累,所以從p0開始就代表參數(shù)勃救。
  • 在實現(xiàn)里先是調(diào)用了父類的方法,然后再調(diào)用setContentView治力,注意這里給了一個傳參蒙秒。整形的傳參,這個值是先賦給寄存器v0宵统,然后再調(diào)用的使用傳遞進去的晕讲。smali中都是這么使用,所有的值必須通過寄存器來中轉马澈。這點和匯編很像瓢省。

詳細的Smali語法可以參考進入Android Dalvik虛擬機之Dalvik指令集

修改Smali并打包

了解Smali語法后就可以嘗試修改源碼了。

例如箭券,我們需要在Activity中顯示一個Toast。通過Java疑枯,只需要在OnCreate中增加一行代碼

 Toast.makeText(this, "Hello, Smali", Toast.LENGTH_LONG).show();

翻譯為Smali就是:

    .line xx
    const-string v0, "Hello, Smali"

    const/4 v1, 0x1

    invoke-static {p0, v0, v1}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

    move-result-object v0

    invoke-virtual {v0}, Landroid/widget/Toast;->show()V

除了這些辩块,還有兩個地方需要修改:

  1. “.locals 1”,因為本來只用到了v0,現(xiàn)在多用了一個v1废亭,所以改為“.locals 2”国章。
  2. “.line xx” xx隨意改為一個不重復的值即可。

最后通過apktool b即可將項目重新打包豆村,再經(jīng)過簽名就能運行了液兽。

應用加殼

有反編譯二次打包的黑科技,就有apk加殼的保護方式掌动。大部分經(jīng)過加殼保護的apk四啰,已經(jīng)無法通過上述方案進行二次打包了。

應用加殼的基本原理是

  1. 對原始APK進行反編譯粗恢,并記錄其簽名信息
  2. 將dex文件加密并放入assets文件夾中
  3. 使用自定義的Application接管apk原本的Application
  4. Applicaiton啟動時首先進行簽名驗證
  5. 再解密dex并動態(tài)加載class文件

為了破解這類加殼應用柑晒,又出現(xiàn)了ZjDroid--脫殼神器

這類脫殼工具都是針對特定的加殼方案去做逆向工程眷射,針對“愛加密”的加殼方案匙赞,也有文章專門進行分析:Apk脫殼圣戰(zhàn)之---脫掉“愛加密”的殼

參考文章

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市妖碉,隨后出現(xiàn)的幾起案子涌庭,更是在濱河造成了極大的恐慌,老刑警劉巖欧宜,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坐榆,死亡現(xiàn)場離奇詭異,居然都是意外死亡鱼鸠,警方通過查閱死者的電腦和手機猛拴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚀狰,“玉大人愉昆,你說我怎么就攤上這事÷樘#” “怎么了跛溉?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長扮授。 經(jīng)常有香客問我芳室,道長,這世上最難降的妖魔是什么刹勃? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任堪侯,我火速辦了婚禮,結果婚禮上荔仁,老公的妹妹穿的比我還像新娘伍宦。我一直安慰自己芽死,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布次洼。 她就那樣靜靜地躺著关贵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卖毁。 梳的紋絲不亂的頭發(fā)上揖曾,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音亥啦,去河邊找鬼炭剪。 笑死,一個胖子當著我的面吹牛禁悠,可吹牛的內(nèi)容都是我干的念祭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼碍侦,長吁一口氣:“原來是場噩夢啊……” “哼粱坤!你這毒婦竟也來了?” 一聲冷哼從身側響起瓷产,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤站玄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后濒旦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體株旷,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年尔邓,在試婚紗的時候發(fā)現(xiàn)自己被綠了晾剖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡梯嗽,死狀恐怖齿尽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情灯节,我是刑警寧澤循头,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站炎疆,受9級特大地震影響卡骂,放射性物質發(fā)生泄漏。R本人自食惡果不足惜形入,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一全跨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧亿遂,春花似錦浓若、人聲如沸盒使。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至苞慢,卻和暖如春诵原,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挽放。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工绍赛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辑畦。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓吗蚌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親纯出。 傳聞我的和親對象是個殘疾皇子蚯妇,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容