mov ecx, arg - 如何在 C++ 中复制?

逆向工程 部件 C++ 称呼
2021-06-12 00:48:43

我经常看到这样格式化的代码:

push arg
push arg
(...)
mov ecx, arg
call function

如果我需要在 Assembly 中调用该函数,那很好。但是由于我知道如何始终如一地获取函数的基础,为了组织和简单起见,我想在 DLL 中使用 typedef 来调用函数。

问题是我不知道如何使用 ecx 进行调用来传递数据。除非我弄错了,func(arg,arg)否则总是会组合成两次推送和一次调用。如果我不使用 ecx 函数会崩溃,因为它是一个指向对象的指针,它需要是那个。没有内联汇编,有什么办法可以做到这一点,我想避免吗?

1个回答

你可以像这样 typedef 它:

// typedef <return-type>(__thiscall* <type-name>)(<ecx>, <stack-1>, <stack-2>);
typedef int(__thiscall* tSomeFunc)(int thisPtr, int arg1, int arg2);
tSomeFunc func = (tSomeFunc) 0xBAADC0DE;

// this is how you call it
func(/* this */ 0x123, /* arg1 */ 1, /* arg2 */ arg2);

或者直接调用:

((int(__thiscall*)(int, int, int)) 0xDEADBABE)(/* this */ 0x123, 1, 2);

它依赖于这样一个事实,即您的调用约定似乎__thiscall,它将this指针存储ecx,然后将其余的 args 推堆栈。