Android 逆向工程之步驟

PS:本系列文章中所涉及到的技術、數據和接口地址,僅供學習交流,務必不可作壞事或者是用於商業用途!不然後果自負!html

來源:http://blog.csdn.net/zhaokaiqiang1992java

 

  • 逆向工程
  • 代碼框架解析
  • TcpDump抓包
  • WireShake分析數據包

逆向工程

既然是作高仿,固然須要逆向工程了,因爲Android是基於Java的,因此反編譯的難度並不大,各類資料很豐富,因此這裏就簡單介紹。android

咱們在反編譯的時候,能夠按照下面的流程進行git

  • 使用apktool將apk進行反編譯,獲取到res中的佈局文件、drawable中的圖片資源,AndroidManifest.xml中的組件聲明和權限聲明,values中的常量值等數據
  • 將apk改成zip後綴,解壓獲取到classes.dex文件,而後使用dex2jar工具將其反編譯,獲取到classes.jar文件,而後使用JD-GUI進行查看便可

這個是一般的反編譯流程,可是呢,我還要介紹一些其餘的東西。第一步流程中,沒有太多東西,通常都能獲取到咱們想要的資源,可是在把dex轉化成jar的過程當中,使用上面的作法能夠查看到java源碼,可是,dex2jar對Android中的switch語句解析的不是很徹底,因此看起來會很是費勁,咱們以「煎蛋」逆向工程以後的某個類舉例,下面是使用dex2jar,而後使用JD-GUI查看的com.danielstudio.app.wowtu.a.ae類中的方法agithub

 

protected void a(g paramg)
  {
    if (isCancelled());
    do
    {
      return;
      w.e().remove(this.b.a);
    }
    while (!(h.a(paramg));
    String str1 = (String)paramg.c();
    String str2 = str1.split("\\|")[1];
    if (!(str1.split("\\|")[2].trim().equals("0")))
      switch (this.c)
      {
      default:
      case 1:
      case 0:
      }
    while (true)
    {
      while (true)
      {
        while (true)
        {
          this.a.c(this.d);
          com.danielstudio.app.wowtu.f.e.a(w.c(this.a), str2);
        }
        w.a(this.a).add(this.b.a);
        com.danielstudio.app.wowtu.c.e locale2 = this.b;
        locale2.i = (1 + locale2.i);
      }
      w.b(this.a).add(this.b.a);
      com.danielstudio.app.wowtu.c.e locale1 = this.b;
      locale1.j = (1 + locale1.j);
    }
  }

  

 

上面的這種代碼格式很是難看,基本看不出原來的運行邏輯,因此再給你們介紹一個反編譯的工具,叫作Procyon,用法也很簡單,shell

 

幫助
java -jar decompiler.jar

反編譯單個class文件
java -jar procyon-decompiler-0.5.24.jar AutoCloseableExample.class  

反編譯整個Jar包
java -jar procyon-decompiler.jar -jar myJar.jar -o out

  

 

下面是使用Procyon對相同的類進行反編譯以後的代碼api

 

protected void a(final g g) {
        if (!this.isCancelled()) {
            w.g.remove(this.b.a);
            if (h.a(g)) {
                final String s = (String)g.c();
                final String s2 = s.split("\\|")[1];
                if (!s.split("\\|")[2].trim().equals("0")) {
                    switch (this.c) {
                        case 1: {
                            this.a.e.add(this.b.a);
                            final e b = this.b;
                            ++b.i;
                            break;
                        }
                        case 0: {
                            this.a.f.add(this.b.a);
                            final e b2 = this.b;
                            ++b2.j;
                            break;
                        }
                    }
                    this.a.c(this.d);
                }
                com.danielstudio.app.wowtu.f.e.a(this.a.b, s2);
            }
        }
    }

  

 

代碼邏輯這麼清晰,有沒有被驚豔到呀~
因此說,不能光知道那些人人皆知的工具,有不少其餘的工具也是很是的好用的。服務器

代碼框架解析

好啦,如今咱們獲得咱們想要的源代碼了,咱們來簡單的分析一下網絡

若是你們下載過」煎蛋」的話,應該能看出來,UI上使用的是很是新的設計風格,也就是Material Design設計風格。可是真正的Material Design須要Android L版本的支持,因此要考慮兼容性,就要用到最新的support.v7兼容包和其餘兼容組件,這點在上面的包結構中也有所體現。架構

f4788e51858220b1

com.afollestad.materialdialogs這個包,從名字上也能夠看是個Material Design風格的Dialog,是爲了保持風格的統一。

com.danielstudio.app.wowtu這個包,則是煎蛋App的核心包,裏面是具體的邏輯代碼,咱們須要重點分析的東西都在這裏面

loopj.android.http這個包是否是很熟悉?這是android-async-http,一個很是出名的網絡請求的開源框架,這是整個項目的網絡請求核心包

com.nostra13.universalimageloader這個包沒必要我多廢話了,加載圖片的框架,功能很強大

在下面的那些包就是用於分享的第三方SDK了,好比QQ和新浪的,umeng則是用來渠道統計和升級的第三方SDK

最下面的uk.co.senab.phtotview則是一個很強大的圖片顯示控件,能夠根據手勢自由放縮

到目前爲止,咱們已經知道了這個App的主要框架了,下面我簡單的說下要高仿的總體框架。

網絡請求方面,我傾向於使用Volley,由於這個庫針對複雜網絡狀況下頻繁的小數據量請求進行了優化,因此對煎蛋這種內容類的App比較合適。

在圖片加載方面,UIL雖然能夠勝任這個工做,可是,我準備試一試FaceBook新推出的Fresco圖片加載框架,以前我翻譯過一篇關於Fresco的官方介紹,詳情請戳FaceBook推出的Android圖片加載庫-Fresco。

其餘的框架,好比butter knife ,也準備試一下,雖然感受在這個項目裏面沒有必要使用IOC框架,可是以前的項目使用的都是AFinal,因此準備入手一下,試試好用不啦~

其實主要的框架也就暫時想到這麼多,更多的還須要一邊作一邊引入,更多的是View的開源項目,熟練的使用Githun哦~

TcpDump抓包

其實,上面作的這些工做都很簡單,更重要的是,咱們如何去獲取數據接口,沒有接口,咱們如何高仿呢,是不?因爲煎蛋App是通過混淆的,大部分核心代碼難以閱讀,因此呢,我給你們介紹下如何在Android設備上使用TcpDump進行抓包。

TcpDump是Linux裏面很強大的網絡數據採集工具,也就是咱們常說的抓包工具,抓包能夠幹不少壞事啦,不過,咱們都是乖小孩~

由於Android系統自己就是以Linux 2.6 kenal做爲內核的,因此咱們可使用TcpDump進行抓包。

首先呢,咱們須要把TcpDump上傳到咱們的測試機上去,我使用的是eng工程模式的Nexus5測試機,使用Genymotion虛擬機沒有成功,多是由於TcpDump不能運行在x86架構的虛擬機上,ADT原生的虛擬機是ARM架構,應該可使用,可是個人打開太慢,就沒有測試,若是你要使用真機,要確保是eng工程模式。

有了測試機以後,adb鏈接上,而後使用下面命令查看鏈接設備是否成功

鏈接成功以後,使用下面命令將TcpDump上傳到/data/local/tcpdump路徑

而後使用下面命令修改權限

到此爲止,咱們的TcpDump就部署成功了。

咱們簡單介紹幾個經常使用命令。

下面的命令是用來抓包的最簡單的命令

-n 表明不把網絡地址轉換成名字
-s 0 抓取數據包時默認抓取長度爲68字節。加上-s 0 後能夠抓到完整的數據包

由於咱們網絡請求不少,咱們須要進行過濾,好比要獲取全部10.10.10.1 的主機收到的和發出的全部的數據包

TcpDump還有不少強大的用法,我就不一一解釋了,在個人收藏文章有,你們留言就得了。Android相關問題的好文章整理

咱們使用的命令是下面這樣的

這樣咱們就能夠把全部和當前ip進行通信的包抓到,而後保存到/sdcard/jiandan.pcap文件,等着咱們用下面的WireShake進行分析了

WireShake分析數據包

通過上面的一步,咱們已經抓到了煎蛋App和服務器之間的通信包,抓包時,有幾點須要注意:

  1. 儘可能減小測試機上的App數量,避免無用數據混淆視聽
  2. 抓包儘可能簡短有效,在App請求的時候開始抓,請求完畢立刻中止

這樣,咱們就能夠獲得咱們的pcap格式的數據包了,下一步就是使用WireShake進行數據分析。
WireShake也很強大,可是咱們這裏只是簡單的使用,更多強大功能本身去摸索。

咱們可使用下面的命令把文件下載下來

下面是一個抓包的數據,用WireShark打開後,以下

1744a32e6077fb31
注意紅方框的地方。通常來講,資訊類App獲取數據都是使用Http協議的接口,而對實時性要求比較高的App,好比股票行情類的,則是使用Socket通信,顯示在這裏就是使用的是TCP協議。咱們能夠看到,本地ip和42.120.48.125進行了Http通信,點開下面的包數據,就能夠在請求文本里面看到咱們的完整的請求URL,這個就是獲取段子的接口,使用page進行分頁。

其實按照這種方法,咱們可以把基本上全部的使用Http協議的接口抓取出來,可是還有更好的辦法,通常來講,這些地址都是硬編碼在代碼裏面的,知道了一個地址格式,咱們就能夠直接搜索查找出其餘相似的接口,好比,咱們把第一步反編譯出來的類文件放在Eclipse中的Java項目裏面,而後全項目查找關鍵詞oxwlxojflwblxbsapi試試

果真出現了不少的接口地址,這樣咱們就能夠省下很大力氣,具體接口測試很少說,本身去試。

其實一開始我想作煎蛋客戶端,是經過Jsoup解析Web網址實現的,並且也解析成功了,可以正常使用,可是後來突發奇想,想看看代碼怎麼寫的,就順便看了下,成功獲取到接口以後,可以更加方便的使用,因此就直接用了。

這個項目的段子功能模塊,已經基本完成,後續功能正在作,但願這個項目能成爲新手的很好的學習資料
,我也很用心的在作,若是你看了代碼,有所收穫,那是極好的,若是你發現我寫的代碼性能很差,或者是有更好的解決方案,但願你能告訴我,提交issue或者是pull request,我想把這個項目作的比9GAG項目更好。

下面是完成的功能

  1. 段子顯示
  2. 評論數量顯示
  3. 評論詳情顯示
  4. 評論過多隱藏樓層
  5. 加載動畫
  6. 左滑退出
  7. 投票
  8. 正在完善的其餘功能…

本項目的github地址:https://github.com/ZhaoKaiQiang/JianDan

感謝煎蛋的開發者DanielWangDev

相關文章
相關標籤/搜索