技术标签: 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即可进行流量加解密。
至此流量加解密已完成。
本文仅为学习练习,方便自己记忆,文章项目中涉及的任何脚本工具,仅用于测试和学习研究,禁止用于商业用途。
禁止模仿,产生的一切问题,均由用户本人负责,作者不承担任何直接责任。
Unity竖排文本实现_unity text 竖排
【题意简述】:本题题意很好理解!题目给出的Hint,使我们对关键点有了更加清晰的认识An upper case letter goes before the corresponding lower case letter.So the right order of letters is 'A'就是给一个序列(序列可以有重复的元素),让我们输出它的所有排列,字母顺序规定给出!【分析】
一、问题描述:第一个tab页和第二个tab中布局相同,左右布局,即west 和center ,页面初始化时,自动展示第一个tab页,布局正常如图一所示,但切换第二个tab页时发现west部分没有撑起设定的width,而是缩到左侧,见图二。图一:(tab1)图二:(显示混乱的tab2)二、解决办法:添加tab 页切换监听,当切换时,自动刷新布局,代码如下:$(f...
又几天没刷题了,看机器学习基础了。手生了,罪过罪过。最近需要刷一下动态规划,感觉很久没刷了,需要补补了。好了,经典的背包问题,上题:416. 分割等和子集给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。注意:每个数组中的元素不会超过 100数组的大小不会超过 200示例 1:输入: [1, 5, 11, 5]输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11]. 示例 2:输入: [1, 2, 3, 5]
Paging是一个用于分页加载的组件,对于一些列表数据,以前大家都使用过的一种方式是定义一个page,当达到加载更多条件时,page加一再去请求数据,为此我们要写很多重复的代码,Paging就对分页进行了一个封装Paging由分为三个模块1.DataSource:数据从该模块中获取,数据可以来源于网络、本地数据库等2.PagedList:负责具体获取数据的逻辑,何时获取、加载下一页、预加载等..._paging2
文章目录https://blog.csdn.net/wa0jixu/article/details/104473297?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158772458019725247636838%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%2..._threadx
就算你将遗忘一切,我也会永远记得。
Hillary and Tenzing are famous around the world for being the first people to climb Mount Everest in 1953. But few people have heard about the discussion they had half way up the mountain. "You se
在本教程中,我们将编写一个程序,该程序将列表中具有与第二个元素相同的元素的所有元组分组。让我们看一个例子来清楚地理解它。输入值[('Python','nhooos'),('Management','other'),('Django','nhooos'),('React','nhooos'),('Social','other'),('Business','other')]输出结果..._tuples.append(tup)
一 Tuxedo 是什么? Tuxedo是BEA公司(现已被Oracle公司收购)的一个客户机/服务器的“中间件”产品,它在客户机和服务器之间进行调节,以保证正确地处理事务。它用C语言技术开发的并且有很高性能。 TUXEDO是在、Internet 这样的分布式运算环境中开发和管理三层结构的客户/服务器型关键任务应用系统的强有力工具。它具备分布式事务处理和应用通信功能,并提供完善的各种服...
A. Omkar and Password题目大意:每次可以选择两个不相等的两个数拿出来,变为两数之和,再放回去问最后少的长度是多少?题目思路:还被这个题卡了2min..一开始想区间dp ,后来发现离谱.重读题才发现合并两个不相等的那么只要序列不是全部相等,永远可以合并到1Code:/*** keep hungry and calm CoolGuang!***/#pragma GCC optimize(3)#include <bits/stdc++.h&g
1.火狐浏览器 Tool->Downloads 打开下载的deb包目录2.在deb目录右键,打开终端3.输入sudo dpkg -i,之后将deb包拖入终端4.回车,输入密码,完毕u_ubuntu18.04 deb