Небольшой LifeHack или упрощаем тестирование рабочей длл

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

Создаем внутри решения пустую консоль(я назвал проект RunProcess). добавляем к новому проекту .cpp файл и копируем в него следующее:
Код:
Expand Collapse Copy
#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;
}
Это примитивный инжектор по типу LL и метод который запускает указанный процесс.
szPath хранит в себе относительный путь до запускаемого процесса. через пробел возможно указать любое количество дополнительных параметров.
В роли длл выбирается длл с таким же именем как и у данной программы. Поэтому идем в настройки проекта и заменяем конечное имя длл вашего чита
xhQqKM_VS0W4qfy55zQCpA.png


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

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



Все готово. Теперь если нажать на F5(или соответствующую кнопку на панели инструментов), то сначала соберется DLL и запустится консоль, которая в свою очередь запустит игру и подгрузит только что собранную длл в процесс.
 
Если бы еще так же мвс подрубалась после запуска к кс для отладки той самой длл которую инжектнули через ЛЛ было бы прекрасно
 
Если бы еще так же мвс подрубалась после запуска к кс для отладки той самой длл которую инжектнули через ЛЛ было бы прекрасно
Это возможно реализовать с помощью внешних плагинов(только платные попадались) либо на шарпе. В любом случаи это возможно, так что штрудируем гугл
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
извиняюсь опять за апп темы... ну в этом есть и плюсы кто не видел тему пусть посмотрят способ рил годный))
вообщем у меня опять проблема...
делал всё как в гайде ошибок не какие нету почти... только с путем до ксго... заменил пусть крайсера на своё а ему что то не нравится..
Bl8ONm0Owm4.jpg
 
извиняюсь опять за апп темы... ну в этом есть и плюсы кто не видел тему пусть посмотрят способ рил годный))
вообщем у меня опять проблема...
делал всё как в гайде ошибок не какие нету почти... только с путем до ксго... заменил пусть крайсера на своё а ему что то не нравится..
Bl8ONm0Owm4.jpg

Пожалуйста, зарегистрируйтесь или авторизуйтесь, чтобы увидеть содержимое.

 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
извиняюсь опять за апп темы... ну в этом есть и плюсы кто не видел тему пусть посмотрят способ рил годный))
вообщем у меня опять проблема...
делал всё как в гайде ошибок не какие нету почти... только с путем до ксго... заменил пусть крайсера на своё а ему что то не нравится..
Bl8ONm0Owm4.jpg
знает кто как фиксануть?
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Визуалка сама показывает, что проблема в литерале ( L ).
и как ее пофиксить та ?
посмотри код крайсера там вообщем нету перед путем до кс го "L" это мне сказали поставить "L" ибо у меня был путь до кс красный... чекни первый скрин я хз че это
 
Ты не можешь использовать строковый литерал(const char массив) для инициализации переменных типа LPSTR, но это тебе компилятор и без меня сказал.

Можно указать ему(компилятору) опцию /Zc:strictStrings-. Она отвечает за отключение преобразования типов строковых литералов.
msdn написал(а):
[Если этот параметр указан, компилятор требует строгого соответствия const-квалификации для указателей, инициализированных с помощью строковых литералов.]
Пожалуйста, авторизуйтесь для просмотра ссылки.

Да и вообще, учись гуглить.
Ошибка простая, в интернете очень много информации о ней.
 
СОРРИ,за up темы,но мне всё это понравилось,буду юзать
 
Назад
Сверху Снизу