在 Frida 拦截方法中读取结构/对象的值

Posted

技术标签:

【中文标题】在 Frida 拦截方法中读取结构/对象的值【英文标题】:Reading the value of a struct/object in a Frida intercepted method 【发布时间】:2020-11-28 23:44:32 【问题描述】:

假设我有一个带有以下签名的 C# 方法

public virtual void DoSomething(int index, int value, List<int> results)

到目前为止,我已经成功地使用 Frida 像这样挂钩方法调用

Interceptor.attach(Module.findBaseAddress("library.so").add(0x123456), 
   onEnter(args) 
      log(args[2]) // here I'd like to print the values of the list
   
)

注销指向参数本身的指针会给我一个类似0x1 的值。如果指针是原语的,我会使用 args[2].readUtf8String() 之类的东西来读取值,但我不确定如何处理 List&lt;int&gt; 或任何复杂的对象。

【问题讨论】:

【参考方案1】:

您似乎正在调试本机库 (library.so)。如果是这样的话,恐怕访问任何类的底层属性、方法等都不是那么简单,因为许多对 C#/IL 有效且有意义的概念只是在较低级别被区别对待.

比如你提供的函数:

public virtual void DoSomething(int index, int value, List<int> results)

可能会在其原生等效项中映射到类似的东西:

void DoSomething(ThisClass* this, int32_t index, int32_t value, StructForListOfInts* results)";

因此,为了访问复杂对象的各个属性,您需要提前了解底层结构,以便您可以“移动”到您想要的特定偏移量。我想这本身并不是很有用,因为您仍然需要该结构,但是如果您能够提供有关此的更多详细信息,我很乐意继续查看它:)

【讨论】:

以上是关于在 Frida 拦截方法中读取结构/对象的值的主要内容,如果未能解决你的问题,请参考以下文章

Frida - Windows 原生应用程序 - 读取 Wininet.h 公开的结构

es6之proxy学习

es6之proxy学习

HandlerInterceptor拦截实现对PathVariable变量的读取

js对象在sqlite中保存和读取

PHP 如何读取Javascript 对象的值?