【凱子哥帶你做高仿】“煎蛋”Android版的高仿及最佳化(一)——逆向工程及TcpDump抓包入門,androidtcpdump

來源:互聯網
上載者:User

【凱子哥帶你做高仿】“煎蛋”Android版的高仿及最佳化(一)——逆向工程及TcpDump抓包入門,androidtcpdump

轉載請註明出處:http://blog.csdn.net/zhaokaiqiang1992

轉眼之間,畢業季已經來臨,四年充實而忙碌的大學也將走到尾聲,我很期待畢業後的生活呀!

首先多謝各位對我的Blog的支援,大家互相交流學習,作為回報,我把自己收藏的好文章分享給大家,詳情請戳Android相關問題的好文章整理——溫故而知新,可以為師矣。

除此之外呢,最近一直忙於工作和準備畢業論文,所以文章產量少了些。我的畢設當然和Android相關啦,就是“煎蛋”App的逆向工程、高仿及最佳化,既可以作為畢設,也可以作為自己的一個小作品,為以後面試什麼的做準備~所以開了這個系列,紀錄這個項目的點點滴滴,和大家分享經驗,順便當做畢業論文素材,一舉多得~

PS:本系列文章中所涉及到的技術、資料和介面地址,僅供學習交流,務必不可做壞事!否則後果自負!

  • 逆向工程
  • 代碼架構解析
  • TcpDump抓包
  • WireShake分析資料包

逆向工程

既然是做高仿,當然需要逆向工程了,由於Android是基於Java的,所以反編譯的難度並不大,各種資料很豐富,所以這裡就簡單介紹。

我們在反編譯的時候,可以按照下面的流程進行

  • 使用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類中的方法a

 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,用法也很簡單,

協助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對相同的類進行反編譯之後的代碼

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相容包和其他相容組件,這點在上面的包結構中也有所體現。

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串連上,然後使用下面命令查看串連裝置是否成功

kaiqiangzhaoMacBook:~ zhaokaiqiang$ adb devicesList of devices attached 16e8718e    device

串連成功之後,使用下面命令將TcpDump上傳到/data/local/tcpdump路徑

kaiqiangzhaoMacBook:~ zhaokaiqiang$ adb push ~/Desktop/tcpdump /data/local/tcpdump4189 KB/s (1801155 bytes in 0.419s)kaiqiangzhaoMacBook:~ zhaokaiqiang$ 

然後使用下面命令修改許可權

kaiqiangzhaoMacBook:~ zhaokaiqiang$ adb shell chmod 777 /data/local/tcpdump

到此為止,我們的TcpDump就部署成功了。

我們簡單介紹幾個常用命令。

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

adb shell /data/local/tcpdump -n -s 0

-n 代表不把網路位址轉譯成名字
-s 0 抓取資料包時預設抓取長度為68位元組。加上-s 0 後可以抓到完整的資料包

因為我們網路請求很多,我們需要進行過濾,比如要擷取所有10.10.10.1 的主機收到的和發出的所有的資料包

kaiqiangzhaoMacBook:~ zhaokaiqiang$ adb shell /data/local/tcpdump -n -s 0 host 10.10.10.1

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

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

 adb shell /data/local/tcpdump -n -s 0 -w /sdcard/jiandan.pcap host 10.10.10.your ip

這樣我們就可以把所有和當前ip進行通訊的包抓到,然後儲存到/sdcard/jiandan.pcap檔案,等著我們用下面的WireShake進行分析了

WireShake分析資料包

經過上面的一步,我們已經抓到了煎蛋App和伺服器之間的通訊包,抓包時,有幾點需要注意:

這樣,我們就可以得到我們的pcap格式的資料包了,下一步就是使用WireShake進行資料分析。
WireShake也很強大,但是我們這裡只是簡單的使用,更多強大功能自己去摸索。

我們可以使用下面的命令把檔案下載下來

adb pull /sdcard/jiandan.pcap ~/Desktop/jiandan.pcap

下面是一個抓包的資料,用WireShark開啟後,如下

注意紅方框的地方。一般來說,資訊類App擷取資料都是使用Http協議的介面,而對即時性要求比較高的App,比如股票行情類的,則是使用Socket通訊,顯示在這裡就是使用的是TCP協議。我們可以看到,本地ip和42.120.48.125進行了Http通訊,點開下面的包資料,就可以在請求文本裡面看到我們的完整的請求URL,這個就是擷取段子的介面,使用page進行分頁。

其實按照這種方法,我們能夠把基本上所有的使用Http協議的介面抓取出來,但是還有更好的辦法,一般來說,這些地址都是寫入程式碼在代碼裡面的,知道了一個地址格式,我們就可以直接搜尋尋找出其他類似的介面,比如,我們把第一步反編譯出來的類檔案放在Eclipse中的Java項目裡面,然後全項目尋找關鍵詞oxwlxojflwblxbsapi試試

果然出現了很多的介面地址,這樣我們就可以省下很大力氣,具體介面測試不多說,自己去試。

其實一開始我想做煎蛋用戶端,是通過Jsoup解析Web網址實現的,而且也解析成功了,能夠正常使用,但是後來突發奇想,想看看代碼怎麼寫的,就順便看了下,成功擷取到介面之後,能夠更加方便的使用,所以就直接用了。

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

下面是完成的功能

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

感謝煎蛋的開發人員DanielWangDev

後續將持續更新…

最後還是警告一下:本系列文章中所涉及到的技術、資料和介面地址,僅供學習交流,務必不可做壞事!否則後果自負!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.