Всем доброго времени суток. Ниже приведен простенький код который должен по идее загружать две библиотеки. user32.dll и GDI32.DLL. Загрузка первой библиотеки происходит нормально. В ЕАХ База библиотеки,вообщем все супер гуд. Второй вызов функции LoadLibrary оканчиваться весьма странно.Грузиться база непонятной библиотеки. Вообщем фигня какаято. Важно - Первый вызов LoadLibrary ВСЕГДА проходит успешно. Какую бы библиотеку ему не скормить. Юзера,или GDI. Подскажите кто знает,почему так происходит? Приведен фрагмент кода с трассировкой,снятой сразу после вызова LoadLibrary. PS Есть ли еще какая либо функция АПИ которая по имени dll~ки возвращала бы её базовый адрес? Код (Text): format PE GUI include 'win32a.inc' invoke LoadLibraryA,strUser32 mov [U32Base],eax ;traser----------------------------------------------- ;EAX 77D40000 user32.77D40000 ;LastErr ERROR_SUCCESS (00000000) ;----------------------------------------------------- invoke LoadLibraryA,strGDI32 mov [G32Base],eax ;traser----------------------------------------------- ;EAX 77F10000 - ?????? ;LastErr ERROR_SUCCESS (00000000) ;dump 77F10000 ;77F10000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 MZ.......ÿÿ.. ;77F10010 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 ¸.......@....... ;----------------------------------------------------- strUser32 db 'user32.dll',00 strGDI32 db 'GDI32.dll',00 U32Base dd ? G32Base dd ? section '.idata' import data readable writeable library kernel, 'KERNEL32.DLL' import kernel, LoadLibraryA, 'LoadLibraryA'[code]
Если dll уже подгружена в процесс, то GetModuleHandle Попробуй сначала LoadLibrary, а затем не выгружая gdi, GetModuleHandle, и сравни, совпадают возвращаемые ими значения
Пробовал и так. Не выходит. Но все равно меня интересует вопрос - Почему проваливаеться второй вызов LoadLibrary? Именно ВТОРОЙ и без разници какую ДЛЛКУ я подгружаю. Если после первого вызова вызвать FreeLibrary и потом снова вызвать Load , то все опять же работает.... Но мне так не пойдет. Надо подгрузить и Юзера и Гди. Да и вообще интерестно,почему не работает?
Worm32 Что у тебя не выходит? Если LoadLibrary провалилась, то она вернёт 0. У тебя же возвращает нормальный адрес. Значит отработала успешно. А если ты не видишь строки "gdi32.77F10000" - это проблема твоего трейсера, а не LoadLibrary.
Да,адрес действительно тот. Но всеже чтото здесь не так. 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): format PE GUI include 'win32a.inc' call delta ;>>STACK -4>> delta: sub dword [esp],delta ;dword[esp] - delta значение pop ebp ;<<STACK +4<< lea edi,[ebp+HeshTable] xor edx,edx mov eax,[fs:edx] dec edx searchK32: cmp [eax],edx je checkK32 mov eax,[eax] jmp searchK32 checkK32: mov ebx,[eax+4] xor bx,bx searchMZ: cmp word[ebx],'MZ' je checkPE sub ebx,10000h checkPE: mov eax,[ebx+3ch] cmp word[eax+ebx],'PE' jne searchMZ mov esi, [eax + ebx + 78h] lea esi, [esi + ebx + 18h] xor ecx,ecx mov cl,4 grab_IED_struct: lodsd push eax loop grab_IED_struct add eax,ebx push eax mov ecx,[esp+10h] mov esi,[esp+8h] add esi,ebx search_API: lodsd add eax,ebx xor edx,edx calc_hash: rol edx,3 xor dl,byte[eax] inc eax cmp byte[eax],0 jne calc_hash mov eax,[esp] add dword[esp],2 cmp [edi],edx jne _f cmp_ok: movzx eax,word [eax] shl eax,2 add eax,[esp + 0ch] add eax,ebx mov eax,[eax] add eax,ebx stosd _f: cmp dword [edi], 0 je EndScan loop search_API EndScan: inc byte [dllflag] cmp byte [dllflag],2 je LoadGDI jg vse_Ok invoke LoadLibrary,strUser32 ;Для тестирования поменять на strGDI32 xchg eax,ebx lea edi,[ebp + HeshTableU32] ;Для тестирования поменять на [ebp + HeshTableG32] jmp searchMZ LoadGDI: invoke LoadLibrary,strGDI32 ;Для тестирования поменять на strUser32 xchg eax,ebx lea edi,[ebp + HeshTableG32];Соответственно jmp searchMZ vse_Ok: ;----Тестирование вызовов АПИ---------------------------------------------------------- invoke BitBlt,0 ;Либо норма,либо вызов непонятно куда invoke MessageBoxA,0,0,0,0 ;Тоже.............(((((((((((( invoke ExitProcess,0 HeshTable: ExitProcess dd 0E6FF2CB9h FreeLibrary dd 078A25FBBh GetModuleHandleA dd 0C9BFFA7Dh LoadLibrary dd 0A412FD89h dd 0 HeshTableU32: AlignRects dd 0688EF111h AnimateWindow dd 04639D2DAh MessageBoxA dd 014D14C51h dd 0 HeshTableG32: AbortDoc dd 009985A1Bh AbortPath dd 04CC2FB88h BitBlt dd 000276B94h dd 0 strUser32 db 'user32.dll',0 strGDI32 db 'gdi32.dll',0 dllflag rb 1 полный текст программки которая сначала находит базовый аддрес Кернела. Потом через вызов LoadLibrary загружает USER32. Базовый аддрес USER32 Передаёться в тотже модуль поиска АПИ функций.Они успешно находяться и вызываються. МессаджБокс и прочие. Второй вызов LoadLibrary проваливаеться! Явных ошибок в коде не обнаружил.
Да похоже на самом деле отладчик глючит на втором вызове LoadLibrary. В глаза не опознаёт загруженную дллку и вызываемые функции. Странно,но причём тут второй вызов ??? Код ниже прямое тому доказательство. Первый фрагмен - Загружаеться библиотека GDI32. Отладчик OlliDbg прекрастно видит как саму дллку так и функции. Потом загружаеться USER32 Точно также сканируеться. В остновной программе заполняеться самопальная таблица импорта. Все также как и с GDI. Но отладчик В УПОР не видит вызов MessageBoxA! Во втором примере все наоборот. Видна библиотека Юзера и её функции (MessageBoxA) но не видна GDI. Странно. В чём фишка то ??????????? Код (Text): ;------Первый пример------------ 004010CE |>6A 00 PUSH 0 ; |hDestDC = NULL 004010D0 |.FF15 18114000 CALL [401118] ; \BitBlt 004010D6 |.6A 00 PUSH 0 004010D8 |.6A 00 PUSH 0 004010DA |.6A 00 PUSH 0 004010DC |.6A 00 PUSH 0 004010DE |.FF15 08114000 CALL [401108] ;Должен быть MessageBox c аргументами ;( /2й вызов LoadLibrary 004010E4 |.6A 00 PUSH 0 ; /ExitCode = 0 004010E6 \.FF15 EC104000 CALL [4010EC] ; \ExitProcess ж------Второй пример------------ 004010CE |>6A 00 PUSH 0 004010D0 |.FF15 18114000 CALL [401118] Должен быть BitBlt 2й вызов LoadLibrary 004010D6 |.6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL 004010D8 |.6A 00 PUSH 0 ; |Title = NULL 004010DA |.6A 00 PUSH 0 ; |Text = NULL 004010DC |.6A 00 PUSH 0 ; |hOwner = NULL 004010DE |.FF15 08114000 CALL [401108] ; \MessageBoxA 004010E4 |.6A 00 PUSH 0 ; /ExitCode = 0 004010E6 \.FF15 EC104000 CALL [4010EC] ; \ExitProcess