Есть .dll которая отлично работает в XPSP2. Она загружается в эксплорер через HKEY_LOCAL_MACHINE\....\ShellServiceObjectDelayLoad. затем устанавливает хук( SetWindowsHookEx ) чтобы проникнуть в другие процессы. Попробовал протестить её под Vista и Explorer сразу упал, Дело в том что я тестил через жопу, а конкретней у кореша на VMWare стояла виста, а я через Radmin к ней конектился =). тоесть всё лагало и времени разбиратся небыло. Может вы подскажете изза чего она могла вылететь. Вот ветка кода которая исполняется в контексте Explorer-a Код (Text): GetRealAddr proc mov eax,[eax+2] mov eax,[eax] ret GetRealAddr endp ReloadDll proc unload:dword LOCAL mem:dword mov esi,m2 sub esi,m1 mov ecx,esi add ecx,4*8 invoke VirtualAlloc,0,ecx,MEM_COMMIT,PAGE_EXECUTE_READWRITE mov mem,eax add eax,4*8 push eax mov ecx,esi mov edi,eax mov esi,m1 cld @@: lodsb ; Копируем шелкод stosb ; dec ecx jnz @b mov edi,mem mov eax,ExitThread call GetRealAddr mov [edi],eax mov eax,Sleep call GetRealAddr mov [edi+4],eax mov eax,LoadLibrary call GetRealAddr mov [edi+8],eax mov eax,FreeLibrary call GetRealAddr mov [edi+12],eax invoke VirtualAlloc,0,100,MEM_COMMIT,PAGE_READWRITE mov [edi+20],eax invoke GetModuleFileName,hInstance,eax,100 mov eax,VirtualFree call GetRealAddr mov [edi+24],eax pop eax jmp eax m1: push hInstance call dword ptr[edi+12] ;FreeLibrary push 60000 ;One Minute call dword ptr[edi+4] ;Sleep push [edi+20] ;Dll String call dword ptr[edi+8] ;Load Library push MEM_RELEASE push 0 push [edi+20] ;Dll String push 0 call dword ptr[edi] ;ExitThread m2: ReloadDll endp NotifyThrd proc p1:dword LOCAL hKey:dword invoke Sleep,100 invoke SetWindowsHookEx,WH_SHELL,addr AddhWinProc,hInstance,0 ;Загружаемся во "все" процессы mov hHook,eax invoke RegCreateKeyEx,HKEY_CURRENT_USER,addr NotifyKey,0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS or KEY_NOTIFY,0,ADDR hKey,0 invoke RegDeleteValue,hKey,addr NotifyValue @@: invoke RegNotifyChangeKeyValue,hKey,FALSE,REG_NOTIFY_CHANGE_LAST_SET,0,FALSE ;ждём флага выгрузки xor eax,eax invoke RegQueryValueEx,hKey,addr NotifyValue,eax,eax,eax,eax ; Если создан флаг, выгружаемся test eax,eax jnz @b ;Инача продолжаем ждать invoke RegDeleteValue,hKey,addr NotifyValue ;Удаляем флаг invoke RegCloseKey,hKey invoke UnhookWindowsHookEx,hHook ; Выгружаемся invoke Sleep,200 invoke SendMessage,HWND_BROADCAST,WM_USER,0,0 invoke Sleep,500 call ReloadDll ;выгружаем длл из эксплорера NotifyThrd endp DllEntry proc uses esi edi hInst:HINSTANCE, reason:DWORD, reserved1:DWORD LOCAL MyHahd:dword LOCAL thrdID:dword invoke GetModuleHandle,0 mov MyHahd,eax cmp reason,DLL_PROCESS_ATTACH jne detach invoke GetModuleHandle,addr eXp ; Explorer.exe cmp MyHahd,eax jne @F push hInst pop hInstance invoke CreateThread,NULL,0,addr NotifyThrd,0,0,ADDR thrdID jmp exit @@: ;..... detach: ;..... exit: mov eax,TRUE ret DllEntry endp
интересно.. а если не через.. ж тогда што ? (ет понятно што хочиш всунуть и не вишла.. мож сначала так испитать)
Может в висте дллки которые подключаются с помошью ShellServiceObjectDelayLoad должны иметь какойто особый формат? Просто я уже попробовал прописать просто дллку которая ничего не делает кроме как выдаёт месадж бокс. ошибки небыло но Эксплорер повис. Но это же самая дллка( в висте ) нормальна выводит месадж бокс если её загрузить сторонней прогой( просто написать прогу которая делает LoadLibrary ). Кто то чтонибудь значет об этом? вот собсно код длл которая ничего не делает и изза которой подвисает эксплорер Код (Text): .686p .model flat,stdcall include windows.inc include kernel32.inc include user32.inc includelib kernel32.lib includelib user32.lib .code DllMain proc hInst:HINSTANCE, reason:DWORD, reserved1:DWORD LOCAL thid:dword cmp reason,DLL_PROCESS_ATTACH jne exit invoke MessageBox,0,0,0,MB_ICONASTERISK exit: ret DllMain endp end DllMain
Привет - ТУФЕД!!! Насколько я знаю DllMain должна возвратить в eax значение TRUE. Может здесь собака порылась?
Возвращает TRUE. Я уже думаю может стянуть с висты какуюнить дллку WebCheck.dll например. и посмотреть как у неё dllmain устроен.
2FED А правда MessageBox - штука коварная Попробуй лучше файл создавать или директорию (меньше кода), или ещё как нибудь проявить деятельность...
2FED Дык дело не в том чтобы использовать или нет MessageBox - если очень хочется используй на здоровье Только когда возникает странный глюк - первым делом проверяй, не MessageBox ли его устраивает (тем более проверка то элементарная), а потому уже подозревай причины типа ЗЫ: Это типа Лезвие Оккама называется )