Delphi Код:
procedure TForm1.Button2Click(Sender: TObject);
{тут ДЛЛ-инъекция}
var
//список ниже для выяснения PID процесса
ProcName:string;//имя процесса, так как его видит утилита ProcessExplorer
DllNamePAnsiChar:PAnsiChar;//используется точный путь либо известные системе места
tempS:string;
ProcPID:cardinal;//вроде можно и DWORD использовать
hSnapshoot:THandle;{хэндл это ИД. ИД(номер) снимка. все обьекты в системе имеют номер
индивидуальный(ИД или Хндл одно и тоже). занимает 4 байта. можно заменить на Cardinal}
ProcSnapshot:TProcessEntry32;//структура описывает один процесс. сюда записывается описание процесса из снимка для анализа
tempBOOL:boolean;
//список ниже для установки отладочных привелегий
hToken:THandle;//Хэндл токена безопасности.
szPrivilege: PChar;//название уровня безопасности. в системе уже существуют
//имена мы будем использовать szPrivilege:='SeDebugPrivilege'
luid: TLargeInteger;
NewState: TTokenPrivileges;
fEnable: Boolean;//включить или отключить режим отладки для нашего(этого) приложения
ReturnLength: DWord;
//прочие
hProc: THandle;//открывая процесс по его PID- получаем его хэндл
pMyMemAdr: pointer;//адрес памяти начиная с которого мы выделили место и чтото туда записали.
//это может быть исполняемый код который можно выполнить либо просто данные.
BytesWriten :cardinal;//результат работы функции- сколько байт получилось записать в чужой процесс в выденленную ранее память
pLoadLibAdr: pointer;//адрес с которого начинается функция LoadLibraryA внутри KERNEL32.DLL
hRemoteThread: THandle;//хэндл созданого удаленного потока
pRemoteThread: THandle;//пока не понимаю на что этот указатель
begin
{задаем имя процесса жертвы, так как его видит система. воспользуйтесь приложухой ProcessExplorer чтобы
с точностью до зоглавных букв выяснить имя это}
ProcName := 'calc1.exe';
{задаем путь к длл которую будем инжектить. вот проводник всегда первую букву заглавную пишет. хотя на самом деле
там строчная. нам надо точное имя. я не уверен что прям регистр тут важен но это может быть так для имени длл}
tempS:=ExtractFilePath(ParamStr(0)) + 'pi.dll';
{апи типа LoadLibraryA работают с анси строками, индекс А об этом и говорит кстатти. есть еще юникодные версии этих апи
с буквой W на конце типа LoadLibraryW}
DllNamePAnsiChar:=PAnsiChar(AnsiString(tempS));
ProcPID := 0;
{Ищем ProcessID (PID) интересующего нас процесса, для этого делается снимок
всех процессов в системе, он перебирается и сравнивается имя процесса с заданным
как тока путем перебора нашли нужный нам процесс (по имени) мы запомним его PID.
можно узнать PID в ручном режиме подглядя его в приложухе ProcessExplorer.
нельзя путать PID с Хэндлом процесса. PID это глобальный идентификатор процесса.
если рассматривать весь процесс как обьект- то PID его номер в системе.
а хэндл на процесс который выдается при открытии процесса через OpenProcess- это создается
дополнительный какойто обьект в системе с помощью которого возможно както взаимодействовать с процессом}
hSnapshoot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if hSnapshoot = INVALID_HANDLE_VALUE then memo1.Lines.add('не удалось получить список процессов');
if hSnapshoot <> INVALID_HANDLE_VALUE then
begin
try
ProcSnapshot.dwSize := SizeOf(ProcSnapshot);
tempBOOL := Process32First(hSnapshoot, ProcSnapshot);//получаем первый процесс в снимке
if tempBOOL = false then memo1.Lines.add('нет первого процесса в списке');
while tempBOOL do
begin
memo1.Lines.Add(ProcSnapshot.szExeFile + ' ' + inttostr(ProcSnapshot.th32ProcessID));
if (ProcSnapshot.szExeFile = ProcName) then ProcPID:=ProcSnapshot.th32ProcessID;
tempBOOL := Process32Next(hSnapshoot, ProcSnapshot);//получаем следующий процесс
if tempBOOL = false then memo1.Lines.add('функция получения следующего процесса вернула FALSE');
end;
finally
CloseHandle(hSnapshoot);//освобождаем хэндл снимка
end;
end;
memo1.Lines.add('нашли процесс ' + ProcName + ' запомнили его PID=' + inttostr(ProcPID));