准备环境:
android测试机一台(MI8SE 已root)
brida jar包(后期导入burp进行使用)
frida 客户端(导入手机或者模拟器)
安装apk文件到android手机中(此处仅为学习,不提供apk文件,感兴趣的朋友可以网上自行下载)
第一步:
手机设置代理:
点击应用,使用burp进行任意数据包获取。
查看到参数deviceId,使用android调试工具jadx打开apk文件(此处为非加壳apk,仅为方便学习)
,对参数进行搜索,进行代码追踪。
双击代码即可进行跳转。
查看到形似参数中将deviceId进行传入。
查看到deviceId传入到Map集合中。
最后para集合被传入到postResponseWithParamsInMapAsync方法中。
按住ctrl进行代码跳转,进行再次追踪,查看到传入到方法postResponse中。
再次点击进行代码跳转,查看到构建body的方法。并成功追踪到密钥。
按照ctrl点击加密方法跳转。
查看到加密为AES加密。
至此,代码层分析完毕。接下来就是通过工具利用上述收集信息进行流量加解密。
安装frida
1.通过python安装frida和frida-tools
python -m pip install frida
python -m pip install frida-tools
2.查看安装PC端frida版本,安装对应的客户端frida-sever端到/data/local/tmp(模拟器x86/真机x64)
使用adb push命令将frida文件传入到手机 /data/local/tmp路径中
adb push +frida文件存放路径+ /data/local/tmp
3.进入tmp目录更改frida-sever端权限为777,然后./frida运行
4.adb forward tcp:27043 tcp:27043和adb forward tcp:27042 tcp:27042(使用此命令打开客户端2个端口)
打开burp导入brida jar包进行安装。(此处对于burp安装jar包不在讲解)
接下来对brida进行环境配置,以及文件导入。
brida js文件如下:
'use strict';
// 1 - FRIDA EXPORTS
rpc.exports = {
exportedFunction: function() {
},
//AesEncryptionBase64 encrypt
contextcustom1: function (message) {
console.log("Brida start :0--->" + message);
var data = hexToString(message)
console.log("Brida start :1--->" + data);
var enc;
Java.perform(function () {
try {
var key = "9876543210123456";
var text = data;
//hook class
var AesEncryptionBase64 = Java.use('com.ese.http.encrypt.AesEncryptionBase64');
console.log("Brida start : AesEncryptionBase64 ---> success");
console.log("Brida start : encrypt before--->"+text);
//hook method
enc = AesEncryptionBase64.encrypt(key,text);
console.log("Brida start : encrypt after--->"+enc);
} catch (error) {
console.log("[!]Exception:" + error.message);
}
});
return stringToHex(enc);
},
//AesEncryptionBase64 decrypt
contextcustom2: function (message) {
console.log("Brida start :0--->" + message);
var data = hexToString(message)
console.log("Brida start :1--->" + data);
var text;
Java.perform(function () {
try {
var key = "9876543210123456";
var enc = data;
//hook class
var AesEncryptionBase64 = Java.use('com.ese.http.encrypt.AesEncryptionBase64');
console.log("Brida start : AesEncryptionBase64 ---> success");
console.log("Brida start : decrypt before--->"+enc);
//hook method
text = AesEncryptionBase64.decrypt(key,enc);
console.log("Brida start : decrypt after--->"+text);
} catch (error) {
console.log("[!]Exception:" + error.message);
}
});
console.log("Brida start : decrypt after--->"+stringToHex(text));
return stringToHex(text);
},
//AesEncryptionBase64 encrypt
contextcustom3: function (message) {
console.log("Brida start :0--->" + message);
var data = hexToString(message)
console.log("Brida start :1--->" + data);
var enc;
Java.perform(function () {
try {
var key = "9876543210123456";
var text = data;
//hook class
var AesEncryptionBase64 = Java.use('com.ese.http.encrypt.AesEncryptionBase64');
console.log("Brida start : AesEncryptionBase64 ---> success");
console.log("Brida start : encrypt before--->"+text);
//hook method
enc = AesEncryptionBase64.encrypt(key,text);
console.log("Brida start : encrypt after--->"+enc);
} catch (error) {
console.log("[!]Exception:" + error.message);
}
});
return stringToHex(enc);
},
//AesEncryptionBase64 decrypt
contextcustom4: function (message) {
console.log("Brida start :0--->" + message);
var data = hexToString(message)
console.log("Brida start :1--->" + data);
var text;
Java.perform(function () {
try {
var key = "9876543210123456";
var enc = data;
//hook class
var AesEncryptionBase64 = Java.use('com.ese.http.encrypt.AesEncryptionBase64');
console.log("Brida start : AesEncryptionBase64 ---> success");
console.log("Brida start : decrypt before--->"+enc);
//hook method
text = AesEncryptionBase64.decrypt(key,enc);
console.log("Brida start : decrypt after--->"+text);
} catch (error) {
console.log("[!]Exception:" + error.message);
}
});
console.log("Brida start : decrypt after--->"+stringToHex(text));
return stringToHex(text);
},
getplatform: function () {
if (Java.available) {
return 0;
} else if (ObjC.available) {
return 1;
} else {
return 2;
}
}
}
// Convert a ASCII string to a hex string
function stringToHex(str) {
return str.split("").map(function(c) {
return ("0" + c.charCodeAt(0).toString(16)).slice(-2);
}).join("");
}
// Convert a hex string to a ASCII string
function hexToString(hexStr) {
var hex = hexStr.toString();//force conversion
var str = '';
for (var i = 0; i < hex.length; i += 2)
str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
return str;
}
都为绿色为运行正常。
使用burp即可进行流量加解密。
至此流量加解密已完成。
本文仅为学习练习,方便自己记忆,文章项目中涉及的任何脚本工具,仅用于测试和学习研究,禁止用于商业用途。
禁止模仿,产生的一切问题,均由用户本人负责,作者不承担任何直接责任。