第一次進行android逆向的過程記錄

前言

要逆向的是一款叫shengqian快報的app,具體要分析sign簽名的加密過程。

環境配置及工具

系統:macOS 10.14.1 

模擬器:mac版夜神模擬器 3.0.3.0

抓包工具:Charles

逆向工具:apk-tool、JD-GUI、frida、adb、dex2jar、objection

準備工作

從網上下載shengqian快報的apk保存到電腦上,打開夜神模擬器,將apk拖到夜神模擬器裏面安裝。

抓包分析

使用Charles對夜神模擬器進行抓包。(需要在夜神模擬器上安裝好Charles的證書然後配置好代理)

打開shengqian快報app,對需要分析的頁面進行抓包。

分析抓到的包,發現目標接口:

返回的json就是需要的數據:

ok。到這裏目標接口就找到了,接下來要對這個接口進行分析。

分析發現這個接口接收一個post請求,包含了30多個參數,其中最重要的就是我們要分析的sign參數了。

我們可以先嚐試用postman或者python腳本向這個接口發送一個post請求試試,結果返回的是{"status_code":-1,"message":"invalid sign"},可以證明在服務器端進行了sign的校驗,所以我們想要得到這個接口的數據就需要將sign加密過程找到然後僞造一個合法的post請求。

逆向分析

用apktool反編譯apk文件爲smali

apktool d jz_dsp_ydcx_zcw17.apk

將反編譯後的文件夾後綴名修改爲zip,然後進行解壓,解壓後的文件夾裏含有classes.dex的文件。最後使用dex2jar工具將classes.dex文件轉換爲classes-dex2jar.jar文件。

用JD-GUI打開最後的jar文件,發現代碼是經過混淆的。

點開左上角的手電筒全局搜索sign,

發現一處比較可疑的地方,這個e函數猜測應該就是用parama來加密,

接下來進入e方法,可以確定這就是加密的方法了。stringBuilder創建了一個用&連接所有參數的字符串,最後又添加了一個32位的字符串,通過b.a()方法來加密。

接下來進入b類查看,可以看出來這就是md5加密,

確認完加密算法,就需要分析parama裏面都是什麼了。

打開夜神模擬器,adb shell進入命令行(模擬器的root啓動要開啓),運行frida-server。

模擬器裏打開shengqian快報app,新開一個命令行輸入下面命令查看進程,

frida-ps -U

找到對應進程就可以開始hook了。

輸入下面命令進入objection,

objection -g com.****.coupon explore

watch一下e方法看看返回值、調用棧和傳入參數的內容都是啥。

android hooking watch class_method com.****.coupon.httptask.a.a.e --dump-args --dump-backtrace --dump-return

點擊進入詳情頁後,發現e方法被調用了很多次,返回值其實就是加密後生成的sign(調用棧就不截圖了)

同時在Charles的抓到的目標接口中,發現sign和hook到的返回值一樣。

因此可以確認接口的sign是通過e這裏生成的了。

接下來就要去分析傳入e的parama是什麼了。

讀一下e方法裏面的代碼,可以看出來parama.k()可以獲得一個List類型的對象,然後遍歷這個對象並且生成一個url參數格式的字符串(name1=value1&name2=value2……)

知道了這些就可以寫一個簡單的hook腳本來打印一下parama裏面的內容了。

python腳本:

import sys
import frida

PACKAGE = 'com.****.coupon'


def hook():
	jscode = open('script.js', 'r').read()
	# 查找USB設備並附加到目標進程
	session = frida.get_usb_device().attach(PACKAGE)
	# 在目標進程裏創建腳本
	script = session.create_script(jscode)
	print('[*] Start attach')
	# 加載創建好的javascript腳本
	script.load()
	# 讀取系統輸入
	sys.stdin.read()


if __name__ == '__main__':
	hook()

script.js:

function hook(){
    Java.perform(function(){
        var a = Java.use("com.****.coupon.httptask.a.a");
        a.e.implementation = function(parama){
            var result = this.e(parama);
            var l = parama.k().size();
            console.log("len:",l,"len:",l);
            // 隨便打印幾個參數
            console.log("parama1",parama.k().get(1));
            console.log("parama31",parama.k().get(31));
            console.log("parama34",parama.k().get(34));
            return result;
        }
    });
};

setImmediate(function(){
    setTimeout(hook, 2000);
});

hook好之後,發現加密的這些參數其實就是post裏面提交的參數,到這裏sign分析就結束了。

我們要實現sign加密算法的話,就保留關鍵的參數,然後將這些鍵值進行拼接,字符串的末尾要拼接"81f454ac98956541b195f2c7f9e53a06",最後再對字符串進行一次MD5就可以了。

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