当前位置: 首页 > news >正文

18.安卓逆向-frida基础-调试实战2

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

内容参考于:图灵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;
}

img


http://www.mrgr.cn/news/42673.html

相关文章:

  • 多线程-初阶(1)
  • 利用Python输入n个用空格分隔的整数 ← list(map(int,input().split()))
  • ROS2(Robot Operating System 2)与树莓派(Raspberry Pi)
  • 基于拥堵模型的轻量级平台公交室内情况监控系统
  • Redis数据库与GO(二):list,set
  • C++教程一口气讲完!(万字讲解)♪(´▽`)上
  • 【Linux】进程地址空间、环境变量:从理论到实践(三)
  • 【Linux】-----进程第二弹(优先级,环境变量)
  • HAR笔记--事件相机(event camera)数据常见处理方法总结
  • 开源AI智能名片在打造人格化品牌平台中的应用:以抖音、快手、微博为例
  • csp-j模拟三补题报告
  • YouTube音视频合并批处理基于 FFmpeg的
  • 《Linux服务与安全管理》| 配置YUM源并验证
  • linux驱动:(21)ioctl接口(二)驱动与应用程序传递ioctl命令
  • 90后新生代女高音歌唱家李思思声乐大师课公益讲座即将开启
  • PyTorch实现卷积神经网络CNN
  • 生产消费者模式
  • 自动驾驶系列—颠覆未来驾驶:深入解析自动驾驶线控转向系统技术
  • 无IDEA不Java:快速掌握Java集成开发环境
  • 什么是 NVIDIA 机密计算?( 上篇 )