免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
内容参考于:图灵Python学院
本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。
工具下载:
链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3
提取码:6tw3
复制这段内容后打开百度网盘手机App,操作更方便哦
上一个内容:17.安卓逆向-frida基础-调试实战1(有 spawn 模式实例)
上一个内容里hook了一些常用的东西,本次接着上一个内容继续
HOOK 算法自吐,可以把加密的信息全部打印出来,相当于一个往外吐的动作,吐出来之后就可以根据明文进行参数的查找了,可以解决百分之60的问题,不管app加不加壳都可以用,app加壳不影响HOOK(加壳只影响看源码的时候,不看源码加壳有没有无所谓)
hook md5
md5算法实现
package com.example.course1.suanfa; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5 { public static String md5_1(String input) throws NoSuchAlgorithmException { // 获取MD5算法实例,hook这个getInstance方法可以得到算法名字 MessageDigest md5 = MessageDigest.getInstance("MD5"); // 把要被加密的数据放到MD5缓存中 md5.update((input+"xialuo").getBytes()); // 加密并获取密文 byte[] digest = md5.digest(); // 密文拼接成 StringBuilder 类型 StringBuilder stringBuilder = new StringBuilder(); for (byte b : digest){ stringBuilder.append(b); } return stringBuilder.toString(); } public static String md5_2(String input) throws NoSuchAlgorithmException { // 获取MD5算法实例,hook这个getInstance方法可以得到算法名字 MessageDigest md5 = MessageDigest.getInstance("MD5"); // 把要被加密的数据放到MD5缓存中 md5.update((input+"xialuo").getBytes(StandardCharsets.UTF_8)); // 加密并获取密文 byte[] digest = md5.digest(); // 密文拼接成 StringBuilder 类型 StringBuilder stringBuilder = new StringBuilder(); for (byte b : digest){ // 转成十六进制 String hex = Integer.toHexString(b & 0xFF); if(hex.length() == 1){ stringBuilder.append('0'); } stringBuilder.append(hex); } return stringBuilder.toString(); } }
hook MD5脚本
Frida HOOK脚本代码
function main() { Java.perform(function () { // 有些app没有 ByteString,如果没有需要我们自己用Python或js写转换,这个百度一搜一大堆 var ByteString = Java.use("com.android.okhttp.okio.ByteString") var MessageDigest = Java.use('java.security.MessageDigest') function toUtf8(data){ return ByteString.of(data).utf8(); } MessageDigest.getInstance.overload('java.lang.String').implementation = function (str) { console.log('算法名:',str) return this.getInstance(str) } MessageDigest.update.overload('byte').implementation=function (str) { console.log(`byte算法入参:${str}`) return this.update(str) } MessageDigest.update.overload('java.nio.ByteBuffer').implementation=function (str) { console.log(`java.nio.ByteBuffer算法入参:${str}`) return this.update(str) } MessageDigest.update.overload('[B').implementation=function (str) { // [B是字节需要转成字符串我们人才认识,toUtf8方法可以把字节转换文字(文字指的是字母、数字、中文、英文) console.log(`[B算法入参:${toUtf8(str)}`) return this.update(str) } MessageDigest.update.overload('[B', 'int', 'int').implementation=function (str) { console.log(`'[B', 'int', 'int算法入参:${str}`) return this.update(str) } }) } main()
字符转字符串的js代码:上方toUtf8可以改成调用下方的bytesToString函数
function bytesToString(arr) {
if (typeof arr === 'string') {
return arr;
}
var str = '',
_arr = arr;
for (var i = 0; i < _arr.length; i++) {
var one = _arr[i].toString(2),
v = one.match(/^1+?(?=0)/);
if (v && one.length == 8) {
var bytesLength = v[0].length;
var store = _arr[i].toString(2).slice(7 - bytesLength);
for (var st = 1; st < bytesLength; st++) {
store += _arr[st + i].toString(2).slice(2);
}
str += String.fromCharCode(parseInt(store, 2));
i += bytesLength - 1;
} else {
str += String.fromCharCode(_arr[i]);
}
}
return str;
}
字符转Base64的js代码:
function bytesToBase64(e) {
var base64EncodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
var r, a, c, h, o, t;
for (c = e.length, a = 0, r = ''; a < c;) {
if (h = 255 & e[a++], a == c) {
r += base64EncodeChars.charAt(h >> 2),
r += base64EncodeChars.charAt((3 & h) << 4),
r += '==';
break
}
if (o = e[a++], a == c) {
r += base64EncodeChars.charAt(h >> 2),
r += base64EncodeChars.charAt((3 & h) << 4 | (240 & o) >> 4),
r += base64EncodeChars.charAt((15 & o) << 2),
r += '=';
break
}
t = e[a++],
r += base64EncodeChars.charAt(h >> 2),
r += base64EncodeChars.charAt((3 & h) << 4 | (240 & o) >> 4),
r += base64EncodeChars.charAt((15 & o) << 2 | (192 & t) >> 6),
r += base64EncodeChars.charAt(63 & t)
}
return r
}
字符转十六进制的js代码:
function bytesToHex(arr) {
var str = "";
for (var i = 0; i < arr.length; i++) {
var tmp = arr[i];
if (tmp < 0) {
tmp = (255 + tmp + 1).toString(16);
} else {
tmp = tmp.toString(16);
}
if (tmp.length == 1) {
tmp = "0" + tmp;
}
str += tmp;
}
return str;
}