1

LVM_GETITEMPOSITION を使用して、デスクトップ アイコンの位置を設定/取得しようとしています。位置の設定は期待どおりに機能しますが、それらを取得することはできません。

メッセージを送ったとき(DeskHandle, LVM_GETITEMPOSITION, 1, ppt); エクスプローラーがクラッシュします。これは明らかに、ppt が私のプロセスで有効なアドレスにすぎないためです。そのため、エクスプローラーのメモリ アドレス空間に dll を挿入する必要があります。

問題は返される位置が常に 0,0 であることです

dll :

library Project2_dll;

uses
  SysUtils,Classes,windows,messages,dialogs,commctrl;

{$R *.res}

procedure hookit; stdcall;
var ppt:tpoint;
    Desktop,DeskHandle : hwnd;
    DeskThread : cardinal;
begin
  Desktop := FindWindow('ProgMan', nil);
  Desktop := FindWindowEx(Desktop, 0, 'SHELLDLL_DefView', nil);
  DeskThread := GetWindowThreadProcessID(Desktop, nil);
  DeskHandle := FindWindowEx(Desktop, 0, 'SysListView32', nil);

  sendmessage(DeskHandle, LVM_GETITEMPOSITION, 1, Longint(@ppt) );
  showmessage(inttostr(ppt.X)+'  '+inttostr(ppt.Y));
end;

exports hookit;

begin

end.

EXE :

var
  lib : hwnd;
  prc: procedure; stdcall;

procedure TForm2.Button1Click(Sender: TObject);
var hListView : HWND;
    DeskThread : cardinal;
begin
  hListView := FindWindow('ProgMan', nil);
  hListView := FindWindowEx(hListView, 0, 'SHELLDLL_DefView', nil);
  DeskThread := GetWindowThreadProcessID(hListView, nil);

  lib:= LoadLibrary('Project2_dll.dll');
  prc := GetProcAddress(lib, 'hookit');

  HH := SetWindowsHookEx(WH_MOUSE,GetProcAddress(lib, 'getit'),lib,DeskThread);

  prc;
end;

ここSOで同様の質問をいくつか見ましたが、どれも役に立ちませんでした。

ps : これを Delphi XE、Windows 7 x64 で実行し、SysListView32 が常に progman (WorkerW ではない) の子であると仮定します。

どんな助けでも大歓迎です^_^

4

1 に答える 1

4

32 ビット DLL を 64 ビット プロセスに挿入することはできません。DLL を 64 ビット エクスプローラーに挿入するには、XE2 または XE3 を入手して 64 ビット DLL をビルドする必要があります。または、64 ビット Delphi にアクセスできない場合は、コードのこの部分を C++ で記述します。

たまたま、コードはとにかく注入しません。プロセスから SendMessage を呼び出すだけです。インジェクションには通常、CreateRemoteThread の呼び出しが含まれます。

実際、注射する必要はありません。VirtualAllocExエクスプローラ プロセスでメモリを割り当てるために使用できます。その後、そのアドレスを に渡すことができますSendMessage。そのメモリは他のプロセスにあるため、使用ReadProcessMemoryWriteProcessMemoryてアクセスする必要があります。ただし、これは 64 ビット プロセスから行う必要があります。

シェルは、エクスプローラー プロセスのメモリをハッキングすることなく、この情報を取得するための機能を提供していると思います。

于 2012-09-11T16:32:42.507 に答える