Можно ли написать простой dll инжектор и заранее впихнуть инжектируемый файл в сам инжектор?

BigBon

Новичок
Автор темы
23
12
Нашёл код для простого инжектора. Планирую использовать для сампа

код инжектора:
#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;
    LPVOID LoadLibAddy;
    if (pID == 0)
        return false;
    proc_handle = OpenProcess(PROCESS_ALL_ACCESS, false, pID);
    if (proc_handle == 0)
        return false;
    LoadLibAddy = (LPVOID)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 succesfuly injected!\n");
        system("PAUSE");
    }
    else
    {
        printf("CRITICAL ERROR!\nDestroying window...\n");
        Sleep(500);
    }
}


Будет ли он работать в САМПЕ с .asi файлами? И смогу ли я скомпилировать всё вместе в .exe, чтобы на выходе и файл, и инжектор были в одной программе?
 

#Rin

Известный
Всефорумный модератор
1,214
1,036
Будет ли он работать в САМПЕ с .asi файлами?
ASI Loader загружает библиотеки автоматически, библиотеки могут рассчитывать что некоторый код нужно исполнить до того как игра полностью загрузится. Если твой инжектор загрузить некоторые библиотеки после того как игра полностью запустилась, то что-то может пойти не так.

И смогу ли я скомпилировать всё вместе в .exe, чтобы на выходе и файл, и инжектор были в одной программе?
Можно, динамичную библиотеку нужно будет поместить в ресурсы исполняемого файла или записать как массив байтов в коде. Если планируешь загружать библиотеку через стандартный функционал WinAPI, библиотеку потребуется в любом случае сохранить в виде файла, можно во временную папку. Если хочешь загружать без предварительного сохранения библиотеки в виде файла, потребуется загрузить ее особым способом, например через MemoryModule, но может потребоваться чтобы твоя библиотека была написана с учётом этого.
 

BigBon

Новичок
Автор темы
23
12
ASI Loader загружает библиотеки автоматически, библиотеки могут рассчитывать что некоторый код нужно исполнить до того как игра полностью загрузится. Если твой инжектор загрузить некоторые библиотеки после того как игра полностью запустилась, то что-то может пойти не так.


Можно, динамичную библиотеку нужно будет поместить в ресурсы исполняемого файла или записать как массив байтов в коде. Если планируешь загружать библиотеку через стандартный функционал WinAPI, библиотеку потребуется в любом случае сохранить в виде файла, можно во временную папку. Если хочешь загружать без предварительного сохранения библиотеки в виде файла, потребуется загрузить ее особым способом, например через MemoryModule, но может потребоваться чтобы твоя библиотека была написана с учётом этого.
А можно немного по подробнее, что мне нужно будет сделать с моей динамичной библиотекой .asi перед началом компиляции всего? Немного не понял про "предварительное сохранение в виде файла". Записывать как массив байтов в коде не очень хочется), а вот идея с помещением библиотеки в ресурсы исполняемого файла мне очень нравится, но как мне это провернуть я немного не в состоянии понять. С Visual Studio к сожалению обращаюсь на ВЫ. :)
 

#Rin

Известный
Всефорумный модератор
1,214
1,036
идея с помещением библиотеки в ресурсы исполняемого файла мне очень нравится, но как мне это провернуть я немного не в состоянии понять. С Visual Studio к сожалению обращаюсь на ВЫ. :)
Поищи информацию как добавлять ресурсы в проект с помощью Visual Studio или в готовый исполняемый файл например с помощью Resource Hacker.

Немного не понял про "предварительное сохранение в виде файла".
Windows позволяет загрузить динамическую библиотеку только из файла, если он вшит в твой инжектор, его нужно предварительно сохранить.
Как сохранить ресурс в файл можно загуглить, например: https://stackoverflow.com/questions/16527973/load-resource-as-byte-array-programmaticaly-in-c
Если все же решишь делать без файла, будет сложнее, как минимум начни с чтения документации: https://github.com/fancycode/MemoryModule/tree/master/doc
 
  • Нравится
Реакции: BigBon