WindowsメッセージはWindowsVistaでも引き続き使用できます。当面の問題は、ユーザーインターフェイス特権の分離(UIPI)と呼ばれるビスタのテクノロジが、整合性レベル(IL)の低いプロセスがILの高いプロセスにメッセージを送信できないようにすることです(たとえば、WindowsサービスのILとユーザーは高いです。モードアプリのILは中程度です)。
ただし、これはバイパスでき、中程度のILアプリはwmを高ILプロセスに送信できます。
ウィキペディアはそれを最もよく言います:
UIPIはセキュリティ境界ではなく、すべてのシャッター攻撃から保護することを目的とはしていません。UIアクセシビリティアプリケーションは、マニフェストファイルの一部として「uiAccess」値をTRUEに設定することにより、UIPIをバイパスできます。これには、アプリケーションがプログラムファイルまたはWindowsディレクトリにあり、有効なコード署名機関によって署名されている必要がありますが、これらの要件は必ずしもマルウェアがそれらを尊重することを妨げるものではありません。
さらに、WM_KEYDOWNなどの一部のメッセージは引き続き許可されます。これにより、下位ILプロセスが上位コマンドプロンプトへの入力を駆動できるようになります。
最後に、関数ChangeWindowMessageFilterを使用すると、中程度のILプロセス(Internet Explorer保護モードを除くすべての非昇格プロセス)が、高ILプロセスが低ILプロセスから受信できるメッセージを変更できます。
これにより、Internet Explorerまたはその子プロセスの1つから実行しない限り、UIPIを効果的にバイパスできます。
Delphi-PRAXIS(リンクはドイツ語です。Googleを使用してページを翻訳してください)の誰かがすでにこの問題に取り組み、ChangeWindowMessageFilterを使用してコードを投稿しています。彼らの問題は、WM_COPYDATAのUIPIをバイパスするようにコードを変更するまで、WM_COPYDATAがVistaで機能しないことだと思います。
オリジナルリンク(ドイツ語)
unit uMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, uallHook, uallProcess, uallUtil, uallKernel;
type
TfrmMain = class(TForm)
lbl1: TLabel;
tmrSearchCondor: TTimer;
mmo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure tmrSearchCondorTimer(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private-Deklarationen }
fCondorPID : DWord;
fInjected : Boolean;
fDontWork : Boolean;
procedure SearchCondor;
procedure InjectMyFunctions;
procedure UnloadMyFunctions;
function GetDebugPrivileges : Boolean;
procedure WriteText(s : string);
procedure WMNOTIFYCD(var Msg: TWMCopyData); message WM_COPYDATA;
public
{ Public-Deklarationen }
end;
var
frmMain: TfrmMain;
ChangeWindowMessageFilter: function (msg : Cardinal; dwFlag : Word) : BOOL; stdcall;
implementation
{$R *.dfm}
type Tmydata = packed record
datacount: integer;
ind: boolean;
end;
const cCondorApplication = 'notepad.exe';
cinjComFuntionsDLL = 'injComFunctions.dll';
var myData : TMydata;
procedure TfrmMain.WMNOTIFYCD(var Msg: TWMCopyData);
begin
if Msg.CopyDataStruct^.cbData = sizeof(TMydata) then
begin
CopyMemory(@myData,Msg.CopyDataStruct^.lpData,sizeof(TMyData));
WriteText(IntToStr(mydata.datacount))
end;
end;
procedure TfrmMain.WriteText(s : string);
begin
mmo1.Lines.Add(DateTimeToStr(now) + ':> ' + s);
end;
procedure TfrmMain.InjectMyFunctions;
begin
if not fInjected then begin
if InjectLibrary(fCondorPID, PChar(GetExeDirectory + cinjComFuntionsDLL)) then fInjected := True;
end;
end;
procedure TfrmMain.UnloadMyFunctions;
begin
if fInjected then begin
UnloadLibrary(fCondorPID, PChar(GetExeDirectory + cinjComFuntionsDLL));
fInjected := False;
end;
end;
procedure TfrmMain.SearchCondor;
begin
fCondorPID := FindProcess(cCondorApplication);
if fCondorPID <> 0 then begin
lbl1.Caption := 'Notepad is running!';
InjectMyFunctions;
end else begin
lbl1.Caption := 'Notepad isn''t running!';
end;
end;
procedure TfrmMain.FormDestroy(Sender: TObject);
begin
UnloadMyFunctions;
end;
function TfrmMain.GetDebugPrivileges : Boolean;
begin
Result := False;
if not SetDebugPrivilege(SE_PRIVILEGE_ENABLED) then begin
Application.MessageBox('No Debug rights!', 'Error', MB_OK);
end else begin
Result := True;
end;
end;
procedure TfrmMain.FormCreate(Sender: TObject);
begin
@ChangeWindowMessageFilter := GetProcAddress(LoadLibrary('user32.dll'), 'ChangeWindowMessageFilter');
ChangeWindowMessageFilter(WM_COPYDATA, 1);
fInjected := False;
fDontWork := not GetDebugPrivileges;
tmrSearchCondor.Enabled := not fDontWork;
end;
procedure TfrmMain.tmrSearchCondorTimer(Sender: TObject);
begin
tmrSearchCondor.Enabled := False;
SearchCondor;
tmrSearchCondor.Enabled := True;
end;
end.