Вот пример простенького внедрения своей дллки в доверенный процесс !
Обычно для внедрения динамических библиотек в адресное пространство процесса применяют три способа:
1)Внедрение в третьем кольце:
2)Внедрение с помощью реестра
3)С помощью удалённых потоков и глобальных ловушек (hooks).
Рассмотрим внедрение DLL с помощью удаленных потоков, являющимся гибким и сравнительно простым способом.
Суть данного способа заключается в создании потока загружающего необходимую библиотеку в адресное пространство выбранного процесса. При этом на момент внедрения DLL, целевой процесс должен функционировать в системе и должен быть открыт с правами на создание удаленных потоков и записи в собственное адресное пространство.
Сразу приступим к разбору кода.
Код будет на Делфи:
Функция осуществляющая внедрение библиотеки:
Функция получения идентификатора процесса по указанному имени исполняемого файла:
Функция установки отладочных привилегий:
Процедура непосредственного внедрения библиотеки:
Эта процедура основная, остальные вспомагательные....
Обычно для внедрения динамических библиотек в адресное пространство процесса применяют три способа:
1)Внедрение в третьем кольце:
Кольца защиты — архитектура информационной безопасности и функциональной отказо-устойчивости, реализующая аппаратное разделение системного и пользовательского уровней привилегий. Структуру привилегий можно изобразить в виде нескольких концентрических кру-гов. В этом случае системный режим (режим супервизора или нулевое кольцо, т.н. "кольцо 0"), обеспечивающий максимальный доступ к ресурсам, является внутренним кругом, тогда как ре-жим пользователя с ограниченным доступом — внешним.
2)Внедрение с помощью реестра
3)С помощью удалённых потоков и глобальных ловушек (hooks).
Рассмотрим внедрение DLL с помощью удаленных потоков, являющимся гибким и сравнительно простым способом.
Суть данного способа заключается в создании потока загружающего необходимую библиотеку в адресное пространство выбранного процесса. При этом на момент внедрения DLL, целевой процесс должен функционировать в системе и должен быть открыт с правами на создание удаленных потоков и записи в собственное адресное пространство.
Сразу приступим к разбору кода.
Код будет на Делфи:
Функция осуществляющая внедрение библиотеки:
Код:
procedure InjectDll(TargetId: Cardinal; DllName: PAnsichar);
var
BytesWrite :cardinal;
ParamAddr : pointer;
pThreadStart : pointer;
Hdl : cardinal;
hThread : cardinal;
hRemoteThread : Cardinal;
begin
// Устанавливаем отладочные привилегии для выбранного процесса, т.к. без данных
// привилегий код внедрения работать не будет
ChangePrivilege('SeDebugPrivilege', True);
// Открываем существующий объект процесса
Hdl := OpenProcess(PROCESS_ALL_ACCESS, false, TargetId);
// Выделяем память под структуру, которая передается нашей функции, под параметры, которые передаются функции
ParamAddr := VirtualAllocEx(Hdl, nil, Length(DllName), MEM_COMMIT or MEM_RESERVE,PAGE_EXECUTE_READWRITE);
// Пишем саму структуру
WriteProcessMemory(Hdl, ParamAddr, PAnsichar(DllName), Length(DllName), BytesWrite);
pThreadStart := GetProcAddress(GetModuleHandle('KERNEL32.DLL'), PAnsiChar('LoadLibraryA'));
// Запускаем удаленный поток
hThread := CreateRemoteThread(Hdl, nil, 0, pThreadStart, ParamAddr, 0,hRemoteThread);
// Ждем пока удаленный поток отработает...
WaitForSingleObject(hThread, INFINITE);
Closehandle(hThread);
end;
Функция получения идентификатора процесса по указанному имени исполняемого файла:
Код:
function GetProcessID(ProcessName : string ) : DWORD ;
var
Handle :tHandle;
Process :tProcessEntry32;
GotProcess :Boolean;
begin
Handle:=CreateToolHelp32SnapShot(TH32CS_SNAPALL,0) ;
Process.dwSize:=SizeOf(Process);
GotProcess := Process32First(Handle,Process);
if GotProcess and (Process.szExeFile<>ProcessName) then
repeat
GotProcess := Process32Next(Handle,Process);
until (not GotProcess) or (Process.szExeFile=ProcessName);
if GotProcess then Result := Process.th32ProcessID
else Result := 0;
CloseHandle(Handle);
end;
Функция установки отладочных привилегий:
Код:
procedure ChangePrivilege(szPrivilege: PChar; fEnable: Boolean);
var
NewState: TTokenPrivileges;
luid: TLargeInteger;
hToken: THandle;
ReturnLength: DWord;
begin
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken);
LookupPrivilegeValue(nil, szPrivilege, luid);
NewState.PrivilegeCount := 1;
NewState.Privileges[0].Luid := luid;
if (fEnable) then
NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
NewState.Privileges[0].Attributes := 0;
AdjustTokenPrivileges(hToken, False, NewState, SizeOf(NewState), nil, Re-turnLength);
CloseHandle(hToken);
end;
Процедура непосредственного внедрения библиотеки:
Код:
procedure Inject;
var
pID: cardinal;
Begin
// определяем ProcessId по указанному имени исполняемого файла
pID := GetProcessID('Game.exe');
// вызываем функцию внедрения библиотеки dllToInject.dll в процесс с pID
InjectDll(pID,'dllToInject.dll');
end;
Эта процедура основная, остальные вспомагательные....