Как при загрузке хрюши поймать момент, когда появляется пустой фон, т. е. обои рабочего стола, без панели задач и иконок? Заметил, что программы из секции HKCU...RunOnce запускаются тогда, когда значки и панель задач уже появились.
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\my] "DLLName"="my.dll" Как удалить my.dll без перезагрузки коппьютера?
gale1238 Выделить память VirtualAlloc(..., PAGE_EXECUTE_READWRITE, ...), записать в нее шеллкод, который делает FreeLibrary, DeleteFile, ExitThread и выполнить. Winlogon\Notify вроде отменили для ХР+, если ничего не путаю. Вы там блокираторы чтоли пишите? А потом школники из окна прыгают, нехорошо...
Winlogon запускает функцию из DLL. Можно ли в эту функцию добавить код, который удалял бы ту же самую DLL? Я даже не знаю, что это такое. Меня интересует автоматическая установка оси.
Тогда зачем так сложно. Это делается манипуляциями со скриптами в дистре. В инете полно инфы и куча утилит.
Сценарии не всё могут. [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\my] "Asynchronous"=dword:00000000 "DLLName"="my.dll" "Impersonate"=dword:00000000 "StartShell"="SelfDelete" Код (Text): extern _imp__CloseHandle@4:dword extern _imp__CreateThread@24:dword extern _imp__DeleteFileA@4:dword extern _imp__ExitThread@4:dword extern _imp__FreeLibrary@4:dword extern _imp__GetEnvironmentVariableA@12:dword extern _imp__GetExitCodeThread@8:dword extern _imp__GetModuleHandleA@4:dword extern _imp__VirtualAlloc@16:dword .data? buffer db MAX_PATH dup(?) .const env db 'SystemRoot',0 file db '\system32\my.dll',0 .code DllEntry proc hInstance:DWORD,reason:DWORD,reserved1:DWORD ret DllEntry Endp SelfDelete proc mov ebx,offset buffer push MAX_PATH push ebx push offset env call _imp__GetEnvironmentVariableA@12 mov edi,ebx add edi,eax mov esi,offset file mov ecx,sizeof file rep movsb push PAGE_EXECUTE_READWRITE push MEM_COMMIT or MEM_RESERVE push eax push ecx call _imp__VirtualAlloc@16 mov edi,eax mov esi,@f mov ecx,@e sub ecx,esi rep movsb mov edi,eax push ecx push ecx push ecx push eax push ecx push ecx call _imp__CreateThread@24 push eax call _imp__CloseHandle@4 call edi @@: push ebx call _imp__GetModuleHandleA@4 push eax call _imp__FreeLibrary@4 push ebx call _imp__DeleteFileA@4 push STILL_ACTIVE call _imp__ExitThread@4 @e: SelfDelete endp End DllEntry Файл не удаляется, вход в систему блокируется. Значит, где-то в коде ошибка.
Код (Text): mov ebx,offset buffer push MAX_PATH push ebx push offset env call _imp__GetEnvironmentVariableA@12 вообще есть GetSystemDirectory Если нужен путь до своего модуля, то GetModuleFileName(Instance, ... Код (Text): .data? buffer db MAX_PATH dup(?) ... mov ebx,offset buffer ... push ebx call _imp__DeleteFileA@4 В это время модуль (в котором и содержится буфер с путем к файлу) уже выгружен, соответственно буфера этого уже нет. Нужно этот путь также скопировать в выделенную память.
Код (Text): extern _imp__CloseHandle@4:dword extern _imp__CreateThread@24:dword extern _imp__DeleteFileA@4:dword extern _imp__ExitThread@4:dword extern _imp__FreeLibrary@4:dword extern _imp__GetSystemDirectoryA@8:dword extern _imp__GetModuleHandleA@4:dword extern _imp__VirtualAlloc@16:dword .const file db '\my.dll',0 .code DllEntry proc hInstance:DWORD,reason:DWORD,reserved1:DWORD ret DllEntry Endp SelfDelete proc mov esi,@f mov ebx,@e sub ebx,esi push PAGE_EXECUTE_READWRITE push MEM_COMMIT or MEM_RESERVE push ebx push NULL call _imp__VirtualAlloc@16 mov edi,eax mov ecx,ebx rep movsb mov edi,eax push ecx push ecx push ecx push eax push ecx push ecx call _imp__CreateThread@24 push eax call _imp__CloseHandle@4 call edi @@: add edi,ebx mov ebx,edi push MAX_PATH push edi call _imp__GetSystemDirectoryA@8 add edi,eax mov esi,offset file mov ecx,sizeof file rep movsb push ebx call _imp__GetModuleHandleA@4 push eax call _imp__FreeLibrary@4 push ebx call _imp__DeleteFileA@4 push STILL_ACTIVE call _imp__ExitThread@4 @e: SelfDelete endp End DllEntry Ошибка в GetModuleHandle.
Код (Text): _STOSB MACRO Param: REQ MOV AL, Param STOSB ENDM _STOSW MACRO Param: REQ MOV AX, Param STOSW ENDM _STOSD MACRO Param: REQ MOV EAX, Param STOSD ENDM ImpAddr MACRO DestReg: REQ, ImpProcName: REQ MOV DestReg, OFFSET ImpProcName MOV DestReg, DWORD PTR [DestReg + 2] MOV DestReg, DWORD PTR [DestReg] ENDM DeleteSelf PROC PUSHAD invoke VirtualAlloc, NULL, 4096, MEM_COMMIT OR MEM_RESERVE , PAGE_EXECUTE_READWRITE TEST EAX, EAX JZ ds_exit MOV EDI, EAX invoke GetModuleFileName, ModuleInstance, EDI, MAX_PATH TEST EAX, EAX JZ ds_exit MOV EBX, EDI ADD EDI, MAX_PATH + 100 CLD _STOSB 068h ; PUSH _STOSD ModuleInstance ; hModule _STOSB 0B8h ; MOV EAX, ImpAddr EAX, FreeLibrary ; STOSD ; OFFSET kernel32:FreeLibrary _STOSW 0D0FFh ; CALL EAX _STOSW 0C085h ; TEST EAX, EAX _STOSW 0F075h ; JNZ -10 _STOSB 068h ; PUSH _STOSD EBX ; lpFileName _STOSB 0B8h ; MOV EAX, ImpAddr EAX, DeleteFile ; STOSD ; OFFSET kernel32:DeleteFileA _STOSW 0D0FFh ; CALL EAX _STOSW 006Ah ; PUSH 0 _STOSB 0B8h ; MOV EAX, ImpAddr EAX, ExitThread ; STOSD ; OFFSET kernel32:ExitThread _STOSW 0D0FFh ; CALL EAX _STOSB 0C3h ; RET ADD EBX, MAX_PATH + 100 invoke CreateThread, NULL, 0, EBX, NULL, NULL, NULL ds_exit: POPAD RET DeleteSelf ENDP В вашем случае наверно лучше использовать Код (Text): invoke MoveFileEx, ADDR FileName, NULL, MOVEFILE_DELAY_UNTIL_REBOOT Файл удалится автоматически при следующей загрузке ОС.
K10 Спасибо, ваш пример работает. Можно ли таким же способом реализовать самоудаление исполняемого файла?
Не получается удалить самого себя. Записал в память OpenProcess, TerminateProcess, DeleteFile, ExitThread. Запустил поток, получил сообщение об ошибке. Неужели инжект в сторонний процесс это единственный вменяемый способ?
K10 А потом юзерам приходится его удалять, да еще затылок чесать, когда нарвутся на бесконечную перезагрузку. Это я про один из свеженьких "Зверей". А батник зациклившийся до сих пор где-то торчит gale1238 Проще надо делать и тогда будет меньше "проклятий" в ваш адрес Лучше пусть "мусор" останется на диске, чем в реестре...