Загрузка...

Авторская статья Пишем DLL Injector

Тема в разделе C/C++ создана пользователем ZLOYSERGUNYA 2 мар 2017. 12 169 просмотров

Загрузка...
  1. ZLOYSERGUNYA
    ZLOYSERGUNYA Автор темы 2 мар 2017 save what remains 789 4 янв 2017
    Что же такое dll инъекция? - Это внедрение своего кода в пространство уже запущенного процесса.
    Писать будем на C++. Распишу кратко, если надо будет, то помогу в комментах.
    Рекомендую прочитать пару статей на MSDN, про то, как работают потоки C++, чтобы вы имели общее представление.

    1. Для начала нужно подключить необходимые нам библиотеки:
    Код
    #include <Windows.h>
    #include <TlHelp32.h>
    #include <iostream>
    #include <io.h>
    2. Создаем главную функцию и пишем туда следующее:
    Код
    int main()
    {
    char process_name[32];
    char dll_name[32];
    char path[256];
    printf("enter process name: ");
    scanf_s("%s", process_name);
    DWORD pID = GetProcessByName(process_name);
    printf("Waiting %s for start...\n", process_name);
    for (;; Sleep(50))
    {
    if (pID == 0)
    pID = GetProcessByName(process_name);
    if (pID != 0) break;
    }
    printf("%s found (pid = %X)!\n", process_name, pID);
    while (FileExist(path) == false)
    {
    printf("Enter DLL name: ");
    scanf_s("%s", dll_name);
    GetFullPathName(dll_name, sizeof(path), path, NULL);
    if (FileExist(path))
    {
    printf("DLL found!\n");
    break;
    }
    else
    printf("DLL not found!\n");
    }
    printf("Preparing DLL for injection...\n");
    if (Inject(pID, path))
    {
    printf("DLL successfully injected!\n");
    system("pause");
    }
    else
    {
    printf("CRITICAL ERROR! \nDestroying window...\n");
    Sleep(500);
    }
    }
    Тело программы готово.

    3. Создаем функцию, которая будет получать id процесса. Для этого будем использовать DWORD:
    Код
    DWORD GetProcessByName(char* process_name)
    {
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 process;
    DWORD proc_id = 0;
    if (Process32First(snapshot, &process))
    {
    while (Process32Next(snapshot, &process))
    {
    if (_stricmp(process.szExeFile, process_name) == 0)
    {
    proc_id = process.th32ProcessID;
    break;
    }
    }
    }
    CloseHandle(snapshot);
    return proc_id;
    }
    4. Опишем функцию проверки существования файла:
    Код
    bool FileExist(char* name)
    {
    return _access(name, 0) != -1;
    }
    5. Создаем bool метод. Он будет принимать id процесса, который мы будем инжектить и сам путь до dll:
    Код
    bool Inject(DWORD pID, char*path)
    {
    HANDLE proc_handle;
    LPVOID RemoteString;
    LPCVOID LoadLibAddy;
    if (pID == 0)
    return false;
    proc_handle = OpenProcess(PROCESS_ALL_ACCESS, false, pID);
    if (proc_handle == 0)
    return false;
    LoadLibAddy = GetProcAddress(GetModuleHandle("kernel32.dll")), "LoadLibraryA";
    RemoteString = VirtualAllocEx(proc_handle, NULL, strlen(path), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(proc_handle, RemoteString, path, strlen(path), NULL);
    CreateRemoteThread(proc_handle, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddy, RemoteString, NULL, NULL);
    CloseHandle(proc_handle);
    return true;
    }
    Код
    #include <Windows.h>
    #include <TlHelp32.h>
    #include <iostream>
    #include <io.h>

    DWORD GetProcessByName(char* process_name)
    {
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 process;
    DWORD proc_id = 0;
    if (Process32First(snapshot, &process))
    {
    while (Process32Next(snapshot, &process))
    {
    if (_stricmp(process.szExeFile, process_name) == 0)
    {
    proc_id = process.th32ProcessID;
    break;
    }
    }
    }
    CloseHandle(snapshot);
    return proc_id;
    }

    bool FileExist(char* name)
    {
    return _access(name, 0) != -1;
    }

    bool Inject(DWORD pID, char*path)
    {
    HANDLE proc_handle;
    LPVOID RemoteString;
    LPCVOID LoadLibAddy;
    if (pID == 0)
    return false;
    proc_handle = OpenProcess(PROCESS_ALL_ACCESS, false, pID);
    if (proc_handle == 0)
    return false;
    LoadLibAddy = GetProcAddress(GetModuleHandle("kernel32.dll")), "LoadLibraryA";
    RemoteString = VirtualAllocEx(proc_handle, NULL, strlen(path), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(proc_handle, RemoteString, path, strlen(path), NULL);
    CreateRemoteThread(proc_handle, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddy, RemoteString, NULL, NULL);
    CloseHandle(proc_handle);
    return true;
    }
    int main()
    {
    char process_name[32];
    char dll_name[32];
    char path[256];
    printf("enter process name: ");
    scanf_s("%s", process_name);
    DWORD pID = GetProcessByName(process_name);
    printf("Waiting %s for start...\n", process_name);
    for (;; Sleep(50))
    {
    if (pID == 0)
    pID = GetProcessByName(process_name);
    if (pID != 0) break;
    }
    printf("%s found (pid = %X)!\n", process_name, pID);
    while (FileExist(path) == false)
    {
    printf("Enter DLL name: ");
    scanf_s("%s", dll_name);
    GetFullPathName(dll_name, sizeof(path), path, NULL);
    if (FileExist(path))
    {
    printf("DLL found!\n");
    break;
    }
    else
    printf("DLL not found!\n");
    }
    printf("Preparing DLL for injection...\n");
    if (Inject(pID, path))
    {
    printf("DLL successfully injected!\n");
    system("pause");
    }
    else
    {
    printf("CRITICAL ERROR! \nDestroying window...\n");
    Sleep(500);
    }
    }


    #моястатья
     
    2 мар 2017 Изменено
  2. Ichivo
    Ichivo 2 мар 2017 Заблокирован(а) 567 27 сен 2016
    Отлично, как раз учусь этой теме :)
     
  3. aindon1
    aindon1 2 мар 2017 86 11 фев 2017
    @ZLOYSERGUNYA эх давно с си++ не работал)
     
  4. ZLOYSERGUNYA
    ZLOYSERGUNYA Автор темы 2 мар 2017 save what remains 789 4 янв 2017
    Никогда не поздно :D
     
    2 мар 2017 Изменено
  5. ZLOYSERGUNYA
    ZLOYSERGUNYA Автор темы 2 мар 2017 save what remains 789 4 янв 2017
    чет завтывал, перенести никак?
     
  6. Razeee
    Razeee 2 мар 2017 401 28 авг 2016
    Спасибо огромное, вовремя ты написал это. Мне щас как раз нужно будет.
     
  7. ZLOYSERGUNYA
    ZLOYSERGUNYA Автор темы 2 мар 2017 save what remains 789 4 янв 2017
    Пиши, если помощь нужна)
     
  8. aindon1
    aindon1 2 мар 2017 86 11 фев 2017
    @ZLOYSERGUNYA текста минимум, думаю новичкам не понять
     
  9. ZLOYSERGUNYA
    ZLOYSERGUNYA Автор темы 2 мар 2017 save what remains 789 4 янв 2017
    если нужно будет что-то кому-то объяснить, я объясню в комментах
     
  10. Crypt4oryou
    Crypt4oryou 2 мар 2017 40 14 янв 2017
    ZLOYSERGUNYA,
    Тысяча чертей , мой мозг расплавлен.
     
  11. Mr.OjieHb
    Mr.OjieHb 2 мар 2017 20 3 янв 2017
    ну объясни мне, для чего это вещ:3?
     
  12. kikoz_ll
    kikoz_ll 2 мар 2017 11 19 фев 2017
    "Что же такое dll инъекция? - Это внедрение своего кода в пространство уже запущенного процесса."
     
  13. Mr.OjieHb
    Mr.OjieHb 2 мар 2017 20 3 янв 2017
    Для чего это нужно?
     
  14. parafors
    parafors 2 мар 2017 237 1 янв 2017
    Для кряка(одна из функций(догадываюсь))
     
  15. Mr.OjieHb
    Mr.OjieHb 2 мар 2017 20 3 янв 2017
    Cпасибо)
     
  16. KirTimX
    KirTimX 6 мар 2017 2 25 фев 2017
    инжектор закидывает куда-либо посторонние длл. чаще всего, на основе этого делаются читы. например, всеми известный Cheat Engine работает на таком алгоритме.
     
  17. Phytoo
    Phytoo 6 мар 2017 Заблокирован(а) 37 6 фев 2017
    Годнота
     
  18. ISh0uldG0
    ISh0uldG0 11 мар 2017 0 6 мар 2017
    А что-то по типу "деинжектора" запилить возможно? Если да то как?
     
  19. Maximazzz
    Maximazzz 24 мар 2017 3 24 янв 2017
    если интернал , то
    FreeLibraryAndExitThread(GetModuleHandle("dll.dll"),0);
    если экстернал , то можн открыть процесс , закрыть потоки библиотеки , затирать байты writeprocessmemory . (Мб есть способ полегче )
    А вообще скачай исходник зевса (Zbot) там много интересного по поводу манипуляций с виндой

    А по поводу инжекта , норм , но дефолт , хотяб разные методы из юзермода показал бы .
     
    24 мар 2017 Изменено
  20. Azrael_inactive_inactive
    Azrael_inactive_inactive 26 мар 2017 Заблокирован(а) 17 7 мар 2017
    Годная инфа, спасибо
     
Top