frida基础 so篇(一)

获取process id

Process.id

获取已加载的so

Process.enumerateModules()

获取so的具体信息

js 复制代码
var process_obj_Module_Arr = Process.enumerateModules();
for (let index = 0; index < process_obj_Module_Arr.length; index++) {
    const element = process_obj_Module_Arr[index];

    if(element.path.indexOf("c_project")!=-1){
        console.log(element.name)
        console.log(element.base)
        console.log(element.size)
        console.log(element.path)
    }

}

获取单独一个so内的方法详情

js 复制代码
const hooks = Module.load("/data/app/~~wq4OApPMRngT8iCxA8RE9w==/c_project-F3_SK7jww3YPIqvUgDkEsw==/base.apk!/lib/arm64-v8a/libc_project.so");
var imports = hooks.enumerateImports();
for (let index = 0; index < imports.length; index++) {
    const element = imports[index];
    console.log(element.type)
    console.log(element.name)
    console.log(element.module)
    console.log(element.address)
}

通过方法找到so地址

Module.findExportByName(null,"strstr")

通过so地址找到so信息

Process.findModuleByAddress("0x72c194c030")

找到so的基地址

Module.findBaseAddress("libc_project.so")

根据模块名称和pattern名称找到ida上的地址

找到so地址和pattern地址后,最后可以使用计算的Hex功能,相减,就可以得到ida中方法的地址

js 复制代码
var pattern = "FF C3 01 D1 FD 7B 06 A9";

//找到模块地址
var model = Process.findModuleByName("libc_project.so");

console.log("model address = ",model.base)

//通过scan方法找到pattern匹配的地址
Memory. scan(model.base, model.size,pattern,{
    onMatch:function(address, size){
        console.log("find: address = ",address.toString())
        
        //ida地址
        var result = model.base - address.toString()
    },
    onError:function(reason){
        console.log("fail:",reason)
    },
    onComplete:function(){
        console.log("finish")
    }
})

申请10长度的内存,并打印出来

js 复制代码
//申请内存,长度为10
var r = Memory.alloc(10);

//用hexdump打印
console.log(hexdump(r,{
    offset:0,//偏移
    length:10,//长度
    header:true,//头部
    ansi:true//是否有颜色
}));

申请utf-8的内存

js 复制代码
var r = Memory.allocUtf8String("jevely")
console.log(hexdump(r,{
    offset:0,
    length:10,
    header:true,
    ansi:true
}));

读取utf-8内存

js 复制代码
console.log(Memory.readUtf8String(r));

复制内存

js 复制代码
var r = Memory.allocUtf8String("jevely")

//申请新的内存
var newaddress = Memory.alloc(10)
//复制长度为10的内存
Memory.copy(newaddress,r,10)
//打印
console.log(hexdump(newaddress))

往内存写东西

js 复制代码
//将string转为16进制
var arr = [0x6a, 0x65, 0x76, 0x65, 0x6c, 0x79];
//申请内存
const r = Memory.alloc(arr.length);
//将内容写入内存
Memory.writeByteArray(r,arr);
//打印
console.log(hexdump(r,{
    offset:0,
    length:arr.length,
    header:true,
    ansi:true
}))

读取内存内容

js 复制代码
var result = Memory.readByteArray(r,arr.length)
console.log(result)
相关推荐
虎鲸不是鱼2 小时前
AI 自动化逆向(三十六)先找不加密的部分
人工智能·自动化·大模型·逆向·ai逆向
虎鲸不是鱼4 天前
AI 自动化逆向(三十五)假设空间枚举的完备性是假设出来的
人工智能·自动化·大模型·逆向·ai逆向
虎鲸不是鱼5 天前
AI 自动化逆向(三十三)换一个「驱动器」,覆盖率跳了一个量级
人工智能·自动化·大模型·逆向·ai逆向
虎鲸不是鱼5 天前
AI 自动化逆向(三十四)自建指令缓存:把分钟级查询压到秒级
人工智能·自动化·大模型·逆向·ai逆向
虎鲸不是鱼6 天前
AI 自动化逆向(二十六)「已解出」和「已解析」是两回事
人工智能·自动化·大模型·逆向·ai逆向
虎鲸不是鱼6 天前
AI 自动化逆向(三十一)函数体不可读 ≠ 函数不可命名
人工智能·自动化·大模型·逆向·ai逆向
虎鲸不是鱼6 天前
AI 自动化逆向(二十二)换行比峰值法:让 AI 自己发现图像的宽度
人工智能·自动化·大模型·逆向·ai逆向
虎鲸不是鱼6 天前
AI 自动化逆向(二十九)受保护区间的真实形状是「夹层」
人工智能·自动化·大模型·逆向·ai逆向
虎鲸不是鱼6 天前
AI 自动化逆向(二十五)数据表格式:一个恒等式覆盖 99% 的表
人工智能·自动化·大模型·逆向·ai逆向
虎鲸不是鱼8 天前
AI 自动化逆向(十七)解码器、反汇编器、反编译器:能力边界表
人工智能·自动化·大模型·逆向·ai逆向