проблема заключается в том что если функция отрабатывает в ехе файле то все работает отлично. Код (Text): .386 .model flat ,stdcall option casemap :none include windows.inc include kernel32.inc includelib kernel32.lib .data ; kernel32 _LoadLibrary dd 0A412FD89h ; _LoadLibrary должна быть в начале списка ; user32 _MessageBox dd 014D14C51h dd 0 ; в конце списка должен быть ноль szKernel32 db "kernel32",0 szUser32 db "user32",0 .code GetFunctions proc ; eax должен содержать хендл библиотеки xchg eax, ebx mov edx, [ebx + 3ch] ; PE mov esi, [ebx + edx + 78h] ; Export Table RVA lea esi, [ebx + esi + 18h] ; Export Table VA+18h lodsd xchg eax, ecx ; NumberOfNames lodsd ; AddressOfFunctions push eax lodsd ; AddressOfNames add eax, ebx xchg eax, edx lodsd ; AddressOfNameOrdinals add eax, ebx push eax mov esi, edx search_api_name: lodsd add eax, ebx ; eax points to the name of function ; Calc function name hash xor edx, edx ; edx == 0, coz it'll contain hash @@: rol edx, 3 xor dl, byte ptr [eax] ; xor dl with current character inc eax ; character shift cmp byte ptr [eax], 0 ; is we in the end of chain? jnz @b ; Get offset to ordinal mov eax, [esp] ; AddressOfNameOrdinals add dword ptr [esp], 2 ; Move to next ordinal word mov edi, offset _LoadLibrary ok_hash: cmp [edi], edx jnz @f ; Needed function found movzx eax, word ptr [eax] ; Name ordinal shl eax, 2 ; Multiply by 4 add eax, [esp + 4] add eax, ebx mov eax, [eax] add eax, ebx stosd jmp @endif @@: scasd ; Skip function hash @endif: cmp dword ptr [edi], 0 jnz ok_hash dec ecx jnz search_api_name add esp, 8 ret GetFunctions endp GetAPI proc invoke LoadLibrary,addr szKernel32 invoke GetFunctions push offset szUser32 call _LoadLibrary invoke GetFunctions ret GetAPI endp Main proc invoke GetAPI push MB_OK push 0 push 0 push 0 call _MessageBox invoke ExitProcess,0 Main endp end Main а если код перенести в dll и подгрузить с помошью LoadLibrary то похоже что dll некорректно завершает работу Код (Text): .386 .model flat,stdcall option casemap :none include windows.inc include kernel32.inc includelib user32.lib includelib kernel32.lib .data ; kernel32 _LoadLibrary dd 0A412FD89h ; _LoadLibrary должна быть в начале списка ; user32 _MessageBox dd 014D14C51h dd 0 ; в конце списка должен быть ноль szKernel32 db "kernel32",0 szUser32 db "user32",0 hInstance dd 0 .code GetFunctions proc ; eax должен содержать хендл библиотеки xchg eax, ebx mov edx, [ebx + 3ch] ; PE mov esi, [ebx + edx + 78h] ; Export Table RVA lea esi, [ebx + esi + 18h] ; Export Table VA+18h lodsd xchg eax, ecx ; NumberOfNames lodsd ; AddressOfFunctions push eax lodsd ; AddressOfNames add eax, ebx xchg eax, edx lodsd ; AddressOfNameOrdinals add eax, ebx push eax mov esi, edx search_api_name: lodsd add eax, ebx ; eax points to the name of function ; Calc function name hash xor edx, edx ; edx == 0, coz it'll contain hash @@: rol edx, 3 xor dl, byte ptr [eax] ; xor dl with current character inc eax ; character shift cmp byte ptr [eax], 0 ; is we in the end of chain? jnz @b ; Get offset to ordinal mov eax, [esp] ; AddressOfNameOrdinals add dword ptr [esp], 2 ; Move to next ordinal word mov edi, offset _LoadLibrary ok_hash: cmp [edi], edx jnz @f ; Needed function found movzx eax, word ptr [eax] ; Name ordinal shl eax, 2 ; Multiply by 4 add eax, [esp + 4] add eax, ebx mov eax, [eax] add eax, ebx stosd jmp @endif @@: scasd ; Skip function hash @endif: cmp dword ptr [edi], 0 jnz ok_hash dec ecx jnz search_api_name add esp, 8 ret GetFunctions endp GetAPI proc invoke LoadLibrary,addr szKernel32 invoke GetFunctions push offset szUser32 call _LoadLibrary invoke GetFunctions push 0 push offset szKernel32 push offset szUser32 push 0 call _MessageBox ret GetAPI endp DllMain proc hInst:HINSTANCE,reason:dword,reserved1:dword push hInst pop hInstance .if reason==DLL_PROCESS_ATTACH invoke GetAPI .endif mov eax,TRUE ret DllMain endp end DllMain dll подгружаю так Код (Text): .386 .model flat, stdcall option casemap :none include windows.inc include user32.inc include kernel32.inc includelib user32.lib includelib kernel32.lib .code libname db "zzzdll.dll",0 Main PROC invoke LoadLibrary, addr libname invoke MessageBox,0,0,0,MB_OK invoke ExitProcess, 0 Main endp end Main MessageBox в dll срабатывает а в ехе который ее подгружает уже не срабатывает. функция поиска api по хешу была переписана мной с фасма.
Нет ничего хорошего в том, чтобы вызывать MessageBox из DllMain -- это уже необнократно обсуждалось. RTFM.
censored, на MessageBox в dll я не жалуюсь, он появляется. к тому-же он расположен не в DllMain. про то что в DllMain желательно вызывать только функции kernel32 уже начитан. и даже если MessageBox не вызывать в dll, то все-равно он не появляется в ехе файле после того как вызвана dll. возможно я не правильно перевел функцию http://wasm.ru/forum/viewtopic.php?id=12329 с фасма в масм. если есть у кого время прошу проверить. сказать RTFM и google.com не сложно, но перед этим желательно бы дочитывать пост до конца.
куда мне до тебя. задирай нос, пока есть перед кем. спрашиваю про одно а ты пишешь про совсем другое. казалось бы серьезный человек, а по сути любитель срать в топах.
integer попробуй поставить int3 в дллмейн и загрузить ее в ольке - тогда и посмотришь, все ли находится
под отладчиком смотрел. все функции находятся и на мой взгляд все нормально отрабатывает. но при ret в GetAPI proc происходит сбой. в начале GetFunctions proc поставил pusha а в конце перед ret поставил popa и все заработало без ошибок. копаю дальше...
ну так и правильно функции, которые вызываются системой(в данном случае DllMain) не должны изменять значения регистов ebx, ebp, edi, esi.