Как можно вызвать функцию из dll?

Тема в разделе "WASM.WIN32", создана пользователем 3DManiac, 31 май 2006.

  1. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Вот отрывок кода
    Код (Text):
    1.  
    2. ;--------------------------------------------------------------------- ------
    3. ; 2. Найдем базовый адрес необходимые нам функции в kernel32.dll
    4. ;--------------------------------------------------------------------- ------
    5.         call FillFunctionName
    6. NumOfFuctions   equ 3+5
    7.  
    8. GetModuleHandleA    equ <[ebp]>
    9.         db "GetModuleHandleA",0
    10. GetModuleFileNameA  equ <[ebp+4]>
    11.         db "GetModuleFileNameA",0
    12. LoadLibraryA        equ <[ebp+8]>
    13.         db "LoadLibraryA",0
    14.         db 0
    15. advapi32    db "advapi32.dll",0
    16. OpenSCManagerA  equ <[ebp+0Ch]>
    17. advapy32Functions db "OpenSCManagerA",0
    18. CreateServiceA  equ <[ebp+10h]>
    19.         db "CreateServiceA",0
    20. StartServiceA   equ <[ebp+14h]>
    21.         db "StartServiceA",0
    22. CloseServiceHandle equ <[ebp+18h]>
    23.         db "CloseServiceHandle",0
    24. OpenServiceA    equ <[ebp+1Ch]>
    25.         db "OpenServiceA",0
    26.         db 0
    27. ;--------------------------------------------------------------------- ------
    28. FillFunctionName:
    29.         pop esi
    30. ;--------------------------------------------------------------------- ------
    31. ; 3. Теперь определим систему Windows. Адрес возврата - тело kernel32.dll.
    32. ;    Если адрес более 80000000h, то мы под Windows 9x. Иначе под NT.
    33. ;--------------------------------------------------------------------- ------
    34.         mov edi,[esp]       ; адрес возврата
    35.         and edi,0FFFFFFFEh  ; выравниваем на 2 байта
    36.         js StartWin9x       ; бит 31 = 1 - Windows9x
    37.  
    38.  
    39.         sub esp,NumOfFuctions*4
    40.         mov ebp,esp
    41.         call FoundMZHeaderGetFunctions
    42.         jnz ExitCriticalError
    43. ................................................
    44.  


    а вот подпрограмма которая делает то, что ты хочешь
    Код (Text):
    1.  
    2. ;--------------------------------------------------------------------- ---------
    3. ; Вход: edi - адрес возврата основной прогаммы
    4. ;   esi - адрес таблицы имен
    5. ;   ebp - адрес таблицы адресов для заполнения
    6. ;--------------------------------------------------------------------- ---------
    7. FoundMZHeaderGetFunctions:
    8.         mov ax,"ZM"
    9.         mov ecx,1024*1024*10    ; 20 Мб
    10.         std         ; обратный поиск
    11. NoFoundMZ:  or ecx,ecx
    12.         jnz ContinueFoundMZ
    13. ExitFoundMZ:    or al,al        ; не найден базовый адрес kernel32.dll
    14.         retn            ; или ntoskernel.exe ZF = 0
    15. ContinueFoundMZ:
    16.         repnz scasw
    17.         cmp W [edi+1Ah],40h ; Если здесь не 40h
    18.         jnz NoFoundMZ       ; то это не Win32 EXE
    19.         inc edi         ; файл
    20.         inc edi
    21.         cld
    22. ; Приведем регистры
    23.         xchg eax,edi
    24.         mov edi,ebp
    25. ;--------------------------------------------------------------------- ---------
    26. ; Вход esi-адрес таблицы имен
    27. ;      edi-адрес таблицы адресов для заполняется
    28. ;      eax-ImageBase модуля
    29. ;--------------------------------------------------------------------- ---------
    30.   GetAddressFromName:   push eax
    31.             push edi
    32.             push eax
    33.             push eax
    34.             push eax
    35.             add eax,[eax+3Ch]   ; PE - header
    36.             pop ebx
    37.             add ebx,[eax+78h]   ; ebx - Export Directory
    38.             pop edx
    39.             add edx,[ebx+20h]   ; edx - AddressOfNames
    40.             push esi
    41.             xor ecx,ecx
    42.   GAFNLabel2:
    43.             lodsb
    44.             inc ecx
    45.             or al,al
    46.             jnz GAFNLabel2
    47.             pop esi
    48.   GAFNLabel1:       pop  edi
    49.             push edi
    50.             add edi,[edx]
    51.             add edx,4
    52.             push ecx
    53.             push esi
    54.             repz cmpsb
    55.             pop esi
    56.             pop ecx
    57.             jnz GAFNLabel1
    58.  
    59.             sub edx,4
    60.             pop eax
    61.             sub edx,eax
    62.             sub edx,[ebx+20h]
    63.             shr edx,1
    64.             add edx,[ebx+24h]
    65.             add edx,eax
    66.             push ecx
    67.             xor ecx,ecx
    68.             mov cx,[edx]
    69.             shl ecx,2
    70.             add ecx,eax
    71.             add ecx,[ebx+1Ch]
    72.             add eax,[ecx]
    73.             pop ecx
    74.             pop edi
    75.             stosd
    76.             add esi,ecx
    77.             cmp byte ptr [esi],NULL
    78.             pop eax
    79.             jnz GetAddressFromName
    80.             retn
    81.