安卓逆向從0到1學習總結

前言


    PS:該文已經首發於公衆號信安之路!!!

    初識安卓逆向是在2019年的暑假,到現在也快一年了,這一年來有剛從web滲透轉來的迷茫,有成功破解了第一個app的喜悅,也有通宵熬夜逆向的心酸,到現在感覺自己成功踏進逆向大門的滿足感。原本打算在入門之後弄個安卓逆向教程作爲總結,但是吧,寫文章教程,各大論壇都有,而且還寫得挺好,例如52論壇的<<教我兄弟學逆向>>教程,自己再去寫就沒多大意思了;做視頻教程吧,因爲個人原因,沒有那麼多時間去錄製視頻和剪輯視頻。謹以此文總結我的逆向路程以及送給想要學習安卓逆向的新人!!!


前置技能


    逆向這玩意不是很玄學,不像web滲透那樣很玄學(強烈吐槽一波以前我還在做web滲透的時候,挖不出大洞也就算了,全都是一堆反射型的xss,xss到底跟我有多過不去啊),只要你基礎夠,在捨得掉頭髮,就能夠有產出,下面簡單羅列一下我個人認爲的安卓逆向所需要的前置技能:

  • 一定程度的安卓正向開發經驗

  • 會寫簡單的腳本,例如python、c

    正向開發越熟練,在逆向的過程越容易找到關鍵點,同時在正向開發的過程中總要了解一下安卓系統的機制吧,這都是後面的無論是脫殼還是寫自己的加固代碼必要的知識;至於後面的會寫簡單的腳本,既是爲了逆向也是爲了能夠正向開發,例如脫殼現在的主流方案要麼ida動態調試到脫殼點dump下來,要麼使用frida編寫腳本hook脫殼,再要麼編寫xposed插件脫殼(ps:腳本小子除外),這些都需要我們自己寫腳本的;至於正向開發那就更沒得說了,無論是你想實現自己的加固方案還是要做涉及到底層的開發都需要寫到so層裏面去,而這前提是你的會c或者c++。至於怎麼學,我個人建議去網上找文章教程跟着敲代碼就可以了,例如菜鳥教程或w3c!!!


基礎技能


    說是基礎,其實真的是基礎,別看看起來真的很難的樣子,再安卓逆向的世界裏這都是要非常熟練的基礎能力,我個人總結如下:

  • 熟練使用AndroidKiller、Jeb等工具

  • 瞭解smali語言,能夠將簡單的sali語句翻譯成java

  • 能夠使用AndroidStudio進行java層面的動態調試

  • 瞭解arm彙編語言

  • 從0到一編寫一個so文件

  • 能夠配合ida對so成進行動態調試並簡單瞭解ida的使用

  • 配合so層的編寫經驗實現自己的反調試代碼,並一一動手調試過掉這些反調試

    我最開始學習這些的時候是大部分跟着52論壇的教我兄弟學逆向教程學的,時間大概兩個月左右吧,但有些沒有的,例如smali語法,我就去百度搜索和下載官方對應的指令表來學習,學完之後看懂一些簡單的語法是沒有問題了,還有arm彙編,這個建議去圖書館找本專業書來看,寫得比較詳細系統,至於其他的,要多動手實踐。當然,看雪論壇等這些技術論壇有很多資料,沒事就翻一翻,是能夠發現驚喜的,有些東西不同時候看是完全不同的,當你在看到能夠一下想到原理並知道他下一步要幹什麼的時候,基本這個知識點你差不多很熟練了,再這個知識點上你也能夠被叫聲大佬了!!!


進階技能


    在上面基礎學完了之後,其實就可以做一些實踐了,比如刷一下bugku、攻防世界的題啊,去百度一下一下破解教程,跟着大佬的博客學着破解啊,多練手練着練着就知道一般哪裏是逆向的關鍵點了!!!

    然後說起進階技能吧,就是再基礎上開始逆向精彩的地方--加固和脫殼之間的對抗,個人總結要學習、研究的知識點有如下:

  • 瞭解安卓apk包的架構,能解析apk的各種文件,例如dex、xml文件

  • 瞭解動態加載的技術

  • 學習安卓第一代殼(落地加載殼)的加固方案然後自己動手實現

  • 學習frida的食用方法,會使用frida編寫簡單的脫殼機

  • 有碎片時間可以閱讀一下安卓源碼

  • 學習安卓第二代殼(不落地加載殼)的加固方案有條件就自己實現一下

  • 針對第一代殼和第二代殼的加載點無論是使用動態調試還是hook的方法脫殼修復

  • 瞭解第三代殼(函數抽取式殼)和第四代殼(vmp)的原理

  • 學會使用或者自己編寫針對第三代殼的脫殼機,例如:fart、frida-unpack等等

  • 能自己解析so文件,也就是elf文件,這是後面so層加密加固的前提

  • 有時間可以學習一下unicorn框架,u1s1,這框架是真的舒服,我記得github上已經有基於unicorn的so調用器,名字叫啥忘了

  • 學習so層的一些加密加固方案

  • 然後還要ollvm框架,不得不說,ollvm用來對抗ida的分析那滋味是真的酸爽,可以看一下無名俠大佬還有其他大佬寫的利用unicorn進行反混淆的文章,是真的棒

    上面這些是關於加固脫殼我的學習路程,因爲個人水平有限,上面可能寫的不是很好。我個人始終認爲,不會自己寫加固代碼,就不會真正的脫殼,更不要說修復了,其實,大家寫的加固方案加載dex點基本都差不多,你會寫了,也知道了加載點再哪兒,脫殼點也就一清二楚了。其他的關於怎麼學,可以買書也可以百度大佬們的博客,書我覺得姜維大佬的小黃書和非蟲大佬的安卓逆向的書很好,其他的知識點就只有百度和去各大論壇去找資料了!!!


其他技能


    當然,除了上面這些跟安卓逆向一看就有直接聯繫的知識以外,還有很多看似和逆向沒那麼多的技能,這些看似不重要,但我覺得這些一點都不比加固脫殼的技術的重要性差,例如:

  • 谷歌百度搜索能力和日誌分析,安卓逆向這東西你越學的深,遇見問題一般來說都沒有現成的解決方案,有的話多半也是商業加密,基本在網上是搜不到的,多谷歌和進行日誌分析可能找不到怎麼解決,但能找到哪裏出現問題,能找到哪裏出現問題離解決問題就只有10%了。

  • 流量抓取姿勢,很多人一聽流量抓取就以爲這是web滲透做的事,其實不然,app是啥,就是個客戶端,和瀏覽器沒什麼區別,有時候逆向的時候功能點很多找不到逆向點的時候完全可以靠定位流量鎖定關鍵代碼的,當然,在各大廠商日益重視流量安全的今天,抓取流量有時候比較麻煩了,例如,高版本的安卓已經不信任個人https證書,想通過https證書抓取流量在高版本有點行不通了,但是,還是可以通過xposed插件、vpn、更換低版本安卓、hook底層發包函數等方式抓取流量,方法很多,這裏只是想說明流量很重要在需要聯網的app的逆向過程中。

  • 博客書寫,寫博客不是裝逼,不是全寫高端的,寫博客的本質是總結幫助總結梳理自己的知識體系,寫博客只能說仁者見仁智者見智吧!

    上面寫的只是一小部分,這裏挑選的是我認爲最重要的部分,總之,我覺得要學好安卓逆向,還需要耐得住寂寞,研究這東西真的需要堅持,覆蓋的東西太多了!!!


後序


    其實還有很多想要寫的,但是刪了又加,刪了又刪,就成這樣子了,可能寫的不是很好,一邊寫一邊回憶自己這一年走過來的艱辛,心緒不是很好,大致上寫出來了我自己的學習路線。

    謹以此文總結自己入門安卓逆向的學習,也送給所有對安卓逆向感興趣的朋友!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章