Results 1 to 2 of 2
  1. #1
    Dwar
    Dwar is offline
    Veteran Dwar's Avatar
    Join Date
    2010 Mar
    Posts
    2,221
    Thanks
    211
    Thanked 2,224 Times in 289 Posts
    Rep Power
    10

    [Delphi] Simple Dll Injection

    Simple Dll Injection, detailed explanation
    Простой метод внедрения DLL, детальное описание

    Language: Delphi / Pascal
    Level: Beginner
    Note: Статья для новичков с детальным разъяснением процесса внедрения динамических биб-лиотек.

    Обычно для внедрения динамических библиотек в адресное пространство процесса применяют три способа:
    • Внедрение в третьем кольце
      Кольца защиты — архитектура информационной безопасности и функциональной отказо-устойчивости, реализующая аппаратное разделение системного и пользовательского уровней привилегий. Структуру привилегий можно изобразить в виде нескольких концентрических кру-гов. В этом случае системный режим (режим супервизора или нулевое кольцо, т.н. "кольцо 0"), обеспечивающий максимальный доступ к ресурсам, является внутренним кругом, тогда как ре-жим пользователя с ограниченным доступом — внешним.
    • Внедрение с помощью реестра
    • С помощью удалённых потоков и глобальных ловушек (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;

    Note: Приведенные функции имеют общий характер, в них отсутствуют элементарные провер-ки на существование файлов и т.д.


    Детальное описание используемых функций

    1. OpenProcess(PROCESS_ALL_ACCESS, false, TargetId);


    2. VirtualAllocEx()


    3. WriteProcessMemory ();


    4. GetProcAddress(GetModuleHandle('KERNEL32.DLL'), PAnsiChar('LoadLibraryA'));


    5. CreateRemoteThread(Hdl, nil, 0, pThreadStart, ParamAddr, 0,hRemoteThread);


    6. WaitForSingleObject(hThread, INFINITE);


    7. Closehandle(hThread);

    Please, post your questions on forum, not by PM or mail

    I spend my time, so please pay a little bit of your time to keep world in equilibrium

  2. The Following User Says Thank You to Dwar For This Useful Post:


  3. #2
    Justt
    Justt is offline
    New member
    Join Date
    2011 Jul
    Posts
    10
    Thanks
    2
    Thanked 1 Time in 1 Post
    Rep Power
    0
    Попробывал сделать инжект длл к другому процессу, но дллка не присоединилась. Код идентичный, что здесь. Почему не получается? Win7 x64

Visitors found this page by searching for:

delphi inject dll

inject dll delphi

delphi dll injector

delphi dll injection

delphi dll инъекция

DLL INJECTOR DELPHI

DLL INJECT DELPHIdll injection delphidll injectordelphi dll injectdll injectioninjector dll delphidelphi внедрение dlldll инъекция delphidelphi инжект кода в процессinjectdll delphidelphi inject delphi dll injection simplesimple dll injectorинжектор делфипишем инжектор на delphidll injection delphi simpledelphi ChangePrivilegedelphi inject codeDELPHI injector

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •