findExportByName查找不在模块中的名称

时间:2019-05-17 09:14:23

标签: reverse-engineering frida

我想将connect函数挂接到套接字上。

首先,我需要找到它的地址。

我列举了以下模块:

modules = Process.enumerateModules()

奇怪的是

addr = modules[i].findExportByName('connect')

返回任何libsystem_kernel.dylib的预期地址(根据Process.findModuleByAddress(addr)属于i)。

除了与包含导出模块的模块相对应的值外,我不了解它如何适用于i的不同值,如果它确实适用于所有模块,为什么{{1 }}是findModuleByAddress的功能吗?

我注意到了

Process

也可以,但是我不知道有什么区别。

2 个答案:

答案 0 :(得分:0)

您的问题尚不清楚,我无法重现您描述的行为,它可以在我的手机上使用最新的Frida> <,但是,我会给与答案。

libsystem_kernel.dylib#connect是套接字连接。

如果您将null作为Module.findExportByName的第一个参数传递,它将在所有模块中搜索。

您可以使用DebugSymbol.fromAddress进行健全性检查。

DebugSymbol.fromAddress(Module.findExportByName(null, 'connect'))                                             
{
    "address": "0x185c5c370",
    "fileName": "",
    "lineNumber": 0,
    "moduleName": "libsystem_kernel.dylib",
    "name": "__connect"
}

要挂钩,可以使用

$ frida-trace -Uf com.app -i connect

Interceptor.attch(Module.findExportByName(null, 'connect'), {
  onEnter: onEnterCallback, onLeave: onLeaveCallback
})

答案 1 :(得分:0)

就像你说的,这有效:

Module.getExportByName(null,'socket')
"0x183d8ca94"

Process.findModuleByAddress("0x183d8ca94")
{
    "base": "0x183d88000",
    "name": "libsystem_kernel.dylib",
    "path": "/usr/lib/system/libsystem_kernel.dylib",
    "size": 163840
}

首先,您获得 addresssocket。然后您使用该地址查找 Module

您可以将它们缩短为@i.e. 的命令。显示。他给了你一个很好的答案。

您问:“为什么 findModuleByAddress 不是 Process 的函数?”我使用的是 Frida "version": "12.11.18",它是 Process 的一部分。