Code:

unit Unit1;

{©Drkb v.3}

 

interface

 

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

 

type

TForm1 = class(TForm)

   Button1: TButton;

   procedure Button1Click(Sender: TObject);

end;

 

PTokenUser = ^TTokenUser;

TTokenUser = record

   User: array[0..0] of TSIDAndAttributes;

end;

 

procedure ConvertSidToStringSid(SID: PSID; var StringSid: LPSTR); stdcall;

   external advapi32 name 'ConvertSidToStringSidA';

 

var

Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

function GetCurrentUserSID: String;

var

TokenHandle: THandle;

TokenInformationClass: TTokenInformationClass;

TokenInformation: PTokenUser;

ReturnLength: DWORD;

StringSid: LPSTR;

begin

Result := '';

if OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, TokenHandle) then

try

   TokenInformationClass := TokenUser;

   GetTokenInformation(TokenHandle, TokenInformationClass, nil, 0, ReturnLength);

   if GetLastError = ERROR_INSUFFICIENT_BUFFER then

   begin

     TokenInformation := GetMemory(ReturnLength);

     if TokenInformation <> nil then

     try

       if GetTokenInformation(TokenHandle, TokenInformationClass,

         TokenInformation, ReturnLength, ReturnLength) then

       begin

         ConvertSidToStringSid(TokenInformation^.User[0].Sid, StringSid);

         Result := StringSid;

       end;

     finally

       FreeMemory(TokenInformation);

     end;

   end;

finally

   CloseHandle(TokenHandle);

end;

end;

 

 

procedure TForm1.Button1Click(Sender: TObject);

begin

ShowMessage(GetCurrentUserSID);

end;

 

end.

 
 

Пример использования:

Code:

procedure TForm1.Button1Click(Sender: TObject);

var

I: Integer;

PC: WORD;

begin

ListBox1.Clear;

ProcArr := TLpModuleInfoArray(ProcUtilz.GetAllProcessesInfo);

PC := 0;

for i := Low(ProcArr) to High(ProcArr) do

begin

  ListBox1.Items.Add('Process Name: '+ProcArr[i].ModuleName+' : Proccess ID '+IntToStr(ProcArr[i].ModulePID)+' :

Image Size: '+IntToStr( ProcArr[i].ModuleInfo.SizeOfImage));

  Inc(PC);

end;

ListBox1.Items.Add('Total process count: '+IntToStr(PC));

end;

 

procedure TForm1.Button2Click(Sender: TObject);

var

EC: Integer;

begin

EC := ProcUtilz.TerminateTask(ProcArr[ListBox1.ItemIndex].ModulePID);

if EC=0 then

MessageDlg('Task terminated successfully!',mtInformation,[mbOK],0)

else

MessageDlg('Unable to terminate task! GetLastError() returned: '+IntToStr(EC),mtWarning,[mbOK],0);

Button1Click(Sender);

end;

 

 

Code:

SetWindowText(FindWindow(nil,'Текущий заголовок'), 'Желаемый');

 

 

 

Автор trainer

 Представьте себе, глупый пользователь сидит как ни в чём небывало с умным видом уже в какой раз пытается составить документ в Microsoft Word'e, но вдруг окно начинает бешено скакать по экрану, в его заголовке выводятся непристойные сообщения, оно то сворачивается, то разворачивается, меняя постоянно свои размеры, а под конец совсем исчезает, унося в небытиё весь текст, который с таким трудом набил ламерюга... а если так себя в любой момент может повести любая программа... впечатления от этого останутся на долго!!!

 Для того, чтобы сделать что-нибудь над каким-либо окном нужно сначала получить его дескриптор, т.е. его положение в оперативной памяти. Для этого нужно использовать функцию FindWindow. Ей нужно указать всего два параметра: сначала класс искомого окна, затем его заголовок. Ну с заголовком проблем вообщем-то нет - его мы видим, но вот как определить класс... ведь он скрыт от глас пользователя. В действительности мы может указать только заголовок окна, а вместо класса ставим nil.

 

  

Code:

{....}

 

var

WindowName: Integer;

ProcessId: Integer;

ThreadId: Integer;

buf: PChar;

HandleWindow: Integer;

Write: Cardinal;

 

{....}

 

const

WindowTitle = 'a program name';

Address = $A662D6;

PokeValue = $4A;

NumberOfBytes = 2;

 

{....}

 

 

procedure TForm1.Button1Click(Sender: TObject);

begin

WindowName := FindWindow(nil, WindowTitle);

 

if WindowName = 0 then

begin

   MessageDlg('Program not running.', mtWarning, [mbOK], 0);

end;

 

ThreadId := GetWindowThreadProcessId(WindowName, @ProcessId);

HandleWindow := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);

 

GetMem(buf, 1);

buf^ := Chr(PokeValue);

WriteProcessMemory(HandleWindow, ptr(Address), buf, NumberOfBytes, Write);

FreeMem(buf);

CloseHandle(HandleWindow);

end;

 

 

 

А также исполнение своего кода в удаленном процессе через CreateRemote

 

Code:

////////////////////////////////////////////////////////////////////////////////

//

//  ****************************************************************************

//  * Project   : Inject/Eject Library Demo

//  * Unit Name : HookDLL

//  * Purpose   : Демонстрационный пример внедрения библиотеки через CreateRemoteThread

//  * Author    : Александр (Rouse_) Багель

//  * Version   : 1.00

//  ****************************************************************************

//  

 

Library HookDLL;

{©Drkb v.3}

 

uses

Windows,

Messages,

SysUtils;

 

procedure DLLEntryPoint(dwReason: DWORD);

begin

case dwReason of

   DLL_PROCESS_ATTACH:

   begin

     MessageBox(0, 'DLL_PROCESS_ATTACH', 'DLL_PROCESS_ATTACH', MB_OK);

     ExitThread(0);

   end;

end;

end;

 

begin

DLLProc := @DLLEntryPoint;

DLLEntryPoint(DLL_PROCESS_ATTACH);

end.

 

 

Code:

PostThreadMessage(AnotherProg_MainThreadID,WM_CLOSE,0,0);

PostMessage(AnotherProg_MainWindow,WM_CLOSE,0,0);

 

 

Это пример запуска консольных программ с передачей ей консольного ввода (как если бы он был введен с клавиатуры после запуска программы) и чтением консольного вывода. Таким способом можно запускать например стандартный виндовый ftp.exe (в невидимом окне) и тем самым отказаться от использования специализированных, зачастую глючных компонент.

 

WindowFromPoint

ChildWindowFromPoint

 

Автор ответа: rhf

 

Ниже приведён unit, который позволяет убить задачу в Windows NT.

 

Code:

 

function Kill_By_Pid(pid : longint) : integer;

где pid, это число, представляющее pid задачи

 

function EnumProcessWithPid(list : TStrings) : integer;

где список, это объект TStrings, который будет содержать имя задачи и pid в полях Object.

( list.Items[i] для имени, integer(list.Object[i]) для PID)

 

 

Code:

function TForm1.Find(s: string): hWnd;

var Wnd: hWnd;

buff: array[0..127] of Char;

begin

Find := 0;

Wnd := GetWindow(Handle, gw_HWndFirst);

while Wnd <> 0 do

   begin

     if (Wnd <> Application.Handle) and

       IsWindowVisible(Wnd) and

       (GetWindow(Wnd, gw_Owner) = 0) and

       (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) then

       begin

         GetWindowText(Wnd, buff, sizeof(buff));

         if pos(s, StrPas(buff)) > 0 then

           begin

             Find := Wnd;

             Break;

           end;

       end;

     Wnd := GetWindow(Wnd, gw_hWndNext);

   end;

end;