libmysql.dll: как правильно прописать вызов своей функции?

Тема в разделе "WASM.BEGINNERS", создана пользователем Kamikaze, 26 июл 2005.

Статус темы:
Закрыта.
  1. Kamikaze

    Kamikaze New Member

    Публикаций:
    0
    Регистрация:
    30 май 2005
    Сообщения:
    13
    Адрес:
    Ukraine
    Два месяца спустя...

    Не обнаружив решения всех предыдущих вариантов решения задачи перехвата вызова к mySQL ( 1) создание "промежуточной DLL" между запрашивающей вызов mysql.dll и оригинальной libmysql.dll; 2) врезка вызова "своей DLL" в mysql.dll и пр.), пришлось переключится непосредственно на libmysql.dll.

    Итак есть "исправленная" libmysql.dll. Называться она будет libmxsql.dll. В нее добавлена (в Import) функция "Une" библиотеки Z.dll (сборки MASM32):

    1000D23A FF25F8FF0110 JMP [Z!Une]

    RVA у функций mysql_real_query и mysql_query смещено соответственно с 000074A0 на 000074D3 и с 00006C60 на 00006C53 - шоб место було для своего вызова.

    Только вот вопрос - как этот вызов правильно прописать, чтобы не повредить работу DLL? Как в функцию mysql_real_query вписать CALL <JMP.&Z.Une> ?



    Банзай!



    PS Заранее спасибо всем прочитавшим.



    PPS Если надо, файлы здесь: http://tor.net.ua/Files/
     
  2. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    А собрать из сорцов?
     
  3. Kamikaze

    Kamikaze New Member

    Публикаций:
    0
    Регистрация:
    30 май 2005
    Сообщения:
    13
    Адрес:
    Ukraine
    Ну не саму же libmysql.dll собирать?! Я уже наигрался в "пятнашки" с ее секциями Import & Export. Новая DLL в нее включена. Все работает как и раньше. Только теперь надо вызвать свою функцию, но корректно, так чтобы оригинальная mysql_real_query (в которую и надо этот вызов добавить) не разваливалась от мусора в стеке и регистрах.

    Как (в дополнение к pushad/popad) "почиститься" после вызова своей функции?



    Банзай!



    PS Кстати libmysql.dll на асме (хоть и не полное) в инете попадалось - у французов на http://www.codes-sources.com/
     
  4. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine




    Ты наверное неправильно свою ф-цию используешь, допустим взять код из твоего закрытого топа:
    Код (Text):
    1. ================================================================
    2. 1000115B 90             NOP
    3. 1000115C 90             NOP
    4. 1000115D 90             NOP
    5. 1000115E 90             NOP
    6. 1000115F 90             NOP
    7. 10001160 90             NOP
    8. 10001161 90             NOP
    9. 10001162 90             NOP
    10. 10001163 90             NOP
    11. 10001164 90             NOP
    12. 10001165 90             NOP
    13. 10001166 90             NOP
    14. 10001167 8B4424 08      MOV EAX,DWORD PTR SS:[ESP+8]
    15. 1000116B 8B5424 04      MOV EDX,DWORD PTR SS:[ESP+4]
    16. 1000116F 50             PUSH EAX
    17. 10001170 8B41 04        MOV EAX,DWORD PTR DS:[ECX+4]
    18. 10001173 52             PUSH EDX
    19. 10001174 50             PUSH EAX
    20. 10001175 E8 C8000000    CALL <JMP.&LIBMYSQL.mysql_real_query>
    21. 1000117A 85C0           TEST EAX,EAX
    22. 1000117C 0F94C0         SETE AL
    23. 1000117F 90             NOP
    24. 10001180 90             NOP
    25. 10001181 90             NOP
    26. 10001182 90             NOP
    27. 10001183 90             NOP
    28. 10001184 90             NOP
    29. 10001185 90             NOP
    30. 10001186 90             NOP
    31. 10001187 90             NOP
    32. 10001188 90             NOP
    33. 10001189 C2 0800        RETN 8
    34. ================================================================




    Давай сперва перекинем вызов (и поменяем один байт)
    Код (Text):
    1. ================================================================
    2. 1000115B   90           NOP
    3. 1000115C   90           NOP
    4. 1000115D   90           NOP
    5. 1000115E   90           NOP
    6. 1000115F   90           NOP
    7. 10001160   90           NOP
    8. 10001161   90           NOP
    9. 10001162   90           NOP
    10. 10001163   90           NOP
    11. 10001164   90           NOP
    12. 10001165   90           NOP
    13. 10001166   90           NOP
    14. 10001167   90           NOP
    15. 10001168   90           NOP
    16. 10001169   90           NOP
    17. 1000116A   90           NOP
    18. 1000116B   90           NOP
    19. 1000116C   90           NOP
    20. 1000116D   90           NOP
    21. 1000116E   90           NOP
    22. 1000116F   90           NOP
    23. 10001170   90           NOP
    24. 10001171   8B4424 08    MOV     EAX,DWORD PTR [ESP+8]
    25. 10001175   8B5424 04    MOV     EDX,DWORD PTR [ESP+4]
    26. 10001179   50           PUSH    EAX
    27. 1000117A   8B41 04      MOV     EAX,DWORD PTR [ECX+4]
    28. 1000117D   52           PUSH    EDX
    29. 1000117E   50           PUSH    EAX
    30. 1000117F   E8 [b]BE[/b]000000  CALL    <JMP.&LIBMYSQL.mysql_real_query>
    31. 10001184   85C0         TEST    EAX,EAX
    32. 10001186   0F94C0       SETE    AL
    33. 10001189   C2 0800      RETN    8
    34. ================================================================
    Теперь вставим вызов своей ф-ции, учти - после pushad параметры будут не на [ESP+8], а на 32 байта дальше (т.к. пушим 8 регистров), должно быть типа такого и твоя ф-ция должна забрать из стека параметры (т.е. закончится на RETN 0C)
    Код (Text):
    1. ================================================================
    2. 1000115B   60           PUSHAD
    3. 1000115C   8B4424 28    MOV     EAX,DWORD PTR [ESP+[b]28[/b]]
    4. 10001160   8B5424 24    MOV     EDX,DWORD PTR [ESP+[b]24[/b]]
    5. 10001164   50           PUSH    EAX
    6. 10001165   8B41 04      MOV     EAX,DWORD PTR [ECX+4]
    7. 10001168   52           PUSH    EDX
    8. 10001169   50           PUSH    EAX
    9. 1000116A   E8 [b]??[/b]000000  CALL    <JMP.&Z.Une>
    10. 1000116F   61           POPAD
    11. 10001170   90           NOP
    12. 10001171   8B4424 08    MOV     EAX,DWORD PTR [ESP+8]
    13. 10001175   8B5424 04    MOV     EDX,DWORD PTR [ESP+4]
    14. 10001179   50           PUSH    EAX
    15. 1000117A   8B41 04      MOV     EAX,DWORD PTR [ECX+4]
    16. 1000117D   52           PUSH    EDX
    17. 1000117E   50           PUSH    EAX
    18. 1000117F   E8 BE000000  CALL    <JMP.&LIBMYSQL.mysql_real_query>
    19. 10001184   85C0         TEST    EAX,EAX
    20. 10001186   0F94C0       SETE    AL
    21. 10001189   C2 0800      RETN    8
    22. ================================================================
     
  5. Kamikaze

    Kamikaze New Member

    Публикаций:
    0
    Регистрация:
    30 май 2005
    Сообщения:
    13
    Адрес:
    Ukraine
    Спасибо!



    И здесь, конечно:

    10001165 8B41 04 MOV EAX,DWORD PTR [ECX+24]

    "Двойной" вызов оригинальной функции работает. Но "своя" пока нет. Либо мусор на стеке после попытки вызвать функцию из моей DLL, либо она некорректно прописана в редактируемую...
     
Статус темы:
Закрыта.