Помогите получить адрес функции с CALL

Тема в разделе "WASM.BEGINNERS", создана пользователем r2max, 6 июл 2011.

  1. r2max

    r2max Женя

    Публикаций:
    0
    Регистрация:
    30 мар 2011
    Сообщения:
    40
    Адрес:
    Киев
    Всем привет!
    Прошу Вашей помощи потому что сам не могу понять(
    в общем есть функция.
    Я получаю её адрес через
    RequestAuthLoginP := GetProcAddress(DllHandle,RequestAuthLogin);
    вот так вот она выглядит через Олю
    Код (Text):
    1. 203C4830 >/$ 33C0           XOR EAX,EAX
    2. 203C4832  |. 56             PUSH ESI
    3. 203C4833  |. A3 FC606E20    MOV DWORD PTR DS:[206E60FC],EAX
    4. 203C4838  |. A3 00616E20    MOV DWORD PTR DS:[206E6100],EAX
    5. 203C483D  |. A3 04616E20    MOV DWORD PTR DS:[206E6104],EAX
    6. 203C4842  |. 66:A3 08616E20 MOV WORD PTR DS:[206E6108],AX
    7. 203C4848  |. A2 0A616E20    MOV BYTE PTR DS:[206E610A],AL
    8. 203C484D  |. A3 1A616E20    MOV DWORD PTR DS:[206E611A],EAX
    9. 203C4852  |. A3 1E616E20    MOV DWORD PTR DS:[206E611E],EAX
    10. 203C4857  |. A3 22616E20    MOV DWORD PTR DS:[206E6122],EAX
    11. 203C485C  |. A3 26616E20    MOV DWORD PTR DS:[206E6126],EAX
    12. 203C4861  |. A2 2A616E20    MOV BYTE PTR DS:[206E612A],AL
    13. 203C4866  |. 8B4424 08      MOV EAX,DWORD PTR SS:[ESP+8]
    14. 203C486A  |. 6A 0E          PUSH 0E
    15. 203C486C  |. 50             PUSH EAX
    16. 203C486D  |. 68 FC606E20    PUSH Engine.206E60FC
    17. 203C4872  |. 8BF1           MOV ESI,ECX
    18. 203C4874  |. E8 7FEDD9FF    CALL Engine.201635F8
    19. 203C4879  |. 8B4C24 18      MOV ECX,DWORD PTR SS:[ESP+18]
    20. 203C487D  |. 6A 10          PUSH 10
    21. 203C487F  |. 51             PUSH ECX
    22. 203C4880  |. 68 1A616E20    PUSH Engine.206E611A
    23. 203C4885  |. E8 6EEDD9FF    CALL Engine.201635F8
    24. 203C488A  |. 8B5424 28      MOV EDX,DWORD PTR SS:[ESP+28]
    25. 203C488E  |. 8915 3C616E20  MOV DWORD PTR DS:[206E613C],EDX
    26. 203C4894  |. 8B46 4C        MOV EAX,DWORD PTR DS:[ESI+4C]
    27. 203C4897  |. C780 AC900000 >MOV DWORD PTR DS:[EAX+90AC],1
    28. 203C48A1  |. 8B4E 4C        MOV ECX,DWORD PTR DS:[ESI+4C]
    29. 203C48A4  |. C781 A8900000 >MOV DWORD PTR DS:[ECX+90A8],1
    30. 203C48AE  |. 8B4E 4C        MOV ECX,DWORD PTR DS:[ESI+4C]
    31. 203C48B1  |. 83C4 18        ADD ESP,18
    32. 203C48B4  |. 8D91 58880000  LEA EDX,DWORD PTR DS:[ECX+8858]
    33. 203C48BA  |. 52             PUSH EDX                                 ; /Arg1
    34. 203C48BB  |. E8 5063FFFF    CALL Engine.203BAC10                     ; \Engine.203BAC10
    35. 203C48C0  |. A1 B0634420    MOV EAX,DWORD PTR DS:[<&Core.?GNetworkLo>
    36. 203C48C5  |. C746 50 010000>MOV DWORD PTR DS:[ESI+50],1
    37. 203C48CC  |. 8B08           MOV ECX,DWORD PTR DS:[EAX]
    38. 203C48CE  |. 68 0C514A20    PUSH Engine.204A510C                     ;  UNICODE "(Send)RequestAuthLogin"
    39. 203C48D3  |. 51             PUSH ECX
    40. 203C48D4  |. FF15 18624420  CALL DWORD PTR DS:[<&Core.?Logf@FOutputD>;  Core.?Logf@FOutputDevice@@QAAXPBGZZ
    41. 203C48DA  |. 83C4 08        ADD ESP,8
    42. 203C48DD  |. B8 01000000    MOV EAX,1
    43. 203C48E2  |. 5E             POP ESI
    44. 203C48E3  \. C2 0C00        RETN 0C
    Вот с этого вызова
    Код (Text):
    1. 203C48BB  |. E8 5063FFFF    CALL Engine.203BAC10                     ; \Engine.203BAC10
    мне надо получить 203BAC10 - адрес функции которая вызывается
    Смещение самого вызова - 8С
    я думал сделать как то так
    Код (Text):
    1.     RequestAuthLoginP := GetProcAddress(DllHandle,RequestAuthLogin);
    2.     ProtocolVersionP := RequestAuthLoginP + $8B; // 8C = CALL 8B = ProtocolVersion;
    но походу это не правильно...
    Помогите пожалуйста)
     
  2. Apocalypse

    Apocalypse New Member

    Публикаций:
    0
    Регистрация:
    25 май 2011
    Сообщения:
    16
    Через GetProcAddress ты получишь ее только при наличии в экспорте, как бэ...

    И потом:
    Код (Text):
    1. ProtocolVersionP := RequestAuthLoginP + $8B;
    По этому адресу, будут эти байты: 5063FFFF

    Это же будет RAW смещение, вроде как...
     
  3. r2max

    r2max Женя

    Публикаций:
    0
    Регистрация:
    30 мар 2011
    Сообщения:
    40
    Адрес:
    Киев
    Функция экспортируемая....
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Насколько я помню, GetProcAddress возвращает адрес переходника 'jmp dword [address]'. Чтобы получить адрес ф-ии непосредственно в библиотеке, надо вытащить значение dword по адресу GetProcAddress[2].
     
  5. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    чего? GetProcAddress не имеет отношение к статическому импорту, она ищет по таблице экспорта смещение первой инструкции функции относительно базого адреса, прибавляет базовый адрес и возвращает результат...
     
  6. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Rel
    А, тьфу, черт, прошу прощения, я спросонья перепутал -- если просто взять адрес ф-ии, то компилятор подставит адрес переходника.

    r2max
    А в чем задача вообще? И что требуется сделать -- вызвать ф-ию по адресу 203BAC10? Если да, то надо извлечь аргумент инструкции 'call', затем прибавить к смещению инструкции 'call' пять (размер инструкции) и прибавить к полученному результату значение аргумента инструкции. Получится абсолютное смещение целевой ф-ии.
     
  7. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    203BAC10=203C48C0+FFFF6350 Просто смещение "вывернуто". Причем ничего не надо выворачивать - запишите 4 байта в двойное слово или 32-битный регистр и получите именно это число.
    Да дожил васм - GetProcAddress все новички знают, а в ассемблере сплошной пробел...