Results 1 to 2 of 2
  1. #1
    Dwar
    Dwar is offline
    Veteran Dwar's Avatar
    Join Date
    2010 Mar
    Posts
    2,222
    Thanks Thanks Given 
    211
    Thanks Thanks Received 
    2,230
    Thanked in
    292 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 Thanks Given 
    2
    Thanks Thanks Received 
    1
    Thanked in
    1 Post
    Rep Power
    0
    Попробывал сделать инжект длл к другому процессу, но дллка не присоединилась. Код идентичный, что здесь. Почему не получается? Win7 x64

Posting Permissions

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