Работа с чужими процессами
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. |
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
Пример использования:
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; |
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
Code: |
SetWindowText(FindWindow(nil,'Текущий заголовок'), 'Желаемый'); |
Автор trainer
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
Представьте себе, глупый пользователь сидит как ни в чём небывало с умным видом уже в какой раз пытается составить документ в Microsoft Word'e, но вдруг окно начинает бешено скакать по экрану, в его заголовке выводятся непристойные сообщения, оно то сворачивается, то разворачивается, меняя постоянно свои размеры, а под конец совсем исчезает, унося в небытиё весь текст, который с таким трудом набил ламерюга... а если так себя в любой момент может повести любая программа... впечатления от этого останутся на долго!!!
Для того, чтобы сделать что-нибудь над каким-либо окном нужно сначала получить его дескриптор, т.е. его положение в оперативной памяти. Для этого нужно использовать функцию FindWindow. Ей нужно указать всего два параметра: сначала класс искомого окна, затем его заголовок. Ну с заголовком проблем вообщем-то нет - его мы видим, но вот как определить класс... ведь он скрыт от глас пользователя. В действительности мы может указать только заголовок окна, а вместо класса ставим nil.
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
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; |
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
А также исполнение своего кода в удаленном процессе через 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. |
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
Code: |
PostThreadMessage(AnotherProg_MainThreadID,WM_CLOSE,0,0); PostMessage(AnotherProg_MainWindow,WM_CLOSE,0,0); |
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
Это пример запуска консольных программ с передачей ей консольного ввода (как если бы он был введен с клавиатуры после запуска программы) и чтением консольного вывода. Таким способом можно запускать например стандартный виндовый ftp.exe (в невидимом окне) и тем самым отказаться от использования специализированных, зачастую глючных компонент.
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
WindowFromPoint
ChildWindowFromPoint
Автор ответа: rhf
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
Ниже приведён 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) |
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
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; |
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
Страница 1 из 4