frida實戰——hook某app發包參數

1. 抓包分析

拿到一個app,首先先進行數據包的分析前端

此次咱們要分析的是oauth_signature這個值,一眼看上去像是通過了base64處理的,根據後面oauth_signature_method的「提示」,猜想是一個hmac-sha1加密base64對二進制進行編碼的字符串(%3D是=號通過了urlencode編碼以後的產物)java

對於這個加密算法,Python代碼實現以下(py2,若是是py3請注意編碼問題):linux

import hmac
import hashlib
import base64
print (hmac.new(Token,data,hashlib.sha1).digest().encode('base64').rstrip())
複製代碼

從上面可知,咱們須要知道傳入參數data和Token兩個值android

2. JEB分析Java層

把apk扔到JEB去,搜索"oauth_signature",找到ios

從上可知,加密地方應該在libmfw.so中的Java_com_mfw_tnative_AuthorizeHelper_xAuthencode算法

3. IDA分析so層

點開Java_com_mfw_tnative_AuthorizeHelper_xAuthencode函數,很清晰的能夠看到加密的整個流程bash

只要Update下斷就能夠找到加密前的datamarkdown

4. frida hook

這裏選擇用frida hook該函數獲取數值session

爲何要用frida?不少時候若是咱們選擇動態調試函數會遇到各類反調試、崩潰,相比xposed和substrace cydia而言,frida優點是其動態執行不須要重啓,而且android\ios\linux\win\osx平臺通殺app

frida安裝配置參考:https://www.frida.re/

獲取最前端Activity所在進程

import frida
import sys
rdev = frida.get_remote_device()
front_app = rdev.get_frontmost_application()
print (front_app)
複製代碼

獲取全部進程

import frida
import sys
rdev = frida.get_remote_device()
processes = rdev.enumerate_processes()
for processe in processes:
	print (processe)
複製代碼

枚舉進程中加載指定模塊中的導出函數

import frida
import sys
rdev = frida.get_remote_device()
session = rdev.attach("com.mfw.roadbook") # 也可使用attach(pid)的方式
modules = session.enumerate_modules()
for module in modules:
	# print (module)
	if module.name=="libmfw.so":
		export_funcs = module.enumerate_exports()
		for export_func in export_funcs:
			print ("\t%s\t%s"%(export_func.name,hex(export_func.relative_address)))
複製代碼

首先hook java層看看,輸入是什麼

import frida
import sys
rdev = frida.get_remote_device()
session = rdev.attach("com.mfw.roadbook")
scr = """ Java.perform(function(){ var native = Java.use("com.mfw.tnative.AuthorizeHelper"); native.xAuthencode.implementation = function(a,b,c,d,f){ console.log('Params : '+a+' || '+b+' || '+c+' || '+d+' || '+f); } }); """

script = session.create_script(scr)
def on_message(message,data):
	print (message)
script.on("message",on_message)
script.load()
sys.stdin.read()

複製代碼

(這個腳本有點小錯誤,不過不影響參數獲取)

hook一下so裏面update函數

import frida
import sys
rdev = frida.get_remote_device()
session = rdev.attach("com.mfw.roadbook")
scr = """ Interceptor.attach( Module.findExportByName("libmfw.so","_ZN3mfw4Sha18CContext6UpdateEPhjb"),{ onEnter: function(args){ var param = Memory.readUtf8String(args[1]) send("Param : "+param); } } ); """

script = session.create_script(scr)
def on_message(message,data):
	print (message)
script.on("message",on_message)
script.load()
sys.stdin.read()
複製代碼

除了個別參數輸入frida識別錯誤以外,Token跟data已經顯示出來了,先傳入的是Token,而後再到data,data就是xAuthencode傳入的第二個參數,而Token經發現是經過xAuthencode傳入的第四個參數來控制取值的

若是還想hook base64以後輸出的數據,能夠這麼寫

session = rdev.attach("com.mfw.roadbook")
scr = """ Interceptor.attach( Module.findExportByName("libmfw.so","_ZN3mfw6Base6413base64_encodeEPKci"),{ onLeave: function(retval){ send("result : "+Memory.readUtf8String(retval)); } }); """

script = session.create_script(scr)
def on_message(message,data):
	print (message)
script.on("message",on_message)
script.load()
sys.stdin.read()

複製代碼

分析到此爲止,加密算法略

相關文章
相關標籤/搜索