Вызов функции из Длл'ки

Тема в разделе "WASM.ASSEMBLER", создана пользователем tagegor, 6 авг 2009.

  1. tagegor

    tagegor New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    54
    Здравствуйте
    Сутки бьюсь с проблемой: как вызвать процедуру из ДЛЛ'ки?
    Суть:
    Есть программа - сервер онлайн игры. Исходников нету
    Есть .map файл в котором я нашел функцию:
    Код (Text):
    1.  0001:00152800       ?NpcDeviasGuard@@YAHPAUOBJECTSTRUCT@@0@Z 00553800 f   NpcTalk.obj
    В олли нашел данный оффсет. Возникло желание его изменить

    Как я понял: ГеймСервер делает Call на оффсет где расположена команда JMP на функцию(00553800) где описана функция - реакция этого НПЦ на "тыкание" на него

    В Длл'ке есть функция:
    Код (Text):
    1. NewNPC Proc
    2.  Local PlayerID:DWord
    3.  Local Map:DWord
    4.  Local X:DWord
    5.  Local Y:DWord
    6.  Mov Eax, DWord Ptr Ss:[Ebp + 8]
    7.  Mov Edx, DWord Ptr Ds:[Eax]
    8.  Mov PlayerID, Edx
    9.  Mov Map, 0
    10.  Mov X, 98H
    11.  Mov Y, 34H
    12.  Mov Eax, Y
    13.  Push Eax
    14.  Mov Ecx, X
    15.  Push Ecx
    16.  Mov Edx, Map
    17.  Push Edx
    18.  Mov Eax, PlayerID
    19.  Push Eax
    20.  Call gObjTeleport
    21.  Ret
    22. NewNPC EndP
    Dll'ку хукнул:
    Код (Text):
    1. 005D903D   . 72 65 73 65 61>ASCII "research.dll",0
    2. 005D904A     00             DB 00
    3. 005D904E   . 4E 65 77 4E 50>ASCII "NewNPC",0
    4. 005D9055     00             DB 00
    5. 005D9063   > 68 3D905D00    PUSH GameServ.005D903D                   ; |/FileName = "research.dll"
    6. 005D9068   . FF15 F4BC8C0C  CALL DWORD PTR DS:[<&KERNEL32.LoadLibrar>; |\LoadLibraryA
    7. 005D906E   . 68 4E905D00    PUSH GameServ.005D904E                   ; |hModule = 005D904E
    8. 005D9073   . FF15 F0BC8C0C  CALL DWORD PTR DS:[<&KERNEL32.GetProcAdd>; \GetProcAddress
    9. 005D9079   .^E9 171FFCFF    JMP GameServ.0059AF95
    10. (Пустые оффсеты и nop стер)
    Дак вот как вызвать функцию NewNPC из DLL'ки, на месте старой?
    Спасибо, надеюсь на вашу помощь
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    tagegor
    > Dll'ку хукнул ...
    Ничего не понял, однако, KERNEL32.GetProcAddress требует два параметра, у тебя только второй.
     
  3. tagegor

    tagegor New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    54
    Да я вроде разобрался, поправил ГетПроц, но, блин, ексепшн вылетает
    Код (Text):
    1. 005D908E   > 68 3D905D00    PUSH GameServ.005D903D                   ; /FileName = "research.dll"
    2. 005D9093   . FF15 F4BC8C0C  CALL DWORD PTR DS:[<&KERNEL32.LoadLibrar>; \LoadLibraryA
    3. 005D9099   . 68 5B905D00    PUSH GameServ.005D905B                   ; /ProcNameOrOrdinal = "LeInit"
    4. 005D909E   . 50             PUSH EAX                                 ; |hModule
    5. 005D909F   . FF15 F0BC8C0C  CALL DWORD PTR DS:[<&KERNEL32.GetProcAdd>; \GetProcAddress
    6. 005D90A5   . A3 911F4000    MOV DWORD PTR DS:[401F91],EAX
    7. 005D90AA   .^E9 E61EFCFF    JMP GameServ.0059AF95
    Пишет что нельзя записать по адресу 401F91...
    Как быть? :lol:
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    tagegor
    > нельзя записать по адресу 401F91
    Секция кода?
    Если да, то обычно она имеет атрибуты чтение+исполнение, надо ERW.
     
  5. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    tagegor
    А старый код не покажете? Что там натворили? Не исключено, что изменения некорректны, имхо.
     
  6. tagegor

    tagegor New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    54
    Я подменяю вызов Функции по адресу 401F91
    Своей функцией находящейся в ДЛЛке, адрес чей я получаю через ГетПроцАдресс

    Я изменил EP на загрузку моей ДЛЛки, тоесть сразу при загрузке дллки меняется Инструкция JMP "00521BF2", по адресу 401F91, на JMP "оффсет из ДЛЛки"
     
  7. tagegor

    tagegor New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    54
    ERW
    Погуглил, не нашел что это такое...
    Не обьясните?

    Вот строчка которую я хочу подменить:
    "00401F91 $ E9 6A181500 JMP GameServ.00553800"

    Скорее всего секция кода :)
     
  8. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    tagegor
    Меня интересует код после этого перехода
    JMP GameServ.0059AF95
    и почему адрес процедуры "LeInit" запихнули в 401F91, ведь в оригинальном коде адрес этой процедуры передается как-раз в 59AF95.
     
  9. tagegor

    tagegor New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    54
    Ексепшн вылетает до него :)
    Это переход на оригинальную точку загрузки сервера. Тоесть я вырезал часть, изменил еп. Тоесть сначала грузится либа, потом начинается код самого сервера
     
  10. tagegor

    tagegor New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    54
    crypto
    Нет, вы меня неправильно поняли.
    Я опишу понятнее.
    1. Есть Длл'ка, в ней 4 функции:
    а. Инициализация дллки
    б. LeInit
    в. NewNPC
    г. ChangeThisCall:
    Код (Text):
    1. ChangeThisCall Proc BaseAddr:DWord, MyProcAddr:DWord
    2.  Mov Eax, BaseAddr
    3.  Mov Edx, MyProcAddr
    4.  Sub Edx, Eax
    5.  Add Edx, -5
    6.  ;Add Eax, 1
    7.  Mov DWord Ptr Ds:[Eax], Edx
    8.  Ret
    9. ChangeThisCall EndP
    При загрузке ГеймСеврер, вызывает функцию LeInit, та в свою очередь вызывает ChangeThisCall, меняя вызов оффсета 401F91, на оффсет DLL'ки. Дак вот когда я пишу в память(тоесть меняю оффсет) мне кидает ексепшн, о том что нельзя прописать по адресу 401F91...
    Исходников ГеймСервера нету :dntknw:
     
  11. tagegor

    tagegor New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    54
    Проблема решена
     
  12. tagegor

    tagegor New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    54
  13. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    tagegor
    И в чем же была ошибка?
     
  14. tagegor

    tagegor New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    54
    Ну во-первых секция .text была только на read
    Во-вторых, моя ДЛЛ'ка подгружалась второй(перед ней еще одна)
    Ну и включил виртуалпротект :)