C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Сокрытие процесса в WinXP / Процессы и потоки / Приложение

В прошлой статье "Снова о сокрытии процессов" мы рассмотрели один из способов сокрытия под Windows 98\Me и Windows NT\2000. Одним из недостатков прошлого сокрытия была невозможность сокрытия процесса от Windows XP и более старших ОС семейства Windows (например, Windows 2003 .NET Server). В данной статье я хочу рассказать вам о том, как все-таки реализовать такую возможность в драйвере InvisibleDrvNT. 

Для начала рассмотрим функцию NativeApiIdFromApiAddressNT. В прошлый раз она выглядела так: 

NativeApiIdFromApiAddress PROC USES ESI EDI EBX, pApiEntry : LPVOID
SUB EAX, EAX
DEC EAX ;
EAX -> -1 == ошибка

;
проверка сигнатуры
MOV ESI, pApiEntry
LODSB
CMP AL, 0B8h
JNZ @@exit
LODSD
LODSD
CMP EAX, 00424548Dh
JNZ @@exit
LODSW
CMP AX, 02ECDh
JNZ @@exit
LODSB
CMP AL, 0C2h
JNZ @@exit

;
захват индекса NT API
MOV EAX, pApiEntry
MOV EAX, [EAX + 1]
@@exit:
RET
NativeApiIdFromApiAddress ENDP


Эта процедура сначала сканирует точку входа NT API функции по ее адресу, а затем возвращает индекс, если сигнатура верна. Отсюда видно, что точка входа pApiEntry (сигнатура) должна выглядеть так: 

B8 XX XX XX XX  MOV EAX, XXXXXXXX
8D 54 24 04  LEA EDX, [ESP + 004h]
CD 2E  INT 02Eh
C2 YY YY  RET YYYY

Это справедливо для систем Windows NT\2000, но не для XP и 2003 .NET Server. Например, в Windows XP точка входа выглядит так: 

B8 XX XX XX XX  MOV EAX, XXXXXXXX
BA 00 03 FE 7F  MOV EDX, 7FFE0300
FF D2  CALL EDX
C2 YY YY  RET YYYY

Сравнивая две данные сигнатуры, замечаем, что первый байт у всех одинаковый (B8). Следовательно, для того чтобы удостовериться в подлинности искомой функции сравниваем только первый байт сигнатуры с B8h. Если совпадает, то возвращаем индекс NT API. Иначе возвращаем -1. Кстати, еще одним недостатком вышеописанной функции было то, что при неправильной сигнатуре возвращалось неопределенное значение вместо -1, что вызывало в худшем случае BSOD.

Реализуем рабочую функцию: 

; Возвращает -1 в случае ошибки
;
Иначе - Native API ID
;
Аргумент: pApiEntry - адрес точки входа процедуры NTDLL
NativeApiIdFromApiAddressNT PROC USES ESI EDI EBX, pApiEntry : LPVOID
;
проверка сигнатуры
MOV ESI, pApiEntry
LODSB
CMP AL, 0B8h
JNZ @@exit ;
сигнатура не верна => возвращаем -1 и выходим
;
захват индекса NT API
MOV EAX, pApiEntry
MOV EAX, [EAX + 1] ;
все нормально => возвращаем индекс
RET
@@exit:
SUB EAX, EAX
DEC EAX ;
EAX -> -1 == ошибка
RET
NativeApiIdFromApiAddressNT ENDP


И есть еще одно важное обстоятельство: скрывающаяся программа должна вызвать драйвер до запуска какого-либо process dumper'a.

Итак, вышеприведенная функция устраняет недостатки прошлой функции. Теперь можно скрываться и под XP.
К программе управления драйвером я решил приложить и исходник :). 

Драйвер и его исходник для сокрытия процесса под Windows NT\2000\XP (Assembler)
Программа управления драйвером(установка/удаление/запуск/остановка) с исходником (Visual C++ 6.0)