Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
#define cdecl_hook(name1)\ /*Macro definition*/
void name1##_hook(int a1, ...)\ /*Declare hooker*/
{\
int check_s = 0;\
__asm{mov check_s, esp}\ /*Save esp state*/
int *ptr = &a1;\ /*Get pointer to 1st arg, equialent of va_list*/
debug_msg("Advanced",true,"--%s arg list started--", __FUNCTION__);\ /*debug_msg() - vfprintf wrapper*/
for(int i=0; i*4<name1##_arg_amount; i++)\
{\
debug_msg("Advanced",true," |---Element %d: %d", i, ptr[i]);\
}\ /*Arg list -> file(Advanced.txt)*/
debug_msg("Advanced",true,"--arg list finished--\n");\
__asm{lea ecx, a1}\ /*Move addr of a1 to ecx*/
__asm{mov eax, name1##_arg_amount}\ /*move size of args in stack(can get from IDA, for ex.) to eax*/
__asm{label_loop: }\ /*Start loop*/
__asm{mov ebx, dword ptr[ecx+eax-4]}\ /*Move args from stack to ebx in loop and push ebx*/
__asm{push ebx}\
__asm{sub eax,4}\
__asm{cmp eax,0}\
__asm{jg label_loop}\
__asm{call dword ptr[name1##_Detour]}\ /*Call original function*/
__asm{mov esp, check_s}\ /*Restore stack, same as __asm{add esp, name1##_arg_amount}*/
}\
[В разработке] Перехватчик функций с неизвестными аргументами