您的位置:

详解frida教程

一、frida教程文档

frida教程文档是学习frida框架的重要指南,提供了丰富的例子和详细的解释。在学习frida框架之前,我们需要学会如何查阅文档。

首先需要了解frida文档的结构。frida文档的主要部分分为两个部分:API参考和教程。在API参考中,我们可以查阅frida的API和模块以及对应的方法。在教程中,我们可以学习frida的一些使用技巧和应用示例。

例如,我们需要查找frida的spawn函数的使用说明。首先进入frida官网的文档页面 https://frida.re/docs/home/ ,在左侧导航栏选择API Reference,然后选择frida.core模块,在该模块中我们就可以找到spawn函数,并获取使用说明。


import frida

def on_message(message, data):
    print("[*] message:", message)

pid = frida.spawn("com.example.app")
session = frida.attach(pid)
script = session.create_script("console.log('hello world')")
script.on('message', on_message)
script.load()

# 这里需要利用frida的js函数OnLeave截获spawn的返回值
p = session.create_script("""
Interceptor.attach(Module.findExportByName(null, "spawn"), {
  onLeave: function(retval) {
    console.log("spawn retval: " + retval)
  }
})
""")
p.load()
frida.resume(pid)

二、frida js教程

在使用frida开发的过程中,我们最常使用的是JavaScript语言。在frida中,我们可以使用JavaScript语言直接进行代码注入。因此,学习frida框架必须掌握JavaScript语言的基础知识,同时可以深入学习JavaScript语言的高级特性。

例如,我们可以通过JavaScript来完成动态Hook。在Hooking中,我们可以通过JavaScript函数来代替原有函数被调用,从而实现动态替换的目的。


function hook_native_function() {
    const libaddress = Module.findBaseAddress("libnative-lib.so");
    Interceptor.attach(Module.findExportByName("libnative-lib.so", "_Z11testMethodv"), {
        onEnter: function (args) {
            console.log("Entered " + libaddress);

            // 原native函数
            console.log("Original function arguments: " + args[0] + "," + args[1] + "," + args[2]);

            // 修改native函数的参数
            args[0] = ptr("0x123456");
            args[1] = ptr("0x7890AB");
            args[2] = ptr("0xCDEF12");

            console.log("args[0]: ", args[0], args[0].readCString());
            console.log("args[1]: ", args[1], args[1].readCString());
            console.log("args[2]: ", args[2], args[2].readCString());
        },
        onLeave: function (retval) {
            console.log("Returning" + retval);
        }
    });
}

三、frida教程 百度网盘

Google Drive 是美国 Google 公司推出的一项云存储服务,所有设备用户都可以获得15GB的免费存储空间,可以进行文件备份、同步和分享等操作。

对于学习frida框架开发的课程教学,我们可以在百度网盘中找到对应的视频课程,加快我们学习的效率。

例如,《frida框架编程》视频课程,介绍了使用frida框架进行动态调试的操作技巧、frida命令行的操作使用以及frida框架的实际案例分析,涵盖了frida框架的基础教学和应用实用内容。


链接:https://pan.baidu.com/s/1bG3DlYOydTOy8EHfF8mKwA 
提取码:rpg8 
复制这段内容后打开百度网盘手机App,操作更方便哦

四、frida框架教程

在frida框架教程的内容中,我们主要学习frida框架的基础原理和使用,以及对frida检测的一些方法、技巧。

例如,我们可以通过frida框架来实现脱壳操作。在Android手机中使用的apk文件是经过加密处理的,无法直接反编译或保存,但我们可以通过使用frida框架进行动态调试,获取apk解密后的文件,从而进行反编译。


$ frida -U -f com.example.app --no-pause -l dump_memory.js

然后新建一个dump_memory.js文件,输入如下代码:


var startdump = false;
var enddump = false;
var offset = 0;
var filename = "/data/data/com.example.app/dump_data.bin";
var fd = new File(filename,"wb+");
console.log("Dump Data Start……\n");
Interceptor.attach(Module.findExportByName(null,"madvise"),{
    onEnter: function(args){
        if(startdump){
            var addr = parseInt(ptr(args[0]));
            var size = parseInt(ptr(args[1]));
            if(offset==0){
                console.log("Virtual Address: "+addr.toString(16));
            }
            offset += size;
        }
    },
    onLeave: function(retval){

    }
});
Interceptor.attach(Module.findExportByName(null,"syscall"),{
    onEnter: function(args){
        if(startdump){
            var R0 = parseInt(ptr(args[0]));
            if(R0 == 4){
                var fd = parseInt(ptr(args[1]));
                var bufferptr = parseInt(ptr(args[2]));
                var bytecount = parseInt(ptr(args[3]));
                var data = Memory.readByteArray(bufferptr,bytecount);
                send({
                    "type": 1, 
                    "data": [fd,data,bytecount]
                });
            }
        }
    },
    onLeave: function(retval){

    }
});
Java.perform(function(){
    // android.os.MemoryFile
    var MemoryFile = Java.use("android.os.MemoryFile");
    MemoryFile.write.overload('java.io.FileDescriptor','long','int','android.os.Handler','android.os.ParcelFileDescriptor','int').implementation=function(a,b,c,d,e,f){
        console.log("MemoryFile write stub: ["+b+"] ["+c+"] ["+f+"] "+Memory.readUtf8String(e.value.getBytes()));
        send({
            "type": 2, 
            "data": [b,c,f]
        });
        return 0;
    };
    var sys = Java.use("java.lang.System");
    sys.exit.implementation=function(){
        if(enddump){
            console.log("Dump Data End......\n");
        }
        return this.exit.apply(this,arguments);
    }
});
rpc.exports = {
    start: function(){
        startdump = true;
    },
    end: function(){
        enddump = true;
        fd.flush();
        fd.close();
    },
    write: function(fd, data, bytecount){
        var buf = Memory.alloc(bytecount);
        buf.writeByteArray(data);
        fd = new UnixFileDescriptor(fd);
        var r = IO.write(fd, buf, bytecount);
        return r;
    },
    read: function(fd, buffer, offset, byteCount){
        console.log("read dump......");
        fd = new UnixFileDescriptor(fd);
        var r = IO.read(fd, buffer, offset, byteCount);
        return r;
    }
};

五、frida安装

如要成功使用frida框架进行开发,必须首先安装frida环境。在安装frida之前,需要选择对应的frida版本和操作系统。

例如,在Ubuntu 18.04上安装frida,需要按照以下步骤进行:


# 添加frida ppa源
$ sudo add-apt-repository ppa:frida/stable

# 更新源
$ sudo apt-get update

# 安装frida 
$ sudo apt install frida-tools

# 检查frida安装状态
$ frida --version

六、friedmann方程

在学习frida框架开发之外,我们也可以结合物理学知识,学习Friedmann方程。Friedmann方程是从广义相对论出发,描述宇宙演化的一个基础方程。它描述了宇宙的空间和时间的演化,以及宇宙内各种物质的分布变化。Friedmann方程是宇宙学研究的基础和核心内容,对于了解宇宙和科学的本质有着重要意义。

但是需要注意的是,Friedmann方程与frida框架开发没有直接关系。我们应当理性看待、合理应用各种知识。

Friedmann方程的公式如下:


H^2 = (8piG / 3) * rho - k / a^2 + Lambda / 3
a' / a = H