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