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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值