2

レジストリをチェックしてアプリケーションがインストールされているかどうかを判断するコクラスがありますが、これは不十分であり、アプリケーションの新しいバージョンが見つかりません。競合するアプリケーションがインストールされている場合は、そのアプリケーションを開こうとします。競合するアプリケーションがアンインストールされている場合、プログラムはクラッシュします。このコクラスはDLLファイルで定義されています。ライブラリのソースコードがないため、変更することはできません。関数を機能する関数に置き換えるためにフックを使用することを検討してきましたが、SetWindowsHookExの使用に関するMSDNドキュメントを見ると複雑に見えます。誰かがSetWindowsHookExまたはWindowsにフックする別の方法を使用する方法の例を提供できますか?

ありがとうございました

編集:私はそれが私のために働いたので私がした答えを受け入れたことに注意したいと思います。質問された時点では他の答えは使えませんでしたが、同じように良さそうです。

4

3 に答える 3

6

これは、最も基本的なフック手法を示す、私自身のコードベースからの短い例です。

unit MethodHooker;

interface

implementation

uses
  SysUtils, Windows, Classes;

procedure Patch(Address: Pointer; const NewCode; Size: Integer);
var
  NumberOfBytes: DWORD;
begin
  WriteProcessMemory(GetCurrentProcess, Address, @NewCode, Size, NumberOfBytes);
end;

type
  PInstruction = ^TInstruction;
  TInstruction = packed record
    Opcode: Byte;
    Offset: Integer;
  end;

procedure Redirect(OldAddress, NewAddress: Pointer);
var
  NewCode: TInstruction;
begin
  NewCode.Opcode := $E9;//jump relative
  NewCode.Offset := Integer(NewAddress)-Integer(OldAddress)-SizeOf(NewCode);
  Patch(OldAddress, NewCode, SizeOf(NewCode));
end;

function GetCursorPos(var lpPoint: TPoint): BOOL; stdcall;
(* The GetCursorPos API in user32 fails if it is passed a memory address >2GB which
   breaks LARGEADDRESSAWARE apps.  We counter this by calling GetCursorInfo instead
   which does not suffer from the same problem. *)
var
  CursorInfo: TCursorInfo;
begin
  CursorInfo.cbSize := SizeOf(CursorInfo);
  Result := GetCursorInfo(CursorInfo);
  if Result then begin
    lpPoint := CursorInfo.ptScreenPos;
  end else begin
    lpPoint := Point(0, 0);
  end;
end;

initialization
  if not ModuleIsPackage then begin
    if not CheckWin32Version(6, 1) then begin
      //this bug was fixed in Windows 7
      Redirect(@Windows.GetCursorPos, @MethodHooker.GetCursorPos);
    end;

end.
于 2011-03-17T19:06:55.340 に答える
5

非常に優れた迂回/フッキングユニットの場合(ジャンプをチェックして新しいオフセットを適用できます!)KOLdetours.pasをお勧めします

AsmProfilerなど、多くのプロジェクトでこれを使用しています。

ところで:迂回すると「トランポリン」が得られるので、元の関数も呼び出すことができます!

于 2011-03-17T19:16:33.363 に答える
4

私はkoldetoursのauhtorです。ライセンスはすべて無料です。つまり、商用プログラムでも好きなように使用できます。基本的に、これは実際のオープンソースであり、ライセンスによって機能が損なわれることはありません。それが派生したコードと同じように。ヘッダーにそのように明記されています。

于 2012-01-18T11:23:23.943 に答える