Странно работает LoadLibrary

Тема в разделе "WASM.BEGINNERS", создана пользователем Worm32, 10 фев 2006.

  1. Worm32

    Worm32 New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2005
    Сообщения:
    33
    Адрес:
    Azerbaijan
    Всем доброго времени суток.

    Ниже приведен простенький код который должен по идее загружать две библиотеки. user32.dll и GDI32.DLL.

    Загрузка первой библиотеки происходит нормально. В ЕАХ База библиотеки,вообщем все супер гуд. Второй вызов функции LoadLibrary оканчиваться весьма странно.Грузиться база непонятной библиотеки. Вообщем фигня какаято.



    Важно - Первый вызов LoadLibrary ВСЕГДА проходит успешно. Какую бы библиотеку ему не скормить. Юзера,или GDI.

    Подскажите кто знает,почему так происходит?

    Приведен фрагмент кода с трассировкой,снятой сразу после вызова LoadLibrary.



    PS Есть ли еще какая либо функция АПИ которая по имени dll~ки возвращала бы её базовый адрес?
    Код (Text):
    1.  
    2. format  PE GUI
    3. include  'win32a.inc'
    4.  
    5. invoke  LoadLibraryA,strUser32
    6. mov    [U32Base],eax
    7. ;traser-----------------------------------------------
    8. ;EAX 77D40000 user32.77D40000
    9. ;LastErr ERROR_SUCCESS (00000000)
    10. ;-----------------------------------------------------
    11. invoke  LoadLibraryA,strGDI32
    12. mov    [G32Base],eax
    13. ;traser-----------------------------------------------
    14. ;EAX 77F10000 - ??????
    15. ;LastErr ERROR_SUCCESS (00000000)
    16. ;dump 77F10000
    17. ;77F10000  4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00  MZ.......ÿÿ..
    18. ;77F10010  B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00  ¸.......@.......
    19. ;-----------------------------------------------------
    20. strUser32 db 'user32.dll',00
    21. strGDI32  db 'GDI32.dll',00
    22.  
    23. U32Base    dd ?
    24. G32Base    dd ?
    25.  
    26. section '.idata'  import data readable writeable
    27. library kernel, 'KERNEL32.DLL'
    28. import  kernel, LoadLibraryA,    'LoadLibraryA'[code]
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Если dll уже подгружена в процесс, то GetModuleHandle

    Попробуй сначала LoadLibrary, а затем не выгружая gdi, GetModuleHandle, и сравни, совпадают возвращаемые ими значения
     
  3. Worm32

    Worm32 New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2005
    Сообщения:
    33
    Адрес:
    Azerbaijan
    Пробовал и так. Не выходит. Но все равно меня интересует вопрос - Почему проваливаеться второй вызов LoadLibrary? Именно ВТОРОЙ и без разници какую ДЛЛКУ я подгружаю. Если после первого вызова вызвать FreeLibrary и потом снова вызвать Load , то все опять же работает.... Но мне так не пойдет.

    Надо подгрузить и Юзера и Гди. Да и вообще интерестно,почему не работает?
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Worm32

    в моей XP sp2 77F10000 именно базовый адрес загрузки gdi32.dll

    что тебе не нравится?
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Worm32







    Что у тебя не выходит?



    Если LoadLibrary провалилась, то она вернёт 0. У тебя же возвращает нормальный адрес. Значит отработала успешно.

    А если ты не видишь строки "gdi32.77F10000" - это проблема твоего трейсера, а не LoadLibrary.
     
  6. Worm32

    Worm32 New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2005
    Сообщения:
    33
    Адрес:
    Azerbaijan
    Да,адрес действительно тот. Но всеже чтото здесь не так.



    invoke LoadLibraryA,strGDI32

    jmp eax ; ТЕСТ!



    Трейсим и попадаем сюда:

    OllyDbg - v3.exe - [CPU - main thread, module GDI32]



    invoke LoadLibraryA,strU3232

    jmp eax ; ТЕСТ!



    Трейсим второй вызов (после возврата и коррекции аддреса)

    Попадаем вот сюда

    OllyDbg - Copy of v3.exe - [CPU - main thread]



    main thread - Библиотекой здесь и не пахнет! Хотя что странно адресс тотже. Сканирование библиотеки выдаёт что это именно то что нужно.

    Только вот функции не вызываються. ПРи попытке их вызова получаеться все тотже main thread



    И не говорите что мол отладчик виноват. Почему тогда при ПЕРВОМ вызове функции все нормально? И отладчик распознаёт базовый аддрес и функции вызываються?

    Если кому не лень скомпилируйте и протрейсьте код тестовой программки. И все станет ястно;)

    ;-------------------------------------
    Код (Text):
    1.  
    2. format  PE GUI
    3. include  'win32a.inc'
    4.  
    5. call delta              ;>>STACK -4>>
    6. delta:
    7. sub dword [esp],delta   ;dword[esp] - delta значение
    8. pop ebp                 ;<<STACK +4<<
    9.   lea edi,[ebp+HeshTable]
    10.  
    11.   xor   edx,edx
    12.   mov   eax,[fs:edx]
    13.   dec   edx
    14.  
    15. searchK32:
    16.   cmp   [eax],edx
    17.   je    checkK32
    18.   mov   eax,[eax]
    19.   jmp   searchK32
    20.  
    21. checkK32:
    22.   mov   ebx,[eax+4]
    23.   xor   bx,bx
    24.  
    25. searchMZ:
    26.   cmp   word[ebx],'MZ'
    27.   je    checkPE
    28.   sub   ebx,10000h
    29.  
    30. checkPE:
    31.   mov   eax,[ebx+3ch]
    32.   cmp   word[eax+ebx],'PE'
    33.   jne   searchMZ
    34.  
    35.   mov   esi, [eax + ebx + 78h]
    36.   lea   esi, [esi + ebx + 18h]
    37.   xor   ecx,ecx
    38.   mov   cl,4
    39.  
    40. grab_IED_struct:
    41.   lodsd
    42.   push  eax
    43.   loop  grab_IED_struct
    44.   add   eax,ebx
    45.   push  eax
    46.   mov   ecx,[esp+10h]
    47.   mov   esi,[esp+8h]
    48.   add   esi,ebx
    49.  
    50. search_API:
    51.  lodsd
    52.  add    eax,ebx
    53.  xor    edx,edx
    54.  
    55. calc_hash:
    56.   rol   edx,3
    57.   xor   dl,byte[eax]
    58.   inc   eax
    59.   cmp   byte[eax],0
    60.   jne   calc_hash
    61.  
    62.   mov   eax,[esp]
    63.   add   dword[esp],2
    64.   cmp   [edi],edx
    65.   jne   _f
    66.  
    67. cmp_ok:
    68.   movzx eax,word [eax]
    69.   shl   eax,2
    70.   add   eax,[esp + 0ch]
    71.   add   eax,ebx
    72.   mov   eax,[eax]
    73.   add   eax,ebx
    74.   stosd
    75.  
    76. _f:
    77.   cmp   dword [edi], 0
    78.   je    EndScan
    79.   loop  search_API
    80.  
    81. EndScan:
    82.   inc     byte [dllflag]
    83.   cmp     byte [dllflag],2
    84.   je      LoadGDI
    85.   jg      vse_Ok
    86.  
    87. invoke  LoadLibrary,strUser32 ;Для  тестирования  поменять на strGDI32
    88.   xchg    eax,ebx
    89.   lea     edi,[ebp + HeshTableU32]  ;Для  тестирования  поменять на  [ebp + HeshTableG32]
    90.   jmp     searchMZ
    91.  
    92. LoadGDI:
    93. invoke  LoadLibrary,strGDI32   ;Для  тестирования  поменять на  strUser32
    94.   xchg    eax,ebx
    95.   lea     edi,[ebp + HeshTableG32];Соответственно
    96.   jmp     searchMZ
    97.  
    98. vse_Ok:
    99. ;----Тестирование вызовов АПИ----------------------------------------------------------
    100. invoke  BitBlt,0  ;Либо  норма,либо вызов непонятно куда
    101. invoke  MessageBoxA,0,0,0,0  ;Тоже.............((((((((((((
    102.  
    103. invoke  ExitProcess,0
    104. HeshTable:
    105.         ExitProcess            dd 0E6FF2CB9h
    106.         FreeLibrary            dd 078A25FBBh
    107.         GetModuleHandleA       dd 0C9BFFA7Dh
    108.         LoadLibrary            dd 0A412FD89h
    109.                                dd 0
    110. HeshTableU32:
    111.         AlignRects             dd 0688EF111h
    112.         AnimateWindow          dd 04639D2DAh
    113.         MessageBoxA            dd 014D14C51h
    114.                                dd 0
    115. HeshTableG32:
    116.         AbortDoc               dd 009985A1Bh
    117.         AbortPath              dd 04CC2FB88h
    118.         BitBlt                 dd 000276B94h
    119.                                dd 0
    120. strUser32    db  'user32.dll',0
    121. strGDI32     db  'gdi32.dll',0
    122. dllflag      rb  1
    123.  
    полный текст программки которая сначала находит базовый аддрес Кернела. Потом через вызов LoadLibrary загружает USER32. Базовый аддрес USER32 Передаёться в тотже модуль поиска АПИ функций.Они успешно находяться и вызываються. МессаджБокс и прочие.

    Второй вызов LoadLibrary проваливаеться! Явных ошибок в коде не обнаружил.
     
  7. Worm32

    Worm32 New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2005
    Сообщения:
    33
    Адрес:
    Azerbaijan
    Да похоже на самом деле отладчик глючит на втором вызове LoadLibrary. В глаза не опознаёт загруженную дллку и вызываемые функции. Странно,но причём тут второй вызов ???

    Код ниже прямое тому доказательство.



    Первый фрагмен - Загружаеться библиотека GDI32. Отладчик OlliDbg прекрастно видит как саму дллку так и функции.

    Потом загружаеться USER32 Точно также сканируеться. В остновной программе заполняеться самопальная таблица импорта. Все также как и с GDI. Но отладчик В УПОР не видит вызов MessageBoxA!



    Во втором примере все наоборот. Видна библиотека Юзера и её функции (MessageBoxA) но не видна GDI. Странно.

    В чём фишка то ???????????
    Код (Text):
    1.  
    2. ;------Первый пример------------
    3. 004010CE  |>6A 00           PUSH 0          ; |hDestDC = NULL
    4. 004010D0  |.FF15 18114000   CALL [401118]   ; \BitBlt
    5. 004010D6  |.6A 00           PUSH 0
    6. 004010D8  |.6A 00           PUSH 0
    7. 004010DA  |.6A 00           PUSH 0
    8. 004010DC  |.6A 00           PUSH 0
    9. 004010DE  |.FF15 08114000   CALL [401108]   ;Должен быть MessageBox c  аргументами ;( /2й  вызов LoadLibrary
    10. 004010E4  |.6A 00           PUSH 0          ; /ExitCode = 0
    11. 004010E6  \.FF15 EC104000   CALL [4010EC]   ; \ExitProcess
    12. ж------Второй пример------------
    13. 004010CE  |>6A 00           PUSH 0
    14. 004010D0  |.FF15 18114000   CALL [401118]   Должен быть  BitBlt  2й  вызов LoadLibrary
    15. 004010D6  |.6A 00           PUSH 0          ; /Style = MB_OK|MB_APPLMODAL
    16. 004010D8  |.6A 00           PUSH 0          ; |Title = NULL
    17. 004010DA  |.6A 00           PUSH 0          ; |Text = NULL
    18. 004010DC  |.6A 00           PUSH 0          ; |hOwner = NULL
    19. 004010DE  |.FF15 08114000   CALL [401108]   ; \MessageBoxA
    20. 004010E4  |.6A 00           PUSH 0          ; /ExitCode = 0
    21. 004010E6  \.FF15 EC104000   CALL [4010EC]   ; \ExitProcess
    22.