Delphi Код:
procedure TForm1.Button3Click(Sender: TObject);
var
ProcPID: Cardinal;
hProc: THandle;
hRemoteThread: THandle;
pRemoteThread: Cardinal;
begin
{пробуем запустить нужную нам функцию удаленным потоком внутри жертвы}
ProcPID := GetRemotePID('calc1.exe');
memo1.Lines.Add('PID=' + inttostr(cardinal(ProcPID)));
//вот мы какбы тут еще один хэндл делаем на жертву. хотя он открыт в кнопке2. ну пофиг. открыли закрыли. хуже не будет.
hProc := OpenProcess(PROCESS_ALL_ACCESS, false, ProcPID);
hRemoteThread := CreateRemoteThread(hProc, nil, 0, pAdrFunc2, nil, 0, pRemoteThread);
//если функция в чужом процессе отработала(Func2 мы тестим) то создастся лог файл c:\Log\Func2.txt
CloseHandle(hProc);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CloseHandle(g_DllHandle);
end;
function GetRemotePID(ProcName:string):Cardinal;
var
hSnapshoot: THandle;//дескриптор объекта- созданного снимка всех процессов.
ProcSnapshot:TProcessEntry32;//структура описывает один процесс. сюда записывается описание одного процесса из снимка для анализа
tempBOOL:Boolean;
begin
{Ищем ProcessID (PID) интересующего нас процесса, для этого делается снимок
всех процессов в системе, он перебирается и сравнивается имя процесса с заданным
как тока путем перебора нашли нужный нам процесс (по имени) мы запомним его PID.
входной аргумент функции с именем процесса чувствителен к регистру Calc1.exe или calc1.exe}
Result:=0;
hSnapshoot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if hSnapshoot = INVALID_HANDLE_VALUE then Exit;
if hSnapshoot <> INVALID_HANDLE_VALUE then
begin
try
ProcSnapshot.dwSize := SizeOf(ProcSnapshot);
tempBOOL := Process32First(hSnapshoot, ProcSnapshot);//получаем первый процесс в снимке
if tempBOOL = false then Exit;
while tempBOOL do
begin
if (ProcSnapshot.szExeFile = ProcName) then Result:=ProcSnapshot.th32ProcessID;
tempBOOL := Process32Next(hSnapshoot, ProcSnapshot);//получаем следующий процесс
end;
finally
CloseHandle(hSnapshoot);//я думаю что это выгружает обьект с указанным ИД
end;
end;
end;
function SetDebugPrivilege(boolOnOff:boolean):Boolean;
var
hToken:THandle;//Хэндл токена безопасности.
szPrivilege: PChar;//название уровня безопасности. в системе уже существуют
//имена мы будем использовать szPrivilege:='SeDebugPrivilege'
luid: TLargeInteger;
NewState: TTokenPrivileges;
ReturnLength: DWord;
begin
{Устанавливаем отладочные привилегии для своего(этого) процесса, т.к. без данных
привилегий код внедрения работать не будет}
szPrivilege:='SeDebugPrivilege';
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken);
LookupPrivilegeValue(nil, szPrivilege, luid);
NewState.PrivilegeCount := 1;
NewState.Privileges[0].Luid := luid;
if (boolOnOff) then
begin
NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
end
else
begin
NewState.Privileges[0].Attributes := 0;
end;
result:=AdjustTokenPrivileges(hToken, False, NewState, SizeOf(NewState), nil, ReturnLength);
CloseHandle(hToken);
end;
end.
Добавлено через 59 секунд
это было САР (control application)
теперь код ДЛЛ...