В этом гайде я расскажу, как написать свой инжектор. Писать его будем на С++, если интересует такой же, но на autohotkey, то вот на autohotkey: https://yougame.biz/threads/184242/.
Возможности инжектора:
- Можно инжектить любые игры и программы. Как поменять программу или игру для инжекта читайте ниже.
- Инжектится на Windows 7, 8, 10.
- Метод инжекта по-умолчанию ManualMap (можно использовать любой другой метод).
Собственно, “Main.cpp”. Файл “GH Injector.h” находится в исходниках, которые оставил ниже.
#define _CRT_SECURE_NO_WARNINGS
#include "GH Injector.h"
#include <iostream>
#include <cstring>
#include <fstream>
#include <Windows.h>
#include <TlHelp32.h>
using namespace std;
const char szFilePath[] = "test_.dll";
DWORD FindProcessId(const char* szProcessName)
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
DWORD FoundProcessId = 0;
while (Process32Next(hSnapshot, &pe32))
{
if (!strcmp(szProcessName, pe32.szExeFile))
{
FoundProcessId = pe32.th32ProcessID;
break;
}
}
CloseHandle(hSnapshot);
return FoundProcessId;
}
int main()
{
HMODULE hGHInjector = LoadLibraryA("gh_injector.dll");
fnInject Inject;
Inject = (fnInject)GetProcAddress(hGHInjector, "InjectA");
INJECTIONDATA data;
ZeroMemory(&data, sizeof(INJECTIONDATA));
data.Mode = 2;
data.Method = 0;
data.Flags = INJ_ERASE_HEADER | INJ_SHIFT_MODULE | INJ_UNLINK_FROM_PEB;
data.ProcessID = FindProcessId("test.exe");
/*strcpy(data.szDllPath, szFilePath);*/
/*memcpy(data.szDllPath, szFilePath, strlen(szFilePath) + 1);*/
RtlMoveMemory(data.szDllPath, szFilePath, strlen(szFilePath) + 1);// если не работает, то раскомментируйте одну из команды выше
Inject(&data);
FreeLibrary(hGHInjector);
return 0;
}
Пояснения:
data.Mode = 2;
• 0 - LdrLoadDll
• 1 - LoadLibraryExW
• 2 - ManualMap
data.Method = 0;
• 0 - NtCreateThreadEx
• 1 - Thread_Hijacking
• 2 - SetWindowsHookEx
• 3 - QueueUserAPC
Про все остальные параметры (флаги) можно прочитать по этой ссылке.
data.ProcessID = FindProcessId("test.exe");
Здесь устанавливается необходимый процесс, в который нужно инжектить свою dll.
const char szFilePath[] = "test_.dll";
Здесь устанавливается имя внедряемой dll’ки.
Скачать исходники можно здесь.
В исходниках даются примеры тестовых экзешников и dll для 32-bit, 64-bit, там же включены все необходимые dll.
Объяснять, понятно дело, все долго. Но кто хочет, пишите в комменты.