frida实战——hook某app发包参数

13,699 阅读2分钟

1. 抓包分析

拿到一个app,首先先进行数据包的分析

这次我们要分析的是oauth_signature这个值,一眼看上去像是经过了base64处理的,根据后面oauth_signature_method的“提示”,猜测是一个hmac-sha1加密base64对二进制进行编码的字符串(%3D是=号经过了urlencode编码之后的产物)

对于这个加密算法,Python代码实现如下(py2,如果是py3请注意编码问题):

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

从上面可知,我们需要知道传入参数data和Token两个值

2. JEB分析Java层

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

从上可知,加密地方应该在libmfw.so中的Java_com_mfw_tnative_AuthorizeHelper_xAuthencode

3. IDA分析so层

点开Java_com_mfw_tnative_AuthorizeHelper_xAuthencode函数,很清晰的可以看到加密的整个流程

只要Update下断就可以找到加密前的data

4. frida hook

这里选择用frida hook该函数获取数值

为什么要用frida?很多时候如果我们选择动态调试函数会遇到各种反调试、崩溃,相比xposed和substrace cydia而言,frida优势是其动态执行不需要重启,并且android\ios\linux\win\osx平台通杀

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()

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