關(guān)于反編譯系列籍嘹,其實(shí)網(wǎng)絡(luò)上有很多總結(jié)的很好的搬卒,反編譯一類的教程吕嘀,我也僅僅是從別人的博客里面了解到部分粗淺的知識(shí)而已违寞。個(gè)人感覺學(xué)習(xí)反編譯最大的作用是去了解別人的實(shí)現(xiàn)過程,所以查看源代碼是個(gè)人認(rèn)為比較重要的偶房,而代碼注入這一部分就主要是為了玩兒了趁曼。
這一篇我寫不寫壓根不重要,網(wǎng)上總結(jié)的好的文章多得是棕洋,畢竟這是有攻擊性的行為彰阴,所以我的目標(biāo)只是記錄一些自己接觸過的點(diǎn)、修改apk的思路拍冠,以及修改一下前面的成果VolleyDemo.apk尿这,所以比較簡(jiǎn)單。
好了断盛,進(jìn)入正題罗洗。既然說到apk的反編譯,自然就會(huì)聯(lián)想到smali
這個(gè)詞钢猛,百度上也有很多相關(guān)知識(shí)伙菜,其實(shí)大家都知道還有一種方法也是學(xué)習(xí)smali很高效的途徑:自己寫一個(gè)簡(jiǎn)單的應(yīng)用,可以只有一個(gè)Activity命迈,只做簡(jiǎn)單的功能贩绕,然后反編譯,對(duì)比源碼來學(xué)習(xí)壶愤。
基本語法我這里就不給大家解釋了淑倾,現(xiàn)在先來回顧一下目前VolleyDemo的主要功能有哪些。
原版VolleyDemo.apk主要功能
-
進(jìn)入應(yīng)用后向
ip.taobao.com
發(fā)出請(qǐng)求征椒,獲取ip地址信息娇哆。
ip參數(shù)為不合法的ip地址 網(wǎng)絡(luò)請(qǐng)求結(jié)果(原始數(shù)據(jù)),以log形式輸出勃救。
D/demo (16032): {"code":1,"data":"invaild ip."}
-
解析結(jié)果碍讨,彈出Toast+Dialog。
數(shù)據(jù)錯(cuò)誤提示 -
點(diǎn)擊“我知道了”剪芥,驗(yàn)證HTTPS支持垄开。
HTTPS請(qǐng)求訪問結(jié)果
目標(biāo)
現(xiàn)在我們通過代碼注入的方式來做以下事情:
- 點(diǎn)擊“我知道了”,不打開HTTPS頁(yè)面税肪,而是關(guān)閉當(dāng)前Activity溉躲。
- MessageDialog描述不準(zhǔn)確,應(yīng)改為“無效IP地址”益兄。
- 將IP改為合法地址锻梳。
實(shí)現(xiàn)過程
準(zhǔn)備
上一篇查看源代碼中有提到:
本章使用上一章節(jié)所搭建的環(huán)境和工具,同時(shí)也使用之前Volley系列的成果作為源文件净捅。工具和源文件可到這里下載疑枯,同時(shí)也可參考上一章節(jié)進(jìn)行環(huán)境配置。
同理蛔六,這里我用的也是同樣的環(huán)境和素材荆永。
注入
- 點(diǎn)擊“我知道了”事件
首先废亭,我們?cè)诓恢涝创a的情況下以最簡(jiǎn)單的方式來解決問題。
點(diǎn)擊我知道了具钥,看現(xiàn)象應(yīng)該能猜出是跳轉(zhuǎn)到下一個(gè)Activity豆村,那么這個(gè)Activity叫什么名字呢?我們可以通過log查看:
查看啟動(dòng)的Activity名稱
可以看到log輸出為HttpsTestActivity
骂删,而且可以得到包名為com.joyin.volleydemo
掌动,同理,MainActivity的信息也一樣可以獲得宁玫。
接下來查看代碼中什么地方用到了HttpsTestActivity
:
除了./activity/HttpsTestActivity.smali
本身粗恢,就只有./activity/MainActivity$1.smali
第52行用到了這個(gè)字段,我們跟進(jìn)代碼欧瘪。
發(fā)現(xiàn)52行所在的環(huán)境是一個(gè)onClick眷射,我們刪掉幾行代碼,再修改一點(diǎn)恋追,代碼沒什么難度凭迹,懂一點(diǎn)smali的話很容易理解:
# virtual methods
.method public onClick(Landroid/view/View;)V
.locals 4
.param p1, "v" # Landroid/view/View;
.prologue
.line 70
iget-object v0, p0, Lcom/joyin/volleydemo/activity/MainActivity$1;->this$0:Lcom/joyin/volleydemo/activity/MainActivity;
invoke-virtual {v0}, Lcom/joyin/volleydemo/activity/MainActivity;->finish()V
.line 71
return-void
.end method
此時(shí)代碼已經(jīng)修改好了,再次運(yùn)行苦囱,彈出對(duì)話框后嗅绸,點(diǎn)擊“我知道了”就直接finish掉,大家可以自己實(shí)驗(yàn)一下撕彤。
- 修改MessageDialog描述
這個(gè)需求比較簡(jiǎn)單鱼鸠,我們先找“獲取請(qǐng)求失敗了”這個(gè)關(guān)鍵字,然而你會(huì)發(fā)現(xiàn)羹铅,除了dex文件適配到了蚀狰,其余地方都找不到,這是因?yàn)楫?dāng)初寫代碼的時(shí)候职员,這句話不是寫在資源里的麻蹋,而是直接放在java代碼里,而smali中的是Unicode編碼焊切,所以要查找\u83b7\u53d6\u8bf7\u6c42\u5931\u8d25\u4e86
:
找過去會(huì)發(fā)現(xiàn)MainActivity
241行定義了該字符串:
我們修改如下:
const-string v3, "\u65e0\u6548\u0049\u0050\u5730\u5740"
再次回編譯扮授,簽名,安裝:
- 將IP改為合法地址
利用前面章節(jié)中的知識(shí)點(diǎn)专肪,將手機(jī)和電腦連上同一wifi刹勃,保證在同一局域網(wǎng)內(nèi)。手機(jī)設(shè)置代理嚎尤,電腦打開charles進(jìn)行抓包荔仁,發(fā)現(xiàn)ip字段傳的參數(shù)是“2dss3”:
抓包結(jié)果
接下來我們以同樣方法找到“2dss3”(MainActivity.smali
第48行),修改為:
const-string v1, "21.22.11.33"
回編譯-簽名-安裝:
apktool b VolleyDemo/ && apksign VolleyDemo/dist/VolleyDemo.apk && adb install -r VolleyDemo/dist/VolleyDemo.apk_sign.apk
至此,簡(jiǎn)單的代碼注入已經(jīng)完成乏梁。
其他
反編譯系列的簡(jiǎn)單處理就寫到這里了次洼,我只記錄了最簡(jiǎn)單的處理方式,但相信各位應(yīng)該能很聯(lián)想出怎么進(jìn)行高難度的注入了掌呜,我就不點(diǎn)破了(我不會(huì)啊滓玖,哭)≈式叮基本技巧掌握了,改文字/圖片/邏輯都可以實(shí)現(xiàn)翩肌。VolleyDemo沒有做任何代碼混淆模暗,加密,安全驗(yàn)證等念祭,僅僅是為了在這里更容易的反編譯兑宇,在這里還是呼吁大家平時(shí)做項(xiàng)目一定要記得加固,基本的代碼混淆粱坤,對(duì)dex做動(dòng)態(tài)加載隶糕、驗(yàn)證等。相信大家都知道站玄,我們可以使用一些免費(fèi)的平臺(tái)來完成這些事枚驻,省時(shí)省力,哈哈株旷。
另:反編譯的技能最好用于學(xué)習(xí)再登,切勿用于惡意攻擊。謝謝~~