function EnableDebugPrivilege():Boolean;
var
hToken: dword;
SeDebugNameValue: Int64;
tkp: TOKEN_PRIVILEGES;
ReturnLength: dword;
begin
Result:=false;
//Добавляем привилегию SeDebugPrivilege
//Получаем токен нашего процесса
OpenProcessToken(INVALID_HANDLE_VALUE, TOKEN_ADJUST_PRIVILEGES
or TOKEN_QUERY, hToken);
//Получаем LUID привилегии
if not LookupPrivilegeValue(nil, 'SeDebugPrivilege', SeDebugNameValue) then
begin
CloseHandle(hToken);
exit;
end;
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Luid := SeDebugNameValue;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
//Добавляем привилегию к процессу
AdjustTokenPrivileges(hToken, false, tkp, SizeOf(TOKEN_PRIVILEGES),
tkp, ReturnLength);
if GetLastError() <> ERROR_SUCCESS then exit;
Result:=true;
end;
Function InjectDll(hwd: hWnd; ModulePath: PAnsiChar): boolean;
var
Memory:pointer;
Code: dword;
BytesWritten: dword;
ThreadId: dword;
hThread: dword;
hKernel32: dword;
prcID: cardinal;
prc: THandle;
Inject: packed record
PushCommand:byte;
PushArgument:DWORD;
CallCommand:WORD;
CallAddr:DWORD;
PushExitThread:byte;
ExitThreadArg:dword;
CallExitThread:word;
CallExitThreadAddr:DWord;
AddrLoadLibrary:pointer;
AddrExitThread:pointer;
LibraryName:array[0..MAX_PATH] of char;
end;
begin
Result := false;
if GetWindowThreadProcessID(Hwd, prcID) = 0 then
begin
MessageBox(0,'Не удалось получить ID процесса',0,0);
exit;
end;
prc := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_WRITE
or PROCESS_VM_OPERATION, false, prcID);
if prc = 0 then
begin
MessageBox(0,'Не удалось открыть процесс',0,0);
exit;
end;
Memory := VirtualAllocEx(Prc, nil, sizeof(Inject),
MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if Memory = nil then
begin
MessageBox(0,'Ошибка выделения памяти',0,0);
exit;
end;
Code := dword(Memory);
//инициализация внедряемого кода:
Inject.PushCommand := $68;
inject.PushArgument := code + $1E;
inject.CallCommand := $15FF;
inject.CallAddr := code + $16;
inject.PushExitThread := $68;
inject.ExitThreadArg := 0;
inject.CallExitThread := $15FF;
inject.CallExitThreadAddr := code + $1A;
hKernel32 := GetModuleHandle('kernel32.dll');
inject.AddrLoadLibrary := GetProcAddress(hKernel32, 'LoadLibraryA');
inject.AddrExitThread := GetProcAddress(hKernel32, 'ExitThread');
lstrcpyA(@inject.LibraryName, ModulePath);
//записать машинный код по зарезервированному адресу
if not WriteProcessMemory(Prc, Memory, @inject, sizeof(inject),
BytesWritten) then
begin
MessageBox(0,'Ошибка при записи',0,0);
exit;
end;
//выполнить машинный код
hThread := CreateRemoteThread(prc, nil, 0, Memory, nil, 0, ThreadId);
if hThread = 0 then
begin
MessageBox(0,'Ошибка при запуске потока',0,0);
exit;
end;
CloseHandle(hThread);
Result := True;
end;
...
// usage:
if not EnableDebugPrivilege then
begin
MessageBox(0,'Не получены привилегии дебаг',0,0);
exit;
end;
if not InjectDll(Handle,'SPAddDll.dll') then
begin
MessageBox(0,'Не удалось внедрить DLL',0,0);
exit;
end;