Hooking call function in c++?

Refresh

December 2018

Views

677 time

4

Hello people,
I'm kinda newbie with c++ but i have managed to create my own dll and injecting it to my gameserver.exe

Well i have tried for days to hook a user call function but i always fail since it belongs to assembly :(
I would like you guys to show me how i write a proper lines to hook this function:

0048C1AF  |. 8B9B 4C010000  MOV EBX,DWORD PTR DS:[EBX+14C]
0048C1B5  |. 8B13           MOV EDX,DWORD PTR DS:[EBX]
0048C1B7  |. 8B82 EC000000  MOV EAX,DWORD PTR DS:[EDX+EC]
0048C1BD  |. 8BCB           MOV ECX,EBX
0048C1BF  |. FFD0           CALL EAX
0048C1C1  |. 8BF8           MOV EDI,EAX
0048C1C3  |. E8 789EF8FF    CALL SR_GameS.00444040
0048C1C8  |. 8B7C24 1C      MOV EDI,DWORD PTR SS:[ESP+1C]
0048C1CC  |. 8BF0           MOV ESI,EAX
0048C1CE  |. E8 6D9EF8FF    CALL SR_GameS.00444040

What i have written on c++ so far is:

void __cdecl Global()
{

    __asm
    {

           mov msg, edi; //msg

           push ebx;
           mov ebx, dword ptr[esp+1C]; //playername
           mov playername, ebx;
           pop ebx;
    }

    printf("Global [%s] -> %s\n", playername, msg);

    //then calling func entry
    CALL((DWORD)0x00444040);
}

when ever 0048C1CE got called, i get it into my c++ and move it's parameters into Global() until here everything goes fine but inside Global() i can't call back the parameters successful into x00444040 even it show a strange values in console window and sometimes show a part of player message.

P.S. If it's possible an explanation about how things goes with assembly lines.

Sorry for my English, Thanks in advance.

2 answers

1

Я оставляю в стороне вопрос о том, почему вы хотели бы сделать это. Это, наверное, кого-то другого программного обеспечения, и они, вероятно, не даст вам разрешение. Вы можете быть в нарушении лицензии где-нибудь.

Ваше описание довольно запутанная. Линии ассемблера не являются функцией, они код с 3 вызовов функции. Я предполагаю, что вы хотели сказать, что вы хотите, чтобы перехватить вызов функции 0x00444040 для того, чтобы выполнить свой собственный код. Вы не показали, как это делать.

Код C ++ нужно сделать примерно три вещи.

  1. На входе, она должна соответствовать последовательностям вызова ожидаемых вызывающим. Оказывается, есть два аргумента, в ESI и EDI.
  2. Если вы хотите, чтобы вызвать функции библиотеки C ++, то вы должны сохранить все регистры, которые могут быть затронуты, делая эти вызовы и восстановить их в дальнейшем.
  3. При выходе, вы должны восстановить стек и регистрирует, как именно они были на входе, и ветвь (JMP не ЗВОНИТЕ) на крючке функции, так что он может вернуться к исходному абоненту, не код сцепной.

На уровне отладчика, просто убедитесь, что каждый регистр (включая указатель стека) такой же, как это было на входе, только перед тем, как перейти к крючковатым функции.

0

Мораль и легальность в сторону, я просто хочу, чтобы сосредоточиться на технических аспектах вашего вопроса, - но я чувствую, вы должны дать искреннюю мысль в точках david.pfx поднятым.

Написав несколько проектов , которые делают подобные вещи , что вы описали, только для личного знания, я бы рекомендовал общее назначение крепежной библиотеку. Я работал с исходным двигателем (из Half-Life 2 славы), и использовал библиотеку под названием SourceHook . SourceHook является частью проекта Metamod в AlliedModder, который используется внутри SourceMod.

Когда я пытался писать крючки общего назначения за пределами проектов исходного двигателя, я нашел SourceHook еще полезно, но и изучить другие варианты. Я был рад , используя mHook , другой общего назначения крепежную библиотеку.

Его важно знать о вызовах методов вы подключаете, как восстановление регистров правильно имеет решающее значение для безопасного выполнения ваших крючков