GetWindowThreadProcessId () Перехват IAT: как сравнить параметр "dwProcessID"? - PullRequest
0 голосов
/ 13 октября 2018

Я подключаю GetWindowThreadProcessId() с успехом, используя следующий код.

Теперь я хочу проверить, соответствует ли параметр dwProcessID идентификатору определенного процесса и вположительный случай не позволяет выполнить исходную функцию:

Result := OldGetWindowThreadProcessId(hWnd, dwProcessID);

Я пробовал это, но не сработало:

if dwProcessID = 12345 then exit;

Вот мой полный код:

library MyLIB;

uses
  Windows,
  ImageHlp;

{$R *.res}

type
  PGetWindowThreadProcessId = function(hWnd: THandle; dwProcessID: DWord)
    : DWord; stdcall;

var
  OldGetWindowThreadProcessId: PGetWindowThreadProcessId;

function HookGetWindowThreadProcessId(hWnd: THandle; dwProcessID: DWord)
  : DWord; stdcall;

begin
  try
    // Check if is some process
  except
    MessageBox(0, 'Error', 'HookGetWindowThreadProcessId Error', 0);
  end;
  Result := OldGetWindowThreadProcessId(hWnd, dwProcessID);
end;

procedure PatchIAT(strMod: PAnsichar; Alt, Neu: Pointer);
var
  pImportDir: pImage_Import_Descriptor;
  size: CardinaL;
  Base: CardinaL;
  pThunk: PDWORD;
begin
  Base := GetModuleHandle(nil);
  pImportDir := ImageDirectoryEntryToData(Pointer(Base), True,
    IMAGE_DIRECTORY_ENTRY_IMPORT, size);
  while pImportDir^.Name <> 0 Do
  begin
    If (lstrcmpiA(PAnsichar(pImportDir^.Name + Base), strMod) = 0) then
    begin
      pThunk := PDWORD(Base + pImportDir^.FirstThunk);
      While pThunk^ <> 0 Do
      begin
        if DWord(Alt) = pThunk^ Then
        begin
          pThunk^ := CardinaL(Neu);
        end;
        Inc(pThunk);
      end;
    end;
    Inc(pImportDir);
  end;
end;

procedure DllMain(reason: Integer);

begin
  case reason of
    DLL_PROCESS_ATTACH:
      begin
        OldGetWindowThreadProcessId := GetProcAddress(GetModuleHandle(user32),
          'GetWindowThreadProcessId');

        PatchIAT(user32, GetProcAddress(GetModuleHandle(user32),
          'GetWindowThreadProcessId'), @HookGetWindowThreadProcessId);

      end;
    DLL_PROCESS_DETACH:
      begin
      end;
  end;
end;

begin
  DllProc := @DllMain;
  DllProc(DLL_PROCESS_ATTACH);

end.

1 Ответ

0 голосов
/ 13 октября 2018

Ваш тип PGetWindowThreadProcessId и функция HookGetWindowThreadProcessId() оба объявляют параметр dwProcessID неправильно.Это выходной параметр, поэтому он должен быть объявлен либо var dwProcessID: DWord, либо dwProcessID: PDWord.

. Затем необходимо вызвать OldGetWindowThreadProcessId(), чтобы получить фактический PID, прежде чем вы сможете сравнить его счто-нибудь.Таким образом, ваше требование « в положительном случае предотвратить выполнение исходной функции » нереально, потому что вам необходимо выполнить исходную функцию, чтобы определить значение dwProcessID для сравнения с.

Попробуйте вместо этого:

type
  PGetWindowThreadProcessId = function(hWnd: THandle; var dwProcessID: DWord): DWord; stdcall;

...

function HookGetWindowThreadProcessId(hWnd: THandle; var dwProcessID: DWord): DWord; stdcall;
begin
  Result := OldGetWindowThreadProcessId(hWnd, dwProcessID);
  try
    if dwProcessID = ... then
      ...
  except
    MessageBox(0, 'Error', 'HookGetWindowThreadProcessId Error', 0);
  end;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...