在 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<int>
或任何复杂的对象。
【问题讨论】:
【参考方案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 公开的结构