gоиск api по хешу в dll. небольшая проблема

Тема в разделе "WASM.BEGINNERS", создана пользователем integer, 6 фев 2009.

  1. integer

    integer New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2007
    Сообщения:
    62
    проблема заключается в том что если функция отрабатывает в ехе файле то все работает отлично.
    Код (Text):
    1. .386
    2. .model flat ,stdcall
    3. option casemap :none
    4.  
    5. include windows.inc
    6. include kernel32.inc
    7. includelib kernel32.lib
    8.  
    9. .data
    10. ; kernel32
    11.     _LoadLibrary          dd 0A412FD89h  ; _LoadLibrary должна быть в начале списка
    12. ; user32
    13.     _MessageBox           dd 014D14C51h
    14.     dd 0 ; в конце списка должен быть ноль
    15.  
    16.     szKernel32  db "kernel32",0
    17.     szUser32    db "user32",0
    18.  
    19. .code
    20.  
    21.  
    22. GetFunctions proc
    23. ;   eax должен содержать хендл библиотеки
    24.     xchg    eax, ebx
    25.     mov     edx, [ebx + 3ch]        ; PE
    26.     mov     esi, [ebx + edx + 78h]  ; Export Table RVA
    27.     lea     esi, [ebx + esi + 18h]  ; Export Table VA+18h
    28.     lodsd
    29.     xchg    eax, ecx                ; NumberOfNames
    30.     lodsd                           ; AddressOfFunctions
    31.     push    eax
    32.     lodsd                           ; AddressOfNames
    33.     add     eax, ebx
    34.     xchg    eax, edx
    35.     lodsd                           ; AddressOfNameOrdinals
    36.     add     eax, ebx
    37.     push    eax
    38.     mov     esi, edx
    39.  
    40. search_api_name:
    41.     lodsd
    42.     add     eax, ebx                ; eax points to the name of function
    43.  
    44. ; Calc function name hash
    45.     xor     edx, edx                ; edx == 0, coz it'll contain hash
    46. @@: rol     edx, 3
    47.     xor     dl, byte ptr [eax]      ; xor dl with current character
    48.     inc     eax                     ; character shift
    49.     cmp     byte ptr [eax], 0       ; is we in the end of chain?
    50.     jnz     @b
    51.  
    52. ; Get offset to ordinal
    53.     mov     eax, [esp]              ; AddressOfNameOrdinals
    54.     add     dword ptr [esp], 2      ; Move to next ordinal word
    55.     mov     edi, offset _LoadLibrary
    56.  
    57. ok_hash:
    58.     cmp    [edi], edx
    59.     jnz    @f
    60. ; Needed function found
    61.     movzx  eax, word ptr [eax]      ; Name ordinal
    62.     shl    eax, 2                   ; Multiply by 4
    63.     add    eax, [esp + 4]
    64.     add    eax, ebx
    65.     mov    eax, [eax]
    66.     add    eax, ebx
    67.     stosd
    68.     jmp    @endif
    69. @@: scasd                           ; Skip function hash
    70.  
    71. @endif:
    72.     cmp    dword ptr [edi], 0
    73.     jnz    ok_hash
    74.     dec    ecx
    75.     jnz    search_api_name
    76.     add    esp, 8
    77.     ret
    78. GetFunctions endp
    79.  
    80.  
    81. GetAPI proc
    82.     invoke  LoadLibrary,addr szKernel32
    83.     invoke  GetFunctions
    84.  
    85.     push    offset szUser32
    86.     call    _LoadLibrary
    87.     invoke  GetFunctions
    88.  
    89.     ret
    90. GetAPI endp
    91.  
    92.  
    93. Main proc
    94.     invoke  GetAPI
    95.  
    96.     push    MB_OK
    97.     push    0
    98.     push    0
    99.     push    0
    100.     call    _MessageBox
    101.  
    102.     invoke  ExitProcess,0
    103.  
    104. Main endp
    105. end Main
    а если код перенести в dll и подгрузить с помошью LoadLibrary то похоже что dll некорректно завершает работу

    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap :none
    4.  
    5. include windows.inc
    6. include kernel32.inc
    7.  
    8. includelib user32.lib
    9. includelib kernel32.lib
    10.  
    11. .data
    12. ; kernel32
    13.     _LoadLibrary          dd 0A412FD89h  ; _LoadLibrary должна быть в начале списка
    14. ; user32
    15.     _MessageBox           dd 014D14C51h
    16.     dd 0 ; в конце списка должен быть ноль
    17.  
    18.     szKernel32  db "kernel32",0
    19.     szUser32    db "user32",0
    20.     hInstance   dd 0
    21.  
    22. .code
    23.  
    24.  
    25. GetFunctions proc
    26. ;   eax должен содержать хендл библиотеки
    27.     xchg    eax, ebx
    28.     mov     edx, [ebx + 3ch]        ; PE
    29.     mov     esi, [ebx + edx + 78h]  ; Export Table RVA
    30.     lea     esi, [ebx + esi + 18h]  ; Export Table VA+18h
    31.     lodsd
    32.     xchg    eax, ecx                ; NumberOfNames
    33.     lodsd                           ; AddressOfFunctions
    34.     push    eax
    35.     lodsd                           ; AddressOfNames
    36.     add     eax, ebx
    37.     xchg    eax, edx
    38.     lodsd                           ; AddressOfNameOrdinals
    39.     add     eax, ebx
    40.     push    eax
    41.     mov     esi, edx
    42.  
    43. search_api_name:
    44.     lodsd
    45.     add     eax, ebx                ; eax points to the name of function
    46.  
    47. ; Calc function name hash
    48.     xor     edx, edx                ; edx == 0, coz it'll contain hash
    49. @@: rol     edx, 3
    50.     xor     dl, byte ptr [eax]      ; xor dl with current character
    51.     inc     eax                     ; character shift
    52.     cmp     byte ptr [eax], 0       ; is we in the end of chain?
    53.     jnz     @b
    54.  
    55. ; Get offset to ordinal
    56.     mov     eax, [esp]              ; AddressOfNameOrdinals
    57.     add     dword ptr [esp], 2      ; Move to next ordinal word
    58.     mov     edi, offset _LoadLibrary
    59.  
    60. ok_hash:
    61.     cmp    [edi], edx
    62.     jnz    @f
    63. ; Needed function found
    64.     movzx  eax, word ptr [eax]      ; Name ordinal
    65.     shl    eax, 2                   ; Multiply by 4
    66.     add    eax, [esp + 4]
    67.     add    eax, ebx
    68.     mov    eax, [eax]
    69.     add    eax, ebx
    70.     stosd
    71.     jmp    @endif
    72. @@: scasd                           ; Skip function hash
    73.  
    74. @endif:
    75.     cmp    dword ptr [edi], 0
    76.     jnz    ok_hash
    77.     dec    ecx
    78.     jnz    search_api_name
    79.     add    esp, 8
    80.     ret
    81. GetFunctions endp
    82.  
    83.  
    84. GetAPI proc
    85.     invoke  LoadLibrary,addr szKernel32
    86.     invoke  GetFunctions
    87.  
    88.     push    offset szUser32
    89.     call    _LoadLibrary
    90.     invoke  GetFunctions
    91.  
    92.     push 0
    93.     push offset szKernel32
    94.     push offset szUser32
    95.     push 0
    96.     call _MessageBox
    97.  
    98.     ret
    99. GetAPI endp
    100.  
    101.  
    102. DllMain proc hInst:HINSTANCE,reason:dword,reserved1:dword
    103.     push    hInst
    104.     pop     hInstance
    105.  
    106.     .if reason==DLL_PROCESS_ATTACH
    107.         invoke  GetAPI
    108.     .endif
    109.  
    110.     mov eax,TRUE
    111.     ret
    112. DllMain endp
    113. end DllMain
    dll подгружаю так
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap :none
    4.  
    5.     include windows.inc
    6.     include user32.inc
    7.     include kernel32.inc
    8.  
    9.     includelib user32.lib
    10.     includelib kernel32.lib
    11.  
    12. .code
    13.     libname db "zzzdll.dll",0
    14.  
    15. Main PROC
    16.  
    17.     invoke  LoadLibrary, addr libname
    18.     invoke  MessageBox,0,0,0,MB_OK
    19.     invoke  ExitProcess, 0
    20.  
    21. Main endp
    22. end Main
    MessageBox в dll срабатывает а в ехе который ее подгружает уже не срабатывает.
    функция поиска api по хешу была переписана мной с фасма.
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Нет ничего хорошего в том, чтобы вызывать MessageBox из DllMain -- это уже необнократно обсуждалось. RTFM.
     
  3. integer

    integer New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2007
    Сообщения:
    62
    censored, на MessageBox в dll я не жалуюсь, он появляется. к тому-же он расположен не в DllMain.
    про то что в DllMain желательно вызывать только функции kernel32 уже начитан.
    и даже если MessageBox не вызывать в dll, то все-равно он не появляется в ехе файле после того как вызвана dll.
    возможно я не правильно перевел функцию http://wasm.ru/forum/viewtopic.php?id=12329 с фасма в масм. если есть у кого время прошу проверить.
    сказать RTFM и google.com не сложно, но перед этим желательно бы дочитывать пост до конца.
     
  4. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    бугага, все больше не буду мешать. извините ;)
     
  5. integer

    integer New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2007
    Сообщения:
    62
    куда мне до тебя. задирай нос, пока есть перед кем. спрашиваю про одно а ты пишешь про совсем другое. казалось бы серьезный человек, а по сути любитель срать в топах.
     
  6. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    censored
    посмотри внимательно - он вызывает эту апи из ехе файла
     
  7. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    integer
    попробуй поставить int3 в дллмейн и загрузить ее в ольке - тогда и посмотришь, все ли находится
     
  8. integer

    integer New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2007
    Сообщения:
    62
    под отладчиком смотрел. все функции находятся и на мой взгляд все нормально отрабатывает. но при ret в GetAPI proc происходит сбой.
    в начале GetFunctions proc поставил pusha а в конце перед ret поставил popa и все заработало без ошибок. копаю дальше...
     
  9. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    ну так и правильно функции, которые вызываются системой(в данном случае DllMain) не должны изменять значения регистов ebx, ebp, edi, esi.
     
  10. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Стек у тебя сбивается в GetFunctions...
    И еще много чего вызывает вопросы...