Эксперт
- Статус
- Оффлайн
- Регистрация
- 12 Июн 2014
- Сообщения
- 994
- Реакции
- 1,209
как часто вам приходится проверять свой чит в игре?
Как часто приходится переключаться между окнами ОС что бы запустить инжектор и игру?
После 4 часов мелких корректировок в коде мне это "слегка надоело".
Во общем предлагаю решение, а точнее способ немного облегчить себе жизни и сэкономить кучу времени в итоге. "Поехали")))
Допустим у вас есть решение в котором находится проект вашего чита(речь идет исключительно об Internal, то есть DLL). Жмем ПКМ по решению и выбираем:
Создаем внутри решения пустую консоль(я назвал проект RunProcess). добавляем к новому проекту .cpp файл и копируем в него следующее:
Это примитивный инжектор по типу LL и метод который запускает указанный процесс.
szPath хранит в себе относительный путь до запускаемого процесса. через пробел возможно указать любое количество дополнительных параметров.
В роли длл выбирается длл с таким же именем как и у данной программы. Поэтому идем в настройки проекта и заменяем конечное имя длл вашего чита
далее нам нужно сделать так, что бы наша программа запускалась по кнопке F5(отладчик) и только после сборки нашей длл. Для этого жмем ПКМ по решению и переходим в свойства выставляем галочку напротив пункта "Один запускаемый проект" и выбираем созданный ранее проект:
таким образом при запуске "локального отладчика" будет собираться(если требуется) и запускаться наша консоль.
теперь нам нужно перейти на вкладку "зависимости проектов". в поле "Проекты" выбираем нашу консоль, а в графе "Зависит от" ставим галочку напротив проекта чита. Жмем ОК.
Все готово. Теперь если нажать на F5(или соответствующую кнопку на панели инструментов), то сначала соберется DLL и запустится консоль, которая в свою очередь запустит игру и подгрузит только что собранную длл в процесс.
Как часто приходится переключаться между окнами ОС что бы запустить инжектор и игру?
После 4 часов мелких корректировок в коде мне это "слегка надоело".
Во общем предлагаю решение, а точнее способ немного облегчить себе жизни и сэкономить кучу времени в итоге. "Поехали")))
Допустим у вас есть решение в котором находится проект вашего чита(речь идет исключительно об Internal, то есть DLL). Жмем ПКМ по решению и выбираем:
Добавить->Создать проект...

Создаем внутри решения пустую консоль(я назвал проект RunProcess). добавляем к новому проекту .cpp файл и копируем в него следующее:
Код:
#include <Windows.h>
#include <conio.h>
#include <iostream>
const LPSTR szPath = "E:\\Games\\Steam\\steamapps\\common\\Counter-Strike Global Offensive\\csgo.exe -insecure -novid";
bool DoInject(HANDLE, const char*);
int main(int argc, char** argv)
{
SetConsoleTitleA("RunProcess");
char dllname[MAX_PATH];
GetModuleFileNameA(0, dllname, MAX_PATH);
dllname[strlen(dllname) - 3] = 0;
strcat_s(dllname, "dll");
STARTUPINFOA cif;
ZeroMemory(&cif, sizeof(STARTUPINFOA));
PROCESS_INFORMATION pi;
if (CreateProcessA(NULL, szPath,
NULL, NULL, FALSE, NULL, NULL, NULL, &cif, &pi) == TRUE)
{
std::cout << "Handle " << pi.hProcess << "ID: " << pi.dwProcessId << std::endl;
Sleep(10000);
if (DoInject(pi.hProcess, dllname))
{
std::cout << "GOOD " << std::endl;
}
}
else
std::cout << "CreateProcessA::Error " << GetLastError() << std::endl;
Sleep(5000);
return EXIT_SUCCESS;
}
bool DoInject(HANDLE hHandel, const char* dllPath)
{
size_t size = strlen(dllPath) + 1;
LPVOID loadLibAddr = GetProcAddress(GetModuleHandleA("Kernel32.dll"), "LoadLibraryA");
LPVOID pDllPath = VirtualAllocEx(hHandel, 0, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
if (!pDllPath)
{
CloseHandle(hHandel);
std::cout << "Error:Reserving memory::Code = " << GetLastError() << std::endl;
return false;
}
if (!WriteProcessMemory(hHandel, pDllPath, dllPath, size, nullptr))
{
CloseHandle(hHandel);
return false;
}
HANDLE hThread = CreateRemoteThread(hHandel, 0, 0, (LPTHREAD_START_ROUTINE)loadLibAddr, pDllPath, 0, 0);
if (hThread == INVALID_HANDLE_VALUE)
{
std::cout << "Error::Invalid handle""Code:: = " << GetLastError() << std::endl;
return false;
}
WaitForSingleObject(hThread, INFINITE);
if (!VirtualFreeEx(hHandel, pDllPath, NULL, MEM_RELEASE))
{
CloseHandle(hThread);
std::cout << "Error::Free memory:: Code = " << GetLastError() << std::endl;
return false;
}
CloseHandle(hThread);
return true;
}
szPath хранит в себе относительный путь до запускаемого процесса. через пробел возможно указать любое количество дополнительных параметров.
В роли длл выбирается длл с таким же именем как и у данной программы. Поэтому идем в настройки проекта и заменяем конечное имя длл вашего чита

далее нам нужно сделать так, что бы наша программа запускалась по кнопке F5(отладчик) и только после сборки нашей длл. Для этого жмем ПКМ по решению и переходим в свойства выставляем галочку напротив пункта "Один запускаемый проект" и выбираем созданный ранее проект:

таким образом при запуске "локального отладчика" будет собираться(если требуется) и запускаться наша консоль.
теперь нам нужно перейти на вкладку "зависимости проектов". в поле "Проекты" выбираем нашу консоль, а в графе "Зависит от" ставим галочку напротив проекта чита. Жмем ОК.

Все готово. Теперь если нажать на F5(или соответствующую кнопку на панели инструментов), то сначала соберется DLL и запустится консоль, которая в свою очередь запустит игру и подгрузит только что собранную длл в процесс.