Как написать свой инжектор для любой игры

В этом гайде я расскажу, как написать свой инжектор. Писать его будем на С++, если интересует такой же, но на autohotkey, то вот на autohotkey: https://yougame.biz/threads/184242/.

Возможности инжектора:

  • Можно инжектить любые игры и программы. Как поменять программу или игру для инжекта читайте ниже.
  • Инжектится на Windows 7, 8 (на 10 не проверял, на 10 есть отдельный инжектор, кто хочет, может сам написать инжектор для 10, для этого нужны только необходимые dll, читайте ниже.)
  • Метод инжекта по-умолчанию 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

Про все остальные параметры (флаги) можно прочитать по этой ссылке. Там же находятся все необходимые dll для инжекта для windows 10.

data.ProcessID = FindProcessId("test.exe"); ​
Здесь устанавливается необходимый процесс, в который нужно инжектить свою dll.

const char szFilePath[] = "test_.dll"; ​
Здесь устанавливается имя внедряемой dll’ки.

Скачать исходники можно здесь.
В исходниках даются примеры тестовых экзешников и dll для 32-bit, 64-bit, там же включены все необходимые dll.

Объяснять, понятно дело, все долго. Но кто хочет, пишите в комменты.

4 Likes

Ладно, допустим

почему ты не осуществишь ввод данных с клавиатуры?

char ProcName[32];
char DllName[MAX_PATH];

cout << "process name:" << endl;
scanf_s("%s", ProcName);
cout << "dll name:" << endl;
scanf_s("%s", DllName);

Привет. А я не хочу его делать консольным.

Ну тогда понятно)