强制调用对象实例方法

逆向工程 C++ 仪器仪表
2021-06-15 11:33:33

我已经使用 Frida.RE 检测了一个应用程序。我可以挂钩我感兴趣的 C++ 类的构造函数,我们称之为 MyClass::MyClass()。

我想在对象实例上调用非静态 MyClass::SomeMethod()。为此,我需要拥有对象实例的地址,以便我可以将其作为隐式“this”参数传递给方法。

有没有办法监控创建的 MyClass 实例的地址?

或者是否有其他方法可以调用已实例化对象的 SomeMethod() 方法?

更新:

我试图用 Frida (args[0]) 简单地记录传递给构造函数的第 0 个参数,但我无法访问this指针,只能访问第一个“真实”参数(由调用者显式传递)。

我能想到两件事:

  1. Frida 不关心隐含的this论证,或者
  2. 由于 Windows 程序中使用的 thiscall 方案,事情变得一团糟(我正在 32 位 Windows 上进行试验)。不过,我想不出一种方法来通过 Frida 获得 ECX 的价值......
2个回答

构造函数的第一个参数是为对象分配的内存。(通常存储在 r0 为 ARM 和拇指)。所以监控它的方法很简单:检测类的所有构造函数并观察第一个构造函数参数。

我也在为此苦苦挣扎,直到我意识到该函数是否使用自定义调用约定。args[n] 假定默认调用约定。对于自定义调用约定,在这种情况下是 __thiscall 方案,指向 this 的指针位于 ecx 寄存器上(可通过 this.context.ecx 访问)。

希望这可以帮助任何人!