Загрузка...

Author's article Writing a DLL Injector

Thread in C/C++ created by ZLOYSERGUNYA Mar 2, 2017. 12,224 views

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

    1. Для начала нужно подключить необходимые нам библиотеки:
    Code
    #include <Windows.h>
    #include <TlHelp32.h>
    #include <iostream>
    #include <io.h>
    2. Создаем главную функцию и пишем туда следующее:
    Code
    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:
    Code
    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. Опишем функцию проверки существования файла:
    Code
    bool FileExist(char* name)
    {
    return _access(name, 0) != -1;
    }
    5. Создаем bool метод. Он будет принимать id процесса, который мы будем инжектить и сам путь до dll:
    Code
    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;
    }
    Code
    #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. Ichivo
    Ichivo Mar 2, 2017 Banned 567 Sep 27, 2016
    Отлично, как раз учусь этой теме :)
     
  3. aindon1
    aindon1 Mar 2, 2017 86 Feb 11, 2017
    @ZLOYSERGUNYA эх давно с си++ не работал)
     
  4. ZLOYSERGUNYA
    ZLOYSERGUNYA Topic starter Mar 2, 2017 save what remains 787 Jan 4, 2017
    Никогда не поздно :D
     
  5. ZLOYSERGUNYA
    ZLOYSERGUNYA Topic starter Mar 2, 2017 save what remains 787 Jan 4, 2017
    чет завтывал, перенести никак?
     
  6. Razeee
    Razeee Mar 2, 2017 402 Aug 28, 2016
    Спасибо огромное, вовремя ты написал это. Мне щас как раз нужно будет.
     
  7. ZLOYSERGUNYA
    ZLOYSERGUNYA Topic starter Mar 2, 2017 save what remains 787 Jan 4, 2017
    Пиши, если помощь нужна)
     
  8. aindon1
    aindon1 Mar 2, 2017 86 Feb 11, 2017
    @ZLOYSERGUNYA текста минимум, думаю новичкам не понять
     
  9. ZLOYSERGUNYA
    ZLOYSERGUNYA Topic starter Mar 2, 2017 save what remains 787 Jan 4, 2017
    если нужно будет что-то кому-то объяснить, я объясню в комментах
     
  10. Crypt4oryou
    Crypt4oryou Mar 2, 2017 40 Jan 14, 2017
    ZLOYSERGUNYA,
    Тысяча чертей , мой мозг расплавлен.
     
  11. renameduser_70107
    ну объясни мне, для чего это вещ:3?
     
  12. kikoz_ll
    kikoz_ll Mar 2, 2017 11 Feb 19, 2017
    "Что же такое dll инъекция? - Это внедрение своего кода в пространство уже запущенного процесса."
     
  13. renameduser_70107
    Для чего это нужно?
     
  14. parafors
    parafors Mar 2, 2017 237 Jan 1, 2017
    Для кряка(одна из функций(догадываюсь))
     
  15. renameduser_70107
    Cпасибо)
     
  16. KirTimX
    KirTimX Mar 6, 2017 2 Feb 25, 2017
    инжектор закидывает куда-либо посторонние длл. чаще всего, на основе этого делаются читы. например, всеми известный Cheat Engine работает на таком алгоритме.
     
  17. Phytoo
    Phytoo Mar 6, 2017 Banned 37 Feb 6, 2017
    Годнота
     
  18. ISh0uldG0
    А что-то по типу "деинжектора" запилить возможно? Если да то как?
     
  19. Maximazzz
    Maximazzz Mar 24, 2017 3 Jan 24, 2017
    если интернал , то
    FreeLibraryAndExitThread(GetModuleHandle("dll.dll"),0);
    если экстернал , то можн открыть процесс , закрыть потоки библиотеки , затирать байты writeprocessmemory . (Мб есть способ полегче )
    А вообще скачай исходник зевса (Zbot) там много интересного по поводу манипуляций с виндой

    А по поводу инжекта , норм , но дефолт , хотяб разные методы из юзермода показал бы .
     
  20. Azrael_inactive_inactive
    Годная инфа, спасибо
     
Loading...
Top