拿到一个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
把apk扔到JEB去,搜索"oauth_signature",找到ios
从上可知,加密地方应该在libmfw.so中的Java_com_mfw_tnative_AuthorizeHelper_xAuthencode算法
点开Java_com_mfw_tnative_AuthorizeHelper_xAuthencode函数,很清晰的能够看到加密的整个流程bash
只要Update下断就能够找到加密前的datamarkdown
这里选择用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() 复制代码
分析到此为止,加密算法略