• 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.文摘不应该揭示用于生成它的输入的任何信息。

  • 相关阅读:
    [转] linux中 参数命令 -- 和
    ECharts 报表事件联动系列一:刷新页面
    Echarts 简单报表系列三:饼状图
    Echarts 简单报表系列二:折线图
    Echarts 简单报表系列一:柱状图
    Golang 在 Mac、Linux、Windows 下如何交叉编译(转)
    Spring Boot 打war包并利用docBase指定根目录为打包的工程
    JdbcTemplate查询返回JavaBean的几种方法
    Spring JdbcTemplate 查询结果集Map反向生成Java实体(转)
    Spring JdbcTemplate 查询出的Map,是如何产生大小写忽略的Key的?(转)
  • 原文地址:https://www.cnblogs.com/gqv2009/p/14241675.html
Copyright © 2020-2023  润新知