HOOK框架frida的使用

可以首先大致过一下官网的内容,大致知道需要了解的内容,例如:
We advise you to read the source code in frida/core.py and frida/tracer.py to dig deeper into the details.

常用的命令:



session = frida.attach(12345)


JSAPI参考:
JavaScript API - Frida • A world-class dynamic instrumentation framework http://www.frida.re/docs/javascript-api/


Android的安装请参考: http://www.frida.re/docs/android/
安装:
adb push frida-server /data/local/tmp/adb shell "chmod 755 /data/local/tmp/frida-server"

进入shell命令,首先su一下,然后运行frida-server:
/data/local/tmp/frida-server &

检查是否运行成功: frida-ps -Ua
如果成功列举出设备上所有进程列表,则表示运行成功了.

一个牛逼哄哄的例子:

参考示例, 把《厉害了我的蛇贪吃蛇大作战外挂辅助》xposed版本的复制用frida重写一遍,代码如下:

#coding:utf-8

import frida, sys

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

jscode = """
Java.perform(function () {
    var curSnake = null;

    // Function to hook is defined here
    var SnakeFactory = Java.use('com.wepie.snake.module.game.snake.SnakeFactory');

    // Whenever creatSnakeSelf is called
    SnakeFactory.creatSnakeSelf.implementation = function (name, len, multiNode) {
        // Show a message to know that the function got called
        send('creatSnakeSelf');
        len = 50;

        // Call the original creatSnakeSelf
        curSnake = this.creatSnakeSelf(name, len, multiNode);

        // Log to the console that it's done
        console.log('Done: init snake len: ' + JSON.stringify(len) + " name: " + name
            + " my snake: " + curSnake.toString() + ' isSnakeAi: ' + curSnake.isSnakeAi.value);
        return curSnake;

    };

    var CollisionUtil = Java.use('com.wepie.snake.module.game.snake.CollisionUtil');
    CollisionUtil.doSnakeDie.implementation = function (snake1, snake2) {
        // Show a message to know that the function got called
        if (snake1.equals(curSnake) || snake1.isSnakeAi.value == false){
            console.log('snake1 isSnakeAi: ' + snake1.isSnakeAi.value + " snake1: " + snake1.toString());

            // Log to the console that it's done
            console.log('Done: my snake will not die!');
            return;
        }else{
            // Call the original doSnakeDie
            return this.doSnakeDie(snake1, snake2);
        }

    };

});
"""

process = frida.get_usb_device().attach('com.wepie.snake')
script = process.create_script(jscode)
script.on('message', on_message)
print('[*] Running CTF')
script.load()
sys.stdin.read()

总结:对比xposed。
优点:
1、无须重启手机和目标APP,这个可以节省很多时间,如果APP测试的点需要很复杂地搭建好环境,一旦重新启动就意味着很麻烦地再重新搭建环境,例如账号登录,进入特定关卡等。
2、例如JS脚本编写,灵活方便,再也不用担心多参数个数和类型问题了。
3、可以直接使用或修改对象的成员变量,非常方便。
4、配合PC终端命令行使用,脚本编写出错也不会导致APP崩溃,只需修改后重新来过即可,有时会有问题,这个时候需要重启下APP或手机即可。

缺点:
1、JS脚本套在python脚本里面,编写JS脚本时候不是很方便,容易出错,好在即使出错也不会导致APP崩溃掉,修改后重新来过即可。
2、该工具配合PC终端使用,因此适合工程师使用,不利于发布给其他用户使用。而xposed编写的模块,可以让其他用户下载安装使用。
相关文章
相关标签/搜索