将参数压入堆栈的宏

Macro to push arguments onto stack

我一直在做一个有趣的小项目来弄乱函数的调用方式,我需要一个宏来推送参数,因为为这个混淆的每个实例手动推送参数会非常耗时打电话。

到目前为止,这是我的代码:

#define pushargs(...)                      \
    // idk what to do here...

#define ObfuscatedPrefix(FunctionPtr)      \
    __asm cmp ebx, FunctionPtr             \
    __asm _emit 0x74 __asm _emit 0x02      \
    __asm _emit 0xEB __asm _emit 0x03      \
    __asm mov [ebp + 4], eax

#define DecryptOffset(FunctionPtr, V)      \
    ((FunctionPtr) - (V))

#define ObfuscatedCall(FunctionPtr, V, ...)\
    __asm push ebx                         \
    __asm push eax                         \
    __asm mov ebx, FunctionPtr             \
    __asm mov eax, V                       \
    __asm sub ebx, eax                     \
    pushargs(__VA_ARGS__)                  \
    __asm _emit 0xEB __asm _emit 0x02      \
    __asm _emit 0xEB __asm _emit 0x05      \
    __asm _emit 0xE8 __asm _emit 0xF9      \
    __asm _emit 0xFF __asm _emit 0xFF      \
    __asm _emit 0xFF __asm pop eax         \
    __asm add eax, 0x07                    \
    __asm jmp ebx                          \
    __asm pop ebx

感觉不太可能,如有不妥请指正...

如果您仍然对欺骗 Visual C++ 编译器感兴趣,您可以试试这段代码

#define pushargs(...) for (unsigned int _esp; ;) _esp = varcount(), _esp =(_esp-varcount(__VA_ARGS__))>>2, pushargs_c(_esp, __VA_ARGS__ ); 



unsigned int __declspec(naked) __forceinline varcount(...)
{
    __asm mov eax, esp;
    __asm ret;
}

unsigned int __declspec(naked) __forceinline pushargs_c(unsigned int count, ...)
{
    __asm mov eax, DWORD PTR [esp+04h]
    __asm dec eax
    __asm shl eax, 2
    __asm sub esp, eax
    __asm push DWORD PTR [esp+eax]
    __asm ret;
}

我的 Visual Studio 版本(2013 express)即使使用 __forceinline 也不会内联调用。
此代码不可移植并且是特定于实现的,我发现它可以与我的 VC++ 编译器一起使用,即使在发布模式下也是如此,但在大量优化或新 Visual Studio 个版本!

试一试,您可以按预期使用pushargs宏。 pushargs_c 更可靠,但要求第一个参数是剩余参数的数量(即 pushargs_c(5, 1,2,3,4,5))。