Крашит игру из-за DLL

Статус
В этой теме нельзя размещать новые ответы.

qwertyrus

Новичок
Автор темы
23
2
Переписать external cheat в internal для MTA оказалось труднее, чем я думал(инжект работает и не банит). Заранее извиняюсь если код выглядит плохо, только учусь. Крашит после инжекта, пробовал изменять функцию world_to_screen, крашит в if'ах(внутри функции). Помогите если не трудно
C++:
#include "pch.h"
#include <windows.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <sstream>
#include <string>


std::vector<int> world_to_screen(std::vector<std::vector<float>> ViewMatrix1, float x, float y, float z) {
    std::vector<int> badcord = { -1, -1 };
    std::vector<int> result(2);
    float screenz = (z * ViewMatrix1[2][2]) + (y * ViewMatrix1[1][2]) + (x * ViewMatrix1[0][2]) + ViewMatrix1[3][2];
    if (screenz < 0.01f) {
        return badcord;
    }
    float screenx = (ViewMatrix1[2][0] * z) + (ViewMatrix1[1][0] * y) + (ViewMatrix1[0][0] * x) + ViewMatrix1[3][0];
    float screeny = (ViewMatrix1[2][1] * z) + (ViewMatrix1[1][1] * y) + (ViewMatrix1[0][1] * x) + ViewMatrix1[3][1];
    float recip = 1.0f / screenz;
    screenx *= recip * 1920;
    screeny *= recip * 1080;
    if (1920 >= screenx && screenx >= 0 && 1080 >= screeny && screeny >= 0) {
        result[0] = static_cast<int>(screenx);
        result[1] = static_cast<int>(screeny);
        return result;
    }
    else {
        return badcord;
    }
}
DWORD WINAPI MainThread(HMODULE hModule)
{
    AllocConsole();
    system("title First project");
    FILE* f;
    freopen_s(&f, "CONOUT$", "w", stdout);
    //printf("Test 1");
    Sleep(200);
    DWORD offsetview = 0xB6FA2C;
    bool espstatus = false;
    DWORD* cped = (DWORD*)0xB6F5F0;
    float* myhealth = (float*)(*cped + 0x540);
    float* myarmour = (float*)(*cped + 0x548);
    DWORD* xyz = (DWORD*)(*cped + 0x14);
    float* x = (float*)(*xyz + 0x30);
    float* y = (float*)(*xyz + 0x30 + 4);
    float* z = (float*)(*xyz + 0x30 + 8);
    std::vector<std::vector<float>> ViewMatrix(4, std::vector<float>(4));
    while (!GetAsyncKeyState(VK_END))
    {

      
        if (GetAsyncKeyState(VK_INSERT)) {
            espstatus = true;
        }

        if (GetAsyncKeyState(VK_DELETE)) {
            espstatus = false;
        }
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {

                ViewMatrix[i][j] = *(float*)(offsetview + 16 * i + 4 * j);
            }
        }
        for (int i = 1; i < 120; i++) {
                DWORD* cpedsearch = (DWORD*)(cped + i * 0x7c4);
                float* health = (float*)(cpedsearch + 0x540);
      
                if (*health <= 160.0f && *health >= 4.0f) {
                    DWORD* pointercoords = (DWORD*)(cpedsearch + 0x14);
                    float* hisx = (float*)(*cpedsearch + 0x30);
                    float* hisy = (float*)(*cpedsearch + 0x34);
                    float* hisz = (float*)(*cpedsearch + 0x38);
                  
                    std::vector<int> onscreen = world_to_screen(ViewMatrix, *hisx, *hisy, *hisz);
                    //далее будет рисование, но пока упустим
                }
            }


        }
  
    if (GetAsyncKeyState(VK_END))
    {
        FreeConsole();
        fclose(f);
    }

    FreeLibraryAndExitThread(hModule, 0);
    return 0;
}
BOOL APIENTRY DllMain(HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        DisableThreadLibraryCalls(hModule);        //disables attach and detach notifications
        CloseHandle(CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)MainThread, hModule, 0, nullptr));
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
 
Решение
Осталось теперь прикрутить хук директ икса(буду рад если поможешь), а затем отрисовать линии.
Сам недавно разбирался, вот тема:
А вот нужный тебе код:
C++:
#include "MinHook.h"

std::uintptr_t find_device(std::uint32_t Len)
{
    static std::uintptr_t base = [](std::size_t Len)
    {
        std::string path_to(MAX_PATH, '\0');
        if (auto size = GetSystemDirectoryA((LPSTR)path_to.data(), MAX_PATH))
        {
            path_to.resize(size);
            path_to += "\\d3d9.dll";
            std::uintptr_t dwObjBase = reinterpret_cast<std::uintptr_t>(LoadLibraryA(path_to.c_str()));
            while (dwObjBase++ < dwObjBase + Len)
            {
                if...

qwertyrus

Новичок
Автор темы
23
2
Проверь, у тебя в функцию правильные ли координаты передаются?
ну да, *hisx, *hixy, *hisz, я вот думаю, что ошибка наверно в переприсваивании видовой матрицы, как сделать её структуру и указатель и сразу по адрессу обратиться(ну типо как и все остальные переменные)? А не как я переприсваивать. Может стоит передавать их по ссылке/константной ссылке?
 

Vintik

Мечтатель
Проверенный
1,469
917
ну да, *hisx, *hixy, *hisz
Это я вижу...
Ты выведи эти координаты в лог ну или в конце то концов MessageBox
C++:
MessageBoxA(GetForegroundWindow(), "тут твои координаты, переведи числа в строку", "test", 0);
Потому что у меня подозрение, что числа там передаются странные. Ты просто глазами посмотришь на числа и скажешь, похоже ли это на координаты или нет
 

qwertyrus

Новичок
Автор темы
23
2
Это я вижу...
Ты выведи эти координаты в лог ну или в конце то концов MessageBox
C++:
MessageBoxA(GetForegroundWindow(), "тут твои координаты, переведи числа в строку", "test", 0);
Потому что у меня подозрение, что числа там передаются странные. Ты просто глазами посмотришь на числа и скажешь, похоже ли это на координаты или нет
Короче я нашел свою ошибку и исправил её, кое-где передавал вместо значения pointer'а адресс, короче теперь вывод координаты, но крашит сразу после первой(начинал с нулевого индекса дабы проверить на себе(выше изачально были выведены мои координаты):
1712332003508.png

я даже сделал кучу проверок на != nullptr, бессполезно...

C++:
 DWORD* cpedsearch = (DWORD*)(cped + i * 0x7c4);
 if (cpedsearch != nullptr) {
     float* health = (float*)(*cpedsearch + 0x540);
     if (health != nullptr) {


         if (*health <= 1205.0f && *health >= 4.0f) {
             DWORD* pointercoords = (DWORD*)(*cpedsearch + 0x14);
             if (pointercoords != nullptr) {

          
             float* hisx = (float*)(*pointercoords + 0x30);
             float* hisy = (float*)(*pointercoords + 0x34);
             float* hisz = (float*)(*pointercoords + 0x38);
             
             if (hisx != nullptr && hisy != nullptr && hisz != nullptr) {
                 std::vector<int> onscreen = world_to_screen(ViewMatrix, *hisx, *hisy, *hisz);
                 std::string strValue = std::to_string(*hisx) + " " + std::to_string(*hisy) + " " + std::to_string(*hisy) + " " + std::to_string(i);
                 const char* str1 = strValue.c_str();
                 printf(str1);
                 printf("\n");
 
Последнее редактирование:

Vintik

Мечтатель
Проверенный
1,469
917
Короче я нашел свою ошибку и исправил её, кое-где передавал вместо значения pointer'а адресс, короче теперь вывод координаты, но крашит сразу после первой(начинал с нулевого индекса дабы проверить на себе(выше изачально были выведены мои координаты):
Посмотреть вложение 236501
я даже сделал кучу проверок на != nullptr, бессполезно...

C++:
 DWORD* cpedsearch = (DWORD*)(cped + i * 0x7c4);
 if (cpedsearch != nullptr) {
     float* health = (float*)(*cpedsearch + 0x540);
     if (health != nullptr) {


         if (*health <= 1205.0f && *health >= 4.0f) {
             DWORD* pointercoords = (DWORD*)(*cpedsearch + 0x14);
             if (pointercoords != nullptr) {

         
             float* hisx = (float*)(*pointercoords + 0x30);
             float* hisy = (float*)(*pointercoords + 0x34);
             float* hisz = (float*)(*pointercoords + 0x38);
            
             if (hisx != nullptr && hisy != nullptr && hisz != nullptr) {
                 std::vector<int> onscreen = world_to_screen(ViewMatrix, *hisx, *hisy, *hisz);
                 std::string strValue = std::to_string(*hisx) + " " + std::to_string(*hisy) + " " + std::to_string(*hisy) + " " + std::to_string(i);
                 const char* str1 = strValue.c_str();
                 printf(str1);
                 printf("\n");
Т. е. проблема в координатах всё таки?
 

qwertyrus

Новичок
Автор темы
23
2
Т. е. проблема в координатах всё таки?
вероятнее всего я где то ошибаюсь в использовании указателя, поэтому крашит. Щас вот методом пробы запуска и крашей ищу где оно обрывается

Т. е. проблема в координатах всё таки?
Я решил проблему... Она была в том, что cpedsearch - cped+оффсет, а я брал его как поинтер еще один, в итоге попадал не на тот адрес и крашило, сейчас всё норм(последняя цифра это i(я проверял так). Осталось теперь прикрутить хук директ икса(буду рад если поможешь), а затем отрисовать линии. Хотелось бы по костям рисовать, но как я не искал, функции получения координаты кости(на голом C++) нет.
1712339535945.png
 
Последнее редактирование:
  • Нравится
Реакции: Vintik

Vintik

Мечтатель
Проверенный
1,469
917
Осталось теперь прикрутить хук директ икса(буду рад если поможешь), а затем отрисовать линии.
Сам недавно разбирался, вот тема:
А вот нужный тебе код:
C++:
#include "MinHook.h"

std::uintptr_t find_device(std::uint32_t Len)
{
    static std::uintptr_t base = [](std::size_t Len)
    {
        std::string path_to(MAX_PATH, '\0');
        if (auto size = GetSystemDirectoryA((LPSTR)path_to.data(), MAX_PATH))
        {
            path_to.resize(size);
            path_to += "\\d3d9.dll";
            std::uintptr_t dwObjBase = reinterpret_cast<std::uintptr_t>(LoadLibraryA(path_to.c_str()));
            while (dwObjBase++ < dwObjBase + Len)
            {
                if (*reinterpret_cast<std::uint16_t*>(dwObjBase + 0x00) == 0x06C7 &&
                    *reinterpret_cast<std::uint16_t*>(dwObjBase + 0x06) == 0x8689 &&
                    *reinterpret_cast<std::uint16_t*>(dwObjBase + 0x0C) == 0x8689)
                {
                    dwObjBase += 2;
                    break;
                }
            }
            return dwObjBase;
        }
        return std::uintptr_t(0);
    }(Len);
    return base;
}

void* get_function_address(int VTableIndex)
{
    return (*reinterpret_cast<void***>(find_device(0x128000)))[VTableIndex];
}

HRESULT(__stdcall* IDirect3DDevice9__Present)(LPDIRECT3DDEVICE9 pDevice, CONST RECT* pSrcRect, CONST RECT* pDestRect, HWND hDestWindow, CONST RGNDATA* pDirtyRegion);
HRESULT __stdcall IDirect3DDevice9__Present_Hook(LPDIRECT3DDEVICE9 pDevice, CONST RECT* pSrcRect, CONST RECT* pDestRect, HWND hDestWindow, CONST RGNDATA* pDirtyRegion)
{
    // do something...
    return IDirect3DDevice9__Present(pDevice, pSrcRect, pDestRect, hDestWindow, pDirtyRegion);
}

HRESULT(__stdcall* IDirect3DDevice9__Reset)(LPDIRECT3DDEVICE9 pDevice, D3DPRESENT_PARAMETERS* pPresentationParameters);
HRESULT __stdcall IDirect3DDevice9__Reset_Hook(LPDIRECT3DDEVICE9 pDevice, D3DPRESENT_PARAMETERS* pPresentationParameters)
{
    // do something...
    return IDirect3DDevice9__Reset(pDevice, pPresentationParameters);
}

DWORD WINAPI InitializeAndLoad(LPVOID hModule)
{
    MH_CreateHook(get_function_address(17), &IDirect3DDevice9__Present_Hook, reinterpret_cast<void**>(&IDirect3DDevice9__Present));
    MH_EnableHook(get_function_address(17));
    MH_CreateHook(get_function_address(16), &IDirect3DDevice9__Reset_Hook, reinterpret_cast<void**>(&IDirect3DDevice9__Reset));
    MH_EnableHook(get_function_address(16));
    return 0;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
        {
            DisableThreadLibraryCalls(hModule);
            MH_Initialize();
            CreateThread(0, 0, &InitializeAndLoad, hModule, 0, 0);
            break;
        }
        case DLL_PROCESS_DETACH:
        {
            MH_DisableHook(get_function_address(17));
            MH_DisableHook(get_function_address(16));
            MH_RemoveHook(get_function_address(17));
            MH_RemoveHook(get_function_address(16));
            break;
        }
    }
    return 1;
}

но как я не искал, функции получения координаты кости(на голом C++) нет.
Я думаю, что это может быть тут, но не уверен.
 
  • Нравится
Реакции: qwertyrus

qwertyrus

Новичок
Автор темы
23
2
Сам недавно разбирался, вот тема:
А вот нужный тебе код:
C++:
#include "MinHook.h"

std::uintptr_t find_device(std::uint32_t Len)
{
    static std::uintptr_t base = [](std::size_t Len)
    {
        std::string path_to(MAX_PATH, '\0');
        if (auto size = GetSystemDirectoryA((LPSTR)path_to.data(), MAX_PATH))
        {
            path_to.resize(size);
            path_to += "\\d3d9.dll";
            std::uintptr_t dwObjBase = reinterpret_cast<std::uintptr_t>(LoadLibraryA(path_to.c_str()));
            while (dwObjBase++ < dwObjBase + Len)
            {
                if (*reinterpret_cast<std::uint16_t*>(dwObjBase + 0x00) == 0x06C7 &&
                    *reinterpret_cast<std::uint16_t*>(dwObjBase + 0x06) == 0x8689 &&
                    *reinterpret_cast<std::uint16_t*>(dwObjBase + 0x0C) == 0x8689)
                {
                    dwObjBase += 2;
                    break;
                }
            }
            return dwObjBase;
        }
        return std::uintptr_t(0);
    }(Len);
    return base;
}

void* get_function_address(int VTableIndex)
{
    return (*reinterpret_cast<void***>(find_device(0x128000)))[VTableIndex];
}

HRESULT(__stdcall* IDirect3DDevice9__Present)(LPDIRECT3DDEVICE9 pDevice, CONST RECT* pSrcRect, CONST RECT* pDestRect, HWND hDestWindow, CONST RGNDATA* pDirtyRegion);
HRESULT __stdcall IDirect3DDevice9__Present_Hook(LPDIRECT3DDEVICE9 pDevice, CONST RECT* pSrcRect, CONST RECT* pDestRect, HWND hDestWindow, CONST RGNDATA* pDirtyRegion)
{
    // do something...
    return IDirect3DDevice9__Present(pDevice, pSrcRect, pDestRect, hDestWindow, pDirtyRegion);
}

HRESULT(__stdcall* IDirect3DDevice9__Reset)(LPDIRECT3DDEVICE9 pDevice, D3DPRESENT_PARAMETERS* pPresentationParameters);
HRESULT __stdcall IDirect3DDevice9__Reset_Hook(LPDIRECT3DDEVICE9 pDevice, D3DPRESENT_PARAMETERS* pPresentationParameters)
{
    // do something...
    return IDirect3DDevice9__Reset(pDevice, pPresentationParameters);
}

DWORD WINAPI InitializeAndLoad(LPVOID hModule)
{
    MH_CreateHook(get_function_address(17), &IDirect3DDevice9__Present_Hook, reinterpret_cast<void**>(&IDirect3DDevice9__Present));
    MH_EnableHook(get_function_address(17));
    MH_CreateHook(get_function_address(16), &IDirect3DDevice9__Reset_Hook, reinterpret_cast<void**>(&IDirect3DDevice9__Reset));
    MH_EnableHook(get_function_address(16));
    return 0;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
        {
            DisableThreadLibraryCalls(hModule);
            MH_Initialize();
            CreateThread(0, 0, &InitializeAndLoad, hModule, 0, 0);
            break;
        }
        case DLL_PROCESS_DETACH:
        {
            MH_DisableHook(get_function_address(17));
            MH_DisableHook(get_function_address(16));
            MH_RemoveHook(get_function_address(17));
            MH_RemoveHook(get_function_address(16));
            break;
        }
    }
    return 1;
}


Я думаю, что это может быть тут, но не уверен.
Что я делаю не так? Все методы из инета попробовал, добавлял в папку c включениями, к исходному файлу dllmain.cpp, ничего не помогает
1712432117311.png

1712425904504.png
 
Последнее редактирование:

Vintik

Мечтатель
Проверенный
1,469
917
Что я делаю не так? Все методы из инета попробовал, добавлял в папку c включениями, к исходному файлу dllmain.cpp, ничего не помогаетПосмотреть вложение 236605
Посмотреть вложение 236587
Ой как я это не люблю.
Вот тут есть правильное подключение Imgui.
Попробуй сделать всё как там
 

qwertyrus

Новичок
Автор темы
23
2
Ой как я это не люблю.
Вот тут есть правильное подключение Imgui.
Попробуй сделать всё как там
не помогло, стало только хуже
1712438411072.png


не помогло, стало только хуже
1712438411072.png
создал новый, чистый проект, скомпилировало, но крашит при разворачивании игры сразу(инжект, разворачиваю - бамс и краш)...
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.