2014-08-28 3 views
4

Привет люди,
Я любопытный новичок в C++, но я сумел создать свою собственную библиотеку DLL и впрыскивание в мой gameserver.exeФункция вызова вызова в C++?

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

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 

что я написал на C++ до сих пор является:

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); 
} 

Когда-либо вызывается 0048C1CE, я получаю его в своем C++ и перебираю его параметры в Global() , пока здесь все не прекратится, но внутри Global() я не могу перезвонить параметрам, удачным в x00444040, даже если он показывает странное значения в окне консоли и иногда показывать часть сообщения игрока.

P.S. Если это возможно, объясните, как идут дела на сборочных линиях.

Извините за мой английский, спасибо заранее.

ответ

1

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

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

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

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

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

+0

Привет, Спасибо за ваш ответ, о ваших вопросов, это игровой сервер файлы, которые просочился много лет назад, и теперь он открыт на форумах, и о моем проекте на C++ я не могу использовать полный код, так как у меня нет разрешения на его распространение, но я уверен, что он отлично работает с вашими точками 1 и 3. Неудача в точке 2, можете ли вы привести пример сохранения всех регистров, не затрагивая их и впоследствии восстановить их? – Muhab

+0

Просто нажмите несколько регистров в стек и вытащите их потом в обратном порядке. Используйте отладчик, чтобы проверить, какие регистры меняются, и поэтому их необходимо сохранить. –

0

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

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

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

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

Смежные вопросы