爬虫----记录某新闻详情页app逆向过程(app逆向初学第一次实战)
僅供學習交流使用,非商業用途,如有侵權,請聯系我刪除!!!
直接進入正題:
1. 使用Charles抓包:
發現請求不能正常返回,返回“數據加載異常,點擊屏幕刷新”
-
這說明我們的抓包環境被識別出來了,解決方法:
-
服務器可能對我們的證書做了驗證,發現是Charles的證書就不給返回
-
1?? 可以使用xposed框架下的模塊來進行繞過ssl證書驗證。(簡單)
-
2?? 反編譯之后,找到ssl驗證的代碼,使用Frida進行hook函數來繞過驗證。(針對性強)
-
果然繞過驗證之后,服務器返回了數據,Charles也順利抓到包。
2. 分析抓包請求
2.1 搜索接口內容定位請求:
發現只有一個請求內有需要的內容,查看其他數據,發現就是需要的詳情內容。
2.2 多次請求查看參數變化:
查看三次請求,有兩次的id是一樣的,變化的參數為timestamp和sign
-
這個id就是新聞的id
-
這個timestamp不難看出就是一個時間戳
-
同一個新聞id,時間戳不同sign參數也不同,猜測有可能是根據時間戳以及別的一些參數使用md5(根據經驗一看就是md5生成的32位小寫加密)方法生成的簽名。
3. 通過jadx-gui反編譯app定位加密函數
因為本次app沒有進行加固,所以為了節省時間,省去了查殼和脫殼的部分
3.1 點擊搜索按鈕
3.2 直接搜索關鍵字,發現md5方法,跟進去!!
3.3 追蹤加密函數,發現md5就是加密的函數
3.4 發現使用的就是java原本的md5加密方式
現在知道了加密方式,只要使用Frida進行hook md5這個方法,找到加密之前的明文,就可以來進行加密模擬啦~
4. 使用Frida進行hook函數,得到加密前的明文
4.1 找到運行中的包
找到了某新聞:
某些程序的包名不是apk的名字,jadx-gui反編譯之后可以在資源文件中的AndroidManifest.xml中找到包名:
4.2 找到函數的位置
這個類的md5方法
com.dingduan.lib_network.interceptor.CommonParamInterceptorhook的含義:
- 獲取到CommonParamInterceptor這個類
- 這個類的md5方法.implementation的屬性 = 一個函數 這個函數就是md5方法 可以修改參數、打印參數、修改返回值中間做一些處理
hook代碼:
import frida, sysdef on_message(message, data):print("[%s] => %s" % (message, data))# 連接usb設備 包名為找到的包名 session = frida.get_usb_device().attach('xx新聞')jscode_hook = """ Java.perform(// 這個函數里面是具體hook的代碼function(){console.log("1. start hook");let CommonParamInterceptor = Java.use("com.dingduan.lib_network.interceptor.CommonParamInterceptor");CommonParamInterceptor["md5"].implementation = function (text) {// 打印參數console.log('md5 is called' + ', ' + 'text: ' + text);// 重新制作一個參數返回let ret = this.md5(text);console.log('md5 ret value is ' + ret);return ret;};} ) """script = session.create_script(jscode_hook) script.on('message', on_message) script.load() sys.stdin.read()4.3 運行frida的hook代碼,用手機手動調用一次加密函數
調用之后發現md5被調用多次,抓包請求,對比生成的sign發現,下面這個跟我們frida生成的sign一樣,說明就是這次的參數。
5. 使用python復現代碼
5.1 找到參數多次請求之后分析
appCurrentVersion=7.6.0app_id=220525165346815301channelPackage=proid=2379399phoneModel=google PixelplatformPublic=AndroidsystemOS=8.1.0timestamp=1660745510b80a5dfbe4f0637ae3179a06fdb5bd3c'- app_id為固定的
- proid為某個新聞的id
- timestamo為10位時間戳
- 時間戳后邊跟的一個md5是一個固定值
把整個字符串拼起來,使用python進行md5加密,發現和生成的sign一致
5.2 代碼:
import hashlib import timeimport requestsheaders = {'User-Agent': 'okhttp/4.9.1', } my_tk = 'b80a5dfbe4f0637ae3179a06fdb5bd3c' timestamp = str(time.time()).split('.')[0] news_id = '2379310' before_str = f'appCurrentVersion=7.6.0app_id=220525165346815301channelPackage=proid={news_id}phoneModel=google PixelplatformPublic=AndroidsystemOS=8.1.0timestamp={timestamp}{my_tk}'def get_sign(sb1):return hashlib.md5(sb1.encode('utf-8')).hexdigest()sign = get_sign(before_str) print(sign) params = {'id': news_id,'app_id': '220525165346815301','appCurrentVersion': '7.6.0','platformPublic': 'Android','phoneModel': 'google Pixel','systemOS': '8.1.0','timestamp': timestamp,'channelPackage': 'pro','sign': sign, } url = '' response = requests.get(url=url, params=params, headers=headers) print(response.json())🎉🎉🎉
總結
以上是生活随笔為你收集整理的爬虫----记录某新闻详情页app逆向过程(app逆向初学第一次实战)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python99乘法表while翻译_P
- 下一篇: PyQt5案例汇总(简洁版)