Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > ZwTerminateProcess


Автор: bartram 18.3.2006, 23:06
Делаю хук на системную функцию ZwTerminateProcess
Есть длл:
Код

library Hook;
uses
  Windows, AdvApiHook, NativeAPI;

  var
  TrueZwTerminateProcess:Function (ProcessHandle:dword;
                            ExitStatus:dword):NTStatus;stdcall;
  //
  function NewZwTerminateProcess (ProcessHandle:dword;
                            ExitStatus:dword):NTStatus;stdcall;

  var
  pid: DWORD;
  MyHandle: DWORD;
  begin
  pid:=GetProcessId('Explorer.EXE'); //так для примера :)
  MyHandle:=OpenProcess(PROCESS_ALL_ACCESS, false,pid);
  if MyHandle = ProcessHandle
  then
 MessageBox(0, 'Нашёлся :)', 'Проверка', MB_ICONINFORMATION or MB_OK)
 else
 TrueZwTerminateProcess(ProcessHandle, ExitStatus);
end;

procedure LibraryProc (Reason : integer);
begin
  case Reason of
    DLL_PROCESS_ATTACH : //событие присоединения к процессу
      begin
         //ставим хук
       HookProc('ntdll.dll', 'ZwTerminateProcess', @NewZwTerminateProcess, @TrueZwTerminateProcess);
      end;

    DLL_PROCESS_DETACH :
//Отсоединение от процесса
// снимаем хук
    begin
     UnhookCode(@TrueZwTerminateProcess);
    end;
  end;
end;
begin
  DllProc := LibraryProc;
  DllProc (DLL_PROCESS_ATTACH);
end.

Почему то функция
Код

OpenProcess(PROCESS_ALL_ACCESS, false,pid);

Не возвращает Хендл процесса, и поэтому условие не выполняется smile не знаю почему! Помогите пожалуйста разобраться

Автор: bartram 20.3.2006, 15:25
Что разве ни кто не знает? smile

Автор: Romikgy 20.3.2006, 15:28
Мож привелегий мало?

Автор: bems 20.3.2006, 18:32
Разные вызовы OpenProcess возвращают разные хэндлы.
Добавлено @ 18:37
Можно получить путь к проге из которой вызвана процедура хука (ParamStr(0)), примести к какой-нить нормальной форнме (регистр нижний сделать например) и сравнивать с например 'c:\windows\explorer.exe'

Автор: bartram 20.3.2006, 20:26
Цитата(bems @ 20.3.2006, 18:32 Найти цитируемый пост)
Разные вызовы OpenProcess возвращают разные хэндлы.

Как это? smile


Цитата(bems @ 20.3.2006, 18:32 Найти цитируемый пост)
Можно получить путь к проге из которой вызвана процедура хука (ParamStr(0)), примести к какой-нить нормальной форнме (регистр нижний сделать например) и сравнивать с например 'c:\windows\explorer.exe'

Хм.... А это идея, как я сам не додумался smile , спасибо!

Автор: bems 20.3.2006, 20:59
Цитата(bartram @ 20.3.2006, 20:26 Найти цитируемый пост)
Как это?
А вот так. ИД у процесса один, а Хэндлов может быть дохрена. И каждый из них годен только внутри того процесса который вызвал OpenProcess
Добавлено @ 21:01
Цитата(bartram @ 20.3.2006, 20:26 Найти цитируемый пост)
спасибо!
Всегда пожалуйста!
Добавлено @ 21:06
Цитата(bartram @ 20.3.2006, 20:26 Найти цитируемый пост)
Хм.... А это идея, как я сам не додумался
И правильно! это я стормозил. Ща что-нить придумаю...

Автор: bartram 20.3.2006, 21:07
Цитата(bems @ 20.3.2006, 20:59 Найти цитируемый пост)
А вот так. ИД у процесса один, а Хэндлов может быть дохрена. И каждый из них годен только внутри того процесса который вызвал OpenProcess

Так а как же всё таки получить "нужный" мне?

Автор: bems 20.3.2006, 21:30
Цитата(bartram @ 20.3.2006, 21:07 Найти цитируемый пост)
Так а как же всё таки получить "нужный" мне?

Никак. Хэндл это твой личный ключик к объекту. У кого-то другого свой ключик к тому же объекту (в твоем случае процессу). Ключики не одинаковые.

Автор: bems 20.3.2006, 22:29
Код

type NTSTATUS=DWORD;
     PROCESS_BASIC_INFORMATION=record
                               ExitStatus:integer;
                               PebBaseAddress:pointer;
                               AffinityMask:DWORD;
                               BasePriority:integer;
                               UniqueProcessId:DWORD;
                               InheritedFromUniqueProcessId:DWORD;
                               end;
function NtQueryInformationProcess(handle:THandle;ZeroInYourCase:integer;
                                   var BaseInfo:PROCESS_BASIC_INFORMATION;BuffSize:DWORD;var Writensize:DWORD):NTSTATUS;
                                    stdcall;external 'ntdll.dll';

function ProcessHandleToID(handle:THANDLE):DWORD;
var len:dword;info:PROCESS_BASIC_INFORMATION;
begin
ZeroMemory(@info,SizeOf(info))
NtQueryInformationProcess(handle,0,info,sizeof(info),len);
result:=info.UniqueProcessId;
end;

Добавлено @ 22:31
Єта функция по хєндлу процесса находит его ИД. ИД уникален, его можно сравнивать.

Автор: bems 20.3.2006, 22:47
bartram, а у меня AdvApiHook че-то не компилится. Ругается на че-то в асме. Ты как это сделал?

Автор: bartram 21.3.2006, 10:13
bems, в каком месте ругается?
Кинь код

Автор: bems 21.3.2006, 14:50
Код

 Procedure Injector();
  asm
    pushad
    db $E8              // опкод call short 0
    dd 0                //
    pop eax             // eax - адрес текущей инструкции
    add eax, $12
    mov [eax], esi      // модифицируем операнд dd $00000000
    push [esi + $0C]    // кладем в стек имя DLL <-ТУТ БОЧИНА  advApiHook.pas(1407)  invalid combination of opcode and operands
    call [esi + $08]    // call LoadLibraryA  <-и тут тоже самое
    popad
    mov esi, [esi + $4] // восстанавливаем esi из старого контекста
    dw $25FF            // опкод Jmp dword ptr [00000000h]
    dd $00000000        // модифицируемый операнд
    ret
  end;

делфа пятая

Автор: bartram 21.3.2006, 18:09
Странно!
вот моя процедура, вроде такая же, но у меня всё работает, Делфи 7
Код

  Procedure Injector();
  asm
    pushad
    db $E8              // опкод call short 0
    dd 0                //
    pop eax             // eax - адрес текущей инструкции
    add eax, $12
    mov [eax], esi      // модифицируем операнд dd $00000000
    push [esi + $0C]    // кладем в стек имя DLL
    call [esi + $08]    // call LoadLibraryA
    popad
    mov esi, [esi + $4] // восстанавливаем esi из старого контекста
    dw $25FF            // опкод Jmp dword ptr [00000000h]
    dd $00000000        // модифицируемый операнд
    ret
  end;

Добавлено @ 18:15
Цитата(bems @ 21.3.2006, 14:50 Найти цитируемый пост)
делфа пятая

А ты что на 5-ой сидишь? Переходить пора на более новые smile

Автор: bartram 21.3.2006, 18:34
Я так думаю проблема в Версии Делфи, потому что Асм есть Асм smile У меня работает а у тебя нет, выводы соответствено smile

Автор: bartram 21.3.2006, 20:42
Цитата(bems @ 20.3.2006, 22:29 Найти цитируемый пост)
Єта функция по хєндлу процесса находит его ИД. ИД уникален, его можно сравнивать.

Функция не пашет smile

Цитата(bems @ 20.3.2006, 18:32 Найти цитируемый пост)
Можно получить путь к проге из которой вызвана процедура хука (ParamStr(0)), примести к какой-нить нормальной форнме (регистр нижний сделать например) и сравнивать с например 'c:\windows\explorer.exe'

В этом случае возвращается в качестве paramstr(0) путь к той проги КОТОРАЯ завершает, а не КОТОРУЮ завершают. В моём случае нужен 2 вариант, так что этот метод подходит smile

Автор: bems 22.3.2006, 15:43
Цитата(bartram @ 21.3.2006, 20:42 Найти цитируемый пост)
В этом случае возвращается в качестве paramstr(0) путь к той проги КОТОРАЯ завершает, а не КОТОРУЮ завершают. В моём случае нужен 2 вариант, так что этот метод подходит
ну да, конечно. Это я давно понял
Цитата(bems @ 20.3.2006, 20:59 Найти цитируемый пост)
Добавлено @ 21:06

Цитата(bartram @ 20.3.2006, 20:26 )
Хм.... А это идея, как я сам не додумался

И правильно! это я стормозил
Вобщем извини



Цитата(bartram @ 21.3.2006, 20:42 Найти цитируемый пост)
Функция не пашет
а вот это странно. у меня работала. Какая винда? Что возвращает функция?

Автор: bartram 22.3.2006, 20:47
bems, я вот тут набросал функцию на основк того кода что ты мне дал
Код

// функция сравнивает два процесса если Уникальные id совпадают то возвращает true
  function CompareProcesses(pid: dword): boolean;
  var
  MyHandle, ProcessHandle : Thandle;
  ProcMyUnPid, ProcUnPid : dword;
  begin
  MyHandle:=OpenProcess(PROCESS_ALL_ACCESS, false,GetCurrentProcessId);
  ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS, false,pid);
  ProcMyUnPid:=ProcessHandleToID(MyHandle);
  ProcUnPid:=ProcessHandleToID(ProcessHandle);
  if ProcMyUnPid = ProcUnPid
  then
  Result:=True
  else
  Result:=False;
  end;

Она почему то не пашет, хотя должна smile
Винда XP sp1

Автор: bems 22.3.2006, 20:57
Код

MyHandle:=OpenProcess(PROCESS_ALL_ACCESS, false,GetCurrentProcessId);
ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS, false,pid);
//хэндл по ПИД
ProcMyUnPid:=ProcessHandleToID(MyHandle);
ProcUnPid:=ProcessHandleToID(ProcessHandle);
//а теперь наоборот?

не понял я этих усложнений smile
сделай так
Код

MyHandle:=OpenProcess(PROCESS_ALL_ACCESS, false,GetCurrentProcessId);
ProcMyUnPid:=ProcessHandleToID(MyHandle);
if GetCurrentProcessID=ProcMyUnPid then MessageBox(0,'Так должно быть всегда','',0)
                                   else MessageBox(0,'Бемс! Бочина! Баран, блин!','',0);

Автор: Cashey 17.11.2006, 16:06
Цитата(bartram @  19.3.2006,  00:06 Найти цитируемый пост)
AdvApiHook, NativeAPI

А где взять эти модули?

Автор: BUGOR 17.11.2006, 19:20
http://www.wasm.ru/pub/21/files/advapihook.rar

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)