FRIDA 拦截 HermesRuntimeImpl::call 时出现访问冲突错误

问题描述 投票:0回答:1

我目前正在使用 Frida 拦截对 React Native Android 应用程序中的 HermesRuntimeImpl::call 的调用。我的目标是提取传递给该函数的参数并执行其他操作。但是,我在尝试在拦截内调用函数 (valueToString) 时遇到访问冲突错误。



let libhermesBaseAddress = Module.findBaseAddress("libhermes.so");
let hermesRuntimeImplCallAddress = libhermesBaseAddress.add(0x1f3931 - 0x00100000);
let runtimePtr = Module.findExportByName("libhermes.so", "_ZN8facebook6hermes17makeHermesRuntimeERKN6hermes2vm13RuntimeConfigE");
let valueToStringAddr = Module.findExportByName("libjsi.so", "_ZNK8facebook3jsi5Value8toStringERNS0_7RuntimeE");

Interceptor.attach(hermesRuntimeImplCallAddress, {
    onEnter: function (args) {
        console.log("HermesRuntimeImpl::call intercepted");

        // Extracting arguments
        let func = args[1]; // jsi::Function
        let jsThis = args[2]; // jsi::Value
        let jsArgs = args[3]; // jsi::Value
        let count = args[4]; // size_t count
        
        // Logging arguments
        console.log(`Function: ${func}`);
        console.log(`jsThis: ${jsThis}`);
        console.log(`jsArgs: ${jsArgs}`);
        console.log(`Count: ${count}`);
        console.log(`runtimePtr: ${runtimePtr}`);
        console.log(`valueToStringAddr: ${valueToStringAddr}`);

        // Get the valueToString function address
        let valueToString = new NativeFunction(valueToStringAddr, 'pointer', ['pointer', 'pointer']);
        
        // Call the valueToString function with jsThis and runtimePtr
        let resultPtr = valueToString(jsThis, runtimePtr);
        
        // Convert the result pointer to a JavaScript string
        let resultString = Memory.readUtf8String(resultPtr);
        
        console.log("Value to String Result:", resultString);
    }
}); 

错误:访问 0x500000cf0 时发生访问冲突

通过将其调用处理程序挂钩到 Hermes 上来挂钩本机函数调用:jsi::Value HermesRuntimeImpl::call。

不幸的是这个方法没有导出,所以必须手动打开libhermes.so并识别它的地址。它是使用字符串 HermesRuntimeImpl::call 的两个方法之一:无法调用函数:堆栈溢出,因此找到它并不太复杂(另一个方法用于执行构造函数,因此可能值得挂钩这两个方法)。

所以这是我的出发点:

Interceptor.attach(Module.findBaseAddress("libhermes.so").add(0x001267d8 - 0x00100000), {
    onEnter: function (args) {
        let func = args[1]; // jsi::Function
        let jsThis = args[2]; // jsi::Value
        let jsArgs = args[3]; // jsi::Value
        let count; // = args[4]; // size_t count
        console.log(`HermesRuntimeImpl::call ${func} ${jsThis} ${jsArgs} ${count}`);
    }
});

jsi::Function 和 jsi::Value 似乎是在 libjsi.so 中定义的。但要调用它们,您需要一个 HermesRuntime 实例。

我尝试使用 jsi::Value::toString(Runtime): 从参数之一获取字符串:

let valueToStringAddr = Module.findExportByName("libjsi.so", "_ZNK8facebook3jsi5Value8toStringERNS0_7RuntimeE");
let valueToString = new NativeFunction(valueToStringAddr, 'pointer', ['pointer']);

但这需要一个运行时(HermesRuntime?)实例。到目前为止,获得我发现的唯一方法是挂钩函数 makeHermesRuntime

Module.findExportByName("libhermes.so", "_ZN8facebook6hermes17makeHermesRuntimeERKN6hermes2vm13RuntimeConfigE").

但在我的环境中它没有被调用。

react-native hook frida react-native-hermes hermes
1个回答
0
投票

我也遇到问题了

错误:访问 0xbf5a9bd7c2d 时发生访问冲突 在 onEnter (/test.js:44) 处设备丢失

测试.js:44 让 resultPtr = valueToString(jsThis,runtimePtr);

© www.soinside.com 2019 - 2024. All rights reserved.