将参数压入堆栈的宏
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)
)。
我一直在做一个有趣的小项目来弄乱函数的调用方式,我需要一个宏来推送参数,因为为这个混淆的每个实例手动推送参数会非常耗时打电话。
到目前为止,这是我的代码:
#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)
)。