Tin nhắn Windows vẫn có thể được sử dụng trong Windows Vista! Vấn đề ở chỗ là một công nghệ có tên là User Interface Privilege Isolation (UIPI) ngăn chặn các tiến trình có mức độ toàn vẹn thấp hơn (IL) từ việc gửi tin nhắn đến một proccess với một IL cao (ví dụ: dịch vụ windows có IL và user cao) ứng dụng chế độ có IL trung bình).
Tuy nhiên, điều này có thể bị bỏ qua và các ứng dụng IL trung bình có thể được phép gửi các quy trình IL cao.
Wikipedia says it best:
UIPI không phải là một ranh giới an ninh, và không nhằm mục đích để bảo vệ chống lại tất cả các cuộc tấn công vỡ. UI Accessibility Ứng dụng có thể bỏ qua UIPI bằng cách đặt giá trị "uiAccess" của chúng thành TRUE như một phần của tệp kê khai. Yêu cầu yêu cầu ứng dụng nằm trong thư mục Tệp chương trình hoặc Windows, như cũng như được ký bởi mã hợp lệ quyền ký, nhưng các yêu cầu này sẽ không nhất thiết phải dừng lại phần mềm độc hại khỏi việc tôn trọng chúng.
Thêm vào đó, một số tin nhắn được vẫn được phép thông qua, chẳng hạn như WM_KEYDOWN, cho phép thấp hơn quá trình IL lái xe đầu vào cho một dấu nhắc lệnh cao.
Cuối cùng, hàm ChangeWindowMessageFilter cho phép một vừa IL quá trình (tất cả không cao quá trình trừ Internet Explorer Protected Mode) để thay đổi các thông điệp rằng một quá trình IL cao có thể nhận từ IL thấp quá trình. hiệu quả này cho phép bỏ qua UIPI, trừ khi chạy từ Internet Explorer hoặc một trong các quy trình con của nó.
Ai đó ở tại Delphi-PRAXIS (liên kết bằng tiếng Đức. Sử dụng Google để dịch trang) đã giải quyết vấn đề này và đăng mã của họ bằng ChangeWindowMessageFilter. Tôi tin rằng vấn đề của họ là WM_COPYDATA sẽ không hoạt động trên Vista cho đến khi họ sửa đổi mã của họ để bỏ qua UIPI cho WM_COPYDATA.
Original Link (German)
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.
Những loại vấn đề làm Thông báo Windows gây ra? IOW, bạn đang cố gắng giải quyết vấn đề gì? – gabr
Bạn có thể sử dụng các tin nhắn cửa sổ trong dịch vụ Windows được Delphi viết. – gabr