美文网首页
frida简单实用脚本的使用

frida简单实用脚本的使用

作者: 萌木盖 | 来源:发表于2019-09-25 14:44 被阅读0次

    在公众号[跟小雅一起学逆向]看到的 具体怎么用还不知道,先保存上以后再看
    下面是python脚本,然后根据需求该js代码就可

    import frida, sys
    
    def on_message(message, data):
        if message['type'] == 'send':
            print("[*] {0}".format(message['payload']))
        else:
            print(message)
    
    jscode = """
        Java.perform(function () {
        // Function to hook is defined here
        var http = Java.use('com.cmstop.ctmediacloud.util.SignUtil');
        http.getSignStr.implementation = function (a1,a2,a3) {
                send("start");
                send("参数1:"+a1);
                send("参数2:"+a2);
                send("参数3:"+a3);
                var result = this.getSignStr(a1,a2,a3)
                send("结果:"+result);
                send("end");
                return result;
            };
        });
    """
    
    process = frida.get_usb_device().attach('com.baotounews.api.m')
    script = process.create_script(jscode)
    script.on('message', on_message)
    print('[*] Running CTF')
    script.load()
    sys.stdin.read()
    

    js代码

    • Android中使用StringBuffer,
      StringBuilder这两个类操作字符串,Hook其toString方法并打印堆栈,在很多情况下可以定位到加密字段的生成堆栈。
    console.log("加载脚本成功!");
    Java.perform(function x() {
        //定位StringBuilder,StringBuffer类
        const stringbuilder = Java.use("java.lang.StringBuilder");
        const stringbuffer = Java.use("java.lang.StringBuffer");
    
        //定位方法
        const toString = "toString";
    
    
        // 使用log类和Exception类产生堆栈
        var jAndroidLog = Java.use("android.util.Log");
        var jException = Java.use("java.lang.Exception");
    
        stringbuilder[toString].implementation = function(){
            //执行原逻辑
            const result = this[toString]();
            // 打印返回的字符串内容
            console.log(result);
    
            // 只有长度大于30时,才打印堆栈
            if (result.length > 30) {
                // 抛出异常。打印堆栈
                console.log(jAndroidLog.getStackTraceString(jException.$new()));
            }
    
            //return出去
            return result;
        };
    
        stringbuffer[toString].implementation = function() {
            //执行原逻辑
            const result = this[toString]();
            // 打印返回的字符串内容
            console.log(result);
            // 只有长度大于30时,才打印堆栈
            if (result.length > 30) {
                // 抛出异常。打印堆栈
                console.log(jAndroidLog.getStackTraceString(jException.$new()));
            }
            //return出去
            return result;
        }
    
    });
    
    • Hook 用于字符串比较的方法,同样可以得到大量信息,需要注意的是,代码没有做优化,应该加上堆栈调用+输出筛选,否则遇到较大的应用会崩溃。
    console.log("加载脚本成功!");
    Java.perform(function x() {
        //定位类
        const str = Java.use('java.lang.String');
        const objectClass = 'java.lang.Object';
        console.log("已经定位到目标类");//定位类成功!
        // 在这里更改类的方法的实现(implementation)
        str.equals.overload(objectClass).implementation = function(obj) {
            //打印传入的参数
            var response = str.equals.overload(objectClass).call(this, obj);
            console.log(str.toString.call(this) + ' == ' + obj.toString() + ' ? ' + response);
    
    
            //return出去
            return response;
        }
    
    });
    
    • 加密算法中,明文调用getBytes方法转换为字节数组,Hook并打印堆栈可以快速定位
    console.log("加载脚本成功!");
    Java.perform(function x() {
        //定位类
        const str = Java.use('java.lang.String');
    
        console.log("已经定位到目标类");//定位类成功!
        // 在这里更改类的方法的实现(implementation)
        str.getBytes.overload().implementation = function() {
    
            var response = this["getBytes"]();
            console.log(this.toString());
            //return出去
            return response;
        }
    
    });
    

    相关文章

      网友评论

          本文标题:frida简单实用脚本的使用

          本文链接:https://www.haomeiwen.com/subject/msziuctx.html