Итак, после большого отступления от инъекций своего кода в чужую программу, я попробую продолжить цикл статей об этом, а именно как внедрить свою DLL в чужую программу. Основной плюс данного метода заключается в том, что не нужно думать о адресах. А тем самым, возможности нашего кода безгранично расширяются. Да и в принципе такой метод можно реализовать проще. Ну а основной минус, это лишь то, что придется таскать свою DLL за собой.

injection Dll injection

Надеюсь все знают, что библиотека kernel32 грузится в каждый процесс по одному и тому же адресу, а это значит что все ее функции также имеют одинаковые адреса во всех процессах. И там есть замечательная функция — LoadLibrary. Она загружает библиотеку и запускает ее в точке входа DllMain.

Она принимает единственный параметр — имя библиотеки для загрузки. Ну это мы с легкостью можем записать в процесс. А затем просто запустим функцию LoadLibrary передав в качестве параметра адрес на записанное имя. Вот и вся хитрость. Точнее ее попросту нет. Итак, наш алгоритм:

  1. Записать имя библиотеки в чужой процесс
  2. Получить адрес функции LoadLibrary
  3. Вызвать на исполнение функцию LoadLibrary в чужом процессе

Уложится можно в три шага. Для начала приведу исходный код внедряемой библиотеки:

#include 

int WINAPI DllMain(HANDLE hDllHandle, 
                                   DWORD dwReason, 
                                   LPVOID lpReserved)
{
        MessageBoxA(0,"I say \"bugaga\" and go to home...","bugaga",MB_ICONINFORMATION);
        return 0;
}

Итак, с внедряемым разобрались, а вот и сам инжектор:

#include 
#include 

typedef HMODULE (WINAPI *LLA)(LPCSTR);

int main()
{
        DWORD pid,dw,tid;
        char dll[80] = {0};
        printf("Enter pid for inject: ");
        scanf("%u",&pid);
        printf("Enter dll name for inject: ");
        scanf("%s",dll);

        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,false,pid);

        LPVOID pString = VirtualAllocEx(hProcess,NULL,strlen(dll),MEM_COMMIT,PAGE_READWRITE);

        WriteProcessMemory(hProcess,pString,(LPVOID)dll,strlen(dll),&dw);

        HMODULE hKern = GetModuleHandle("kernel32.dll");
        LLA proc = (LLA)GetProcAddress(hKern,"LoadLibraryA");

        CreateRemoteThread(hProcess,NULL,NULL,(unsigned long (__stdcall *)(void *))proc,pString,NULL,&tid);

        CloseHandle(hProcess);

        return 0;
}

Здесь мы спрашиваем PID процесса и имя библиотеки для внедрения. Да, DLL должна лежать рядом с программой, в которую производится внедрение, либо в путях поиска. Затем открываем процесс, выделяем там область памяти, записываем имя библиотеки, затем получаем адрес LoadLibrary и создаем поток в чужой программе, исполняющий код LoadLibrary(имя dll). Всеicon idea Dll injection

tt twitter big4 Dll injection tt digg big4 Dll injection tt facebook big4 Dll injection tt gmail big4 Dll injection tt myspace big4 Dll injection tt reddit big4 Dll injection

Комментарии (2) на “Dll injection”

  • pilulkin:

    А зачем писать в процесс имя? Ведь можно назвать dll скажем «32.dll». И передать указатель на «kernel[сюда]32.dll».

    Ответить
    • Panterr63:

      В теории это возможно. Кстати, спасибо за идею :smile:. Попробую так сделать. Но здесь нужен следущий алгоритм: найти kernel32.dll в памяти чужого процесса, а затем как раз полученный адрес и передать. Найти этот адрес можно например в таблице импортов программы (при условии ее наличия). Но так будет не очень универсально. Ибо таблицы импорта может и не быть (такое я встречал). Плюсы: мы обходимся только CreateRemoteThread.

      Ответить

Оставить комментарий

CAPTCHA изображение
Обновить изображение
*

RSS-подписка NIG Twitter-подписка NIG

Метки
Друзья
Блог линуксоида Программы для диагностики компьютера
Супер Pixel
Убивалка флешаБэкконект шелл. Часть вторая.Бэкконект шелл. Начало.НАМ для деления чиселПростая арифметикаПередача файлов. Часть третья. Клиент.Dll injectionСканер портовКодировка текста в BMPРухнул на два дняПередача файлов. Часть вторая. Сервер.Поворот и BMPCRC32 суммаBMP форматфайловые вирусыассемблер, строкиАссемблер и матрицапримеры ассемблерМногопоточное программированиеАрхитектура клиент — серверРаздача ICQПишем шуткупишем паукаПривет от ДжеймсаОбход firewallЗагрузка картинок на Gyazo, прямо из ThunarКейлоггер 3Плюшки в контекстном меню Thunarc по сетиКейлоггер 2КейлоггерСкачать Ассемблер!VirusCheckerОтморозки мешают жить ?! Не проблемма !Cкрипты для взлома аккаунтов QIPWinAPI. Работа с файлами. Часть третья. ЧтениеDlink exploitБрут сайта etxt.ruКрасивая раскладка клавиатуры в GnomeМои безделушки на PerlКак запускать Perl скрипты под WindowsБрутфорс партнёрки ZipCoinПарсер upwap.ruИзменения в блогеЧудо ЗаливалкаСкрипт для загрузки файлов на Zalil.ruЯндекс «чоткий» поисковик!WinAPI. Работа с файлами. Часть вторая. ЗаписьWinAPI. Работа с файлами. Часть первая. ПоискПолучение MD5 хеша средствами C++Что нам стоить letitfile.com забрутить?WarCraft III запуск под LinuxЭнтропия файлаWinsock и C++. Мини прокси. Часть |\\/. Завершающая.Перепилил чекер для 4gameЧекер акаунтов YoupornCMailSend v 1.1. Отправка почы без проблемСлучайные числаWinsock и C++. Часть |||. smtp монстр.Брутфорс LetitFile.comИспользование X-Forwarded-For, для обмана веб-сервера, подмена IP подручными средствамиДело было вечером, делать было нечего…Мысли о аудио сервереПарсер ников из твиттераКонец школоло…Perl+Linux. Заметка первая (Удобный Paste bin).Бэкконект шелл.E-MAIL + winsocket + Cpp. Сложно?winsock и C++. Часть ||. Атака клоунов.C++ резолвинг адресаPerl, анализ HTML кода и определение CMSМатематика в C++winsock и C++