技术标签: android-studio android android studio
准备环境:
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即可进行流量加解密。
至此流量加解密已完成。
本文仅为学习练习,方便自己记忆,文章项目中涉及的任何脚本工具,仅用于测试和学习研究,禁止用于商业用途。
禁止模仿,产生的一切问题,均由用户本人负责,作者不承担任何直接责任。
问题描述 为了增加公司收入,F公司新开设了物流业务。由于F公司在业界的良好口碑,物流业务一开通即受到了消费者的欢迎,物流业务马上遍及了城市的每条街道。然而,F公司现在只安排了小明一个人负责所有街道的服务。 任务虽然繁重,但是小明有足够的信心,他拿到了城市的地图,准备研究最好的方案。城市中有n个交叉路口,m条街道连接在这些交叉路口之间,每条街道的首尾都正好连接着一个交叉路口。除开街道
bootstrap日期插件,需要下载相应的bootstrap的css文件以及js文件。本例子使用了bootstrap样式,这样更好看 。日期插件必要的四个引入:<!-- 时间空间样式表 --><link rel="stylesheet" href="bootstrap-datetimepicker/css/bootstrap-datetimepicker.css">...
代码:<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title></head><body> </b_微信聊天时间显示规则
什么是CAP原则?_cap原则
//搜索内容设置>>>>>>>>>>>>>>>>>>>>>> //索引"student_manage"是索引"student"、"class&qu
1.我用的163的镜像源,清理过缓存,重新生成,依然报错:解决办法执行:yum --enablerepo=extras clean metadata之后yum安装k8s成功。_kubernetes-master-1.5.2-0.7.git269f928.el7.x86_64: [errno 256] no more mirro
3月23日,山东省政府发布《关于山东省数字基础设施建设的指导意见》。提出,要高质量建设5G网络,全面推进各市5G网络试点和规模组网,推动5G与重点垂直行..._5g通信建设资金保障
据《大众科学》14日报道, 美国著名的《大众科学》杂志评出了世界上前十位“科学才子”这是由数百位受人尊敬的科学家、大学系主任和科学杂志编辑经过6个月的精心筛选评出来的。 大众科学》杂志解释说,所谓“才气”的意思不是聪明,或者说至少不仅仅意味着聪明。说一个人有才气,就是说他有敏锐的洞察力、伟大的创造力和坚韧的毅力,有敢于避开现有知识以便形成自己独到见解的信心。这些“科学才子”也许在一领
冯·诺依曼型计算机的主要设计思想是存储程序和程序控制。存储程序是指将指令以二进制代码的形式事先输入计算机的主存储器(按其在存储器中的首地址执行程序的第一条指令);程序控制是指控制器顺序执行存储的程序。冯·诺依曼型计算机主要组成成分包括:运算器(以运算器为中心)、存储器、控制器、输入设备、输出设备。_什么是存储容量,什么是单元地址,什么是数据字,什么是指令字?
excel小操作ctrl+H:查找和替换ctrl+G:定位ctrl+enter:批量填充alt+=:求和数据-分列:分开内容/也可以改格式合并:&格式:text(目标位置,“yyyy/mm/dd aaaa”)日期ctrl+1:自定义单元格格式ctrl+-:删除每行加空格:123123升序排列去重复:数据-删除重复项制作下拉框:_dir d:\xxx\*.* /s
函数原型:int pthread_create(pthread_t *tid, const pthread_attr_t *tattr, void*(*start_routine)(void *), void *arg);功能:创建一个新的线程,并将线程加入当前进程头文件:#include <pthread.h>pthread非linux系统的默认库,需手动链接-线程库 -lpthre...
项目二:用两种不同的方法爬取股票数据方法二:scrapy爬虫框架此案例是运用scrapy框架对相关内容进行抓取。安装scrapy框架打开cmd,输入以下代码进行安装:pip install scrapy验证是否安装成功:scrapy -h创建一个新的Scrapy爬虫工程scrapy安装成功后,继续在cmd里输入代码创建工程。将目录切换到想要创建爬虫项目的路径下,执行:scrapy startproject baidustocks执行完毕后,会在目录下生成一系列文件夹和.py等文_https://hq.gucheng.com/gpdmylb.html