python之安卓逆向HOOK系统通用类

1.JAVA 系统类

java.security.MessageDigest

a.入参方法

通过update()方法处理数据

b.返回结果方法

getInstance(String algorithm)返回指定算法的MessageDigest对象

c.完成哈希计算

digest();通过执行诸如填充之类的操作完成哈希计算

2.hook类js方法

function Uint8ArrayToString(fileData){    //Uint8Array转字符串
  var dataString = "";
  for (var i = 0; i < fileData.length; i++) {
    dataString += String.fromCharCode(fileData[i]);
     // console.log(dataString)
  }
  return dataString
}
function byteToHexString(uint8arr) {  //byte数组转16进制字符串
    if (!uint8arr) {
        return '';
    }
    var hexStr = '';
    for (var i = 0; i < uint8arr.length; i++) {
        var hex = (uint8arr[i] & 0xff).toString(16);
        hex = (hex.length === 1) ? '0' + hex : hex;
        hexStr += hex;
    }

    return hexStr.toUpperCase();
}
Java.perform(function () {
    console.log('HOOK Start!!!');
    var MD5Encrypt = Java.use("java.security.MessageDigest");
    console.log(MD5Encrypt);
    // 加密
    MD5Encrypt.update.overload('[B').implementation = function (args1) {
        console.log("MD5Encrypt args1:",args1);
        console.log(Uint8ArrayToString(args1));
        // console.log("MD5Encrypt args2:",args2);
        // console.log("MD5Encrypt args3:",args3);
        // console.log("MD5Encrypt args4:",args4);
        var result = this.update(args1);
        console.log("update", result);
        console.log("MD5Encrypt.encode result==:",result);
        return result;
    };
     MD5Encrypt.digest.overload().implementation = function (args1, args2, args3, args4, args5, args6) {
        var args = this.digest();
        console.log("fan_hui",byteToHexString(args));
        return args
    }
});

2.1直接通过cmd窗口调用

frida -U 包名 -l js

2.2用python调用

import logging
import frida
import sys

def on_message(message, data):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)


with open('hook.js', 'r', encoding='utf-8') as f:  # js文件
    sta = ''.join(f.readlines())

rdev = frida.get_remote_device()

session = rdev.attach("xxxxxx")  #app包名
print(session)
script = session.create_script(sta)
print(script)
def show(message,data):
    print(message)
script.on("message",show)

# 加载脚本
script.load()
sys.stdin.read()

运行结果:

3.MessageDigest类

3.1介绍摘要信息

java 1.6 api介绍:此类为应用程序提供信息摘要功能,如:MD5/SHA等.信息摘要是简单的单向哈希函数,它接收任意长度的数据,并返回固定长度的哈希值

3.2获得对象

一般通过getInstance("算法名称")方法获得

3.3常用方法

通过update()方法处理数据,任何时候都可以通过reset()方法重置摘要,一旦所有更新数据都更新完了,应该调用digest()方法完成哈希计算,对于定量的数据计算,digest()方法只能被调用一次,MessageDigest对象恢复到初始状态

3.4其他方法

clone();如果实现是可复制的,则返回一个副本
digest();通过执行诸如填充之类的操作完成哈希计算
digest(byte[] input)通过指定的数组完成最后更新操作,并计算哈希
digest(byte[] buf, int offset, int len)通过指定数组,并指定开始位置(偏移量),和数字长度,来进行最后更新,并计算哈希
getAlgorithm();返回指定的算法名称
getDigestLength()返回以字节为单位的摘要长度,如果实现不支持,则返回0
getInstance(String algorithm)返回指定算法的MessageDigest对象
getInstance(String algorithm, Provider provider)通过指定算法提供者和算法名称返回MessageDigest对象
getInstance(String algorithm, String provider)通过指定算法提供者和算法名称返回MessageDigest对象
getProvider();返回此信息摘要对象的提供者
isEquals();比较两个信息摘要对象的相等性
reset();重置摘要以供再次使用
toString();返回此信息摘要对象的字符串表示形式
update(byte input);通过指定的字节更新摘要
update(byte[] input)通过指定字节数组更新摘要
update(byte[] input, int offset, int len)通过指定字节数组从指定偏移量开始更新摘要
update(ByteBuffer input)通过指定ByteBuffer更新摘要

3.5支持的算法

MD2
MD5
SHA-1
SHA-256
SHA-384
SHA-512

特征:
1.在计算上,查找两个哈希值为相同值的消息是不可行的。
2.文摘不应该揭示用于生成它的输入的任何信息。

原文地址:https://www.cnblogs.com/gqv2009/p/14241675.html