Другое С/С++ Вопрос - Ответ

Dark_Knight

Me, me and me.
Друг
4,080
2,112
Такой вопрос. Он В самповских тексдравах есть возможность рендерить модель обьекта(педов, машин и т.д). Собственно, у меня такой вопрос. Как это можно реализовать самому и оттуда вытянуть(создать) текстуру в виде LPDIRECT3DTEXTURE9?
 

DolgorukovGTA

Известный
Проверенный
651
349
как заставить sscanf работать с русскими символами?
Попробуй использовать Wide-аналог этой функции - swscanf_s. В проекте используй набор символов Юникода (Unicode Character Set). Отпиши, помогло или нет.
Ошибка LNK2019 ссылка на неразрешенный внешний символ "extern "C" struct HDC__ * __stdcall GetDC(struct HWND__ *)" (?GetDC@@$$J14YGPAUHDC__@@PAUHWND__@@@Z) в функции "void __clrcall `dynamic initializer for 'hdc''(void)" (???__Ehdc@@YMXXZ@?A0xa98138a8@@$$FYMXXZ)

Юникод на многобайтовую кодировку менял, не помогло. На странице ошибки слишком размыто и инфы конкретной я не нашел

Memory.h:
#include <Windows.h>
#include <TlHelp32.h>
#include <iostream>
#include <memory.h>
#include <memory>


DWORD GetProcId(const char* procName)
{
    DWORD procId = 0;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnap != INVALID_HANDLE_VALUE)
    {
        PROCESSENTRY32 procEntry;
        procEntry.dwSize = sizeof(procEntry);

        if (Process32First(hSnap, &procEntry))
        {
            do
            {
                if (!strcmp(procEntry.szExeFile, procName))
                {
                    procId = procEntry.th32ProcessID;
                    break;
                }
            } while (Process32Next(hSnap, &procEntry));

        }
    }
    CloseHandle(hSnap);
    return procId;
}

uintptr_t GetModuleBaseAddress(DWORD procId, const char* modName)
{
    uintptr_t modBaseAddr = 0;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procId);
    if (hSnap != INVALID_HANDLE_VALUE)
    {
        MODULEENTRY32 modEntry;
        modEntry.dwSize = sizeof(modEntry);
        if (Module32First(hSnap, &modEntry))
        {
            do
            {
                if (!strcmp(modEntry.szModule, modName))
                {
                    modBaseAddr = (uintptr_t)modEntry.modBaseAddr;
                    break;
                }
            } while (Module32Next(hSnap, &modEntry));
        }
    }
    CloseHandle(hSnap);
    return modBaseAddr;
}

uintptr_t moduleBase = GetModuleBaseAddress(GetProcId("gta_sa.exe"), "samp.dll");
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, NULL, GetProcId("gta_sa.exe"));
HDC hdc = GetDC(FindWindowA(NULL, "GTA:SA:MP"));

template<typename T> T RPM(SIZE_T address) {

    T buffer;


    ReadProcessMemory(hProcess, (LPCVOID)address, &buffer, sizeof(T), NULL);


    return buffer;
}
Странно, ведь у меня работает GetDC и при простом подключении Windows.h. Не забывай отрисовочный контекст (DC) чистить, когда ты им воспользовался, и он тебе не нужен. Т.к используется ф-я GetDC, то чистим при помощи ReleaseDC. Рекомендую ознакомиться с этой страницей - http://www.vsokovikov.narod.ru/New_MSDN_API/D_context/fn_releasedc.htm. В частности, нам интересен текст под заголовком "Замечания". Если ты скинул код неполностью и ты используешь эту функцию где-то у себя дальше, то прошу прощения за наезд.
 
Последнее редактирование:

AnWu

Известный
Всефорумный модератор
4,786
5,425
Спасибо большое, но уже
#pragma comment(lib, "User32.lib") #include <Dbghelp>
всё решило. Теперь у меня проблема с чтением памяти, или что-то вроде, не могу решить уже второй день. Выше мой вопрос.Посмотреть вложение 55507
написано же. попытка чтения защищенного участка памяти. снимай virtual protect
 

DolgorukovGTA

Известный
Проверенный
651
349
Спасибо большое, но уже
#pragma comment(lib, "User32.lib") #include <Dbghelp>
всё решило. Теперь у меня проблема с чтением памяти, или что-то вроде, не могу решить уже второй день. Выше мой вопрос.Посмотреть вложение 55507
Нужно снять защиту с памяти, записать туда необходимое значение и вернуть защиту.
 
  • Нравится
Реакции: AnWu

CleanLegend

Известный
Всефорумный модератор
495
948
Чет там все для шарпа, я не понимаю. Понял, что память не может читаться, но почему?

вот это вообще непонятно куда и зачем
Посмотреть вложение 55331
 

ALF

Известный
Проверенный
320
545
ты пытаешься читать адрес своей же программы, а не игры
 

barspinoff

Известный
126
34
Ничего не понимаю, разве я таким образом не читаю память gta_sa.exe? Как тогда адрес игры читать? Раньше только так делал и все нормально было.
C++:
#pragma once
#include <Windows.h>
#include <TlHelp32.h>
#include <iostream>
#include <dbgHelp.h>
#pragma comment(lib, "User32.lib")

DWORD GetProcId(const char* procName)
{
    DWORD procId = 0;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnap != INVALID_HANDLE_VALUE)
    {
        PROCESSENTRY32 procEntry;
        procEntry.dwSize = sizeof(procEntry);

        if (Process32First(hSnap, &procEntry))
        {
            do
            {
                if (!strcmp(procEntry.szExeFile, procName))
                {
                    procId = procEntry.th32ProcessID;
                    break;
                }
            } while (Process32Next(hSnap, &procEntry));

        }
    }
    CloseHandle(hSnap);
    return procId;
}

uintptr_t GetModuleBaseAddress(DWORD procId, const char* modName)
{
    uintptr_t modBaseAddr = 0;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procId);
    if (hSnap != INVALID_HANDLE_VALUE)
    {
        MODULEENTRY32 modEntry;
        modEntry.dwSize = sizeof(modEntry);
        if (Module32First(hSnap, &modEntry))
        {
            do
            {
                if (!strcmp(modEntry.szModule, modName))
                {
                    modBaseAddr = (uintptr_t)modEntry.modBaseAddr;
                    break;
                }
            } while (Module32Next(hSnap, &modEntry));
        }
    }
    CloseHandle(hSnap);
    return modBaseAddr;
}

uintptr_t moduleBase = GetModuleBaseAddress(GetProcId("gta_sa.exe"), "samp.dll");
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, NULL, GetProcId("gta_sa.exe"));
HDC hdc = GetDC(FindWindowA(NULL, "GTA:SA:MP"));

template <typename T> T RPM(SIZE_T address) {
    //The buffer for data that is going to be read from memory
    T buffer;

    //The actual RPM
    ReadProcessMemory(hProcess, (LPCVOID)address, &buffer, sizeof(T), NULL);

    //Return our buffer
    return buffer;
}
удали 615-620 строки
поиск по хэндлу тебе тоже не нужен, когда есть PID
 

ALF

Известный
Проверенный
320
545
Ты пытаешься прочитать данные из текущего процесса.
Из других процессов ты должен читать и записывать через ReadProcessMemory / WriteProcessMemory.
 

barspinoff

Известный
126
34
C:
WORD wID;

DWORD pActor, pPed, pMtrx1, pMtrx2;

float fPlayerHP;

ReadProcessMemory(hProcess, (LPVOID) 0xBAA410, &wID, sizeof(wID));

ReadProcessMemory(hProcess, (LPVOID) 0xBAA410, &pActor, sizeof(pActor));

ReadProcessMemory(hProcess, (LPVOID) (pActor + 0x79C), &pPed, sizeof(pPed));

ReadProcessMemory(hProcess, (LPVOID) (pPed + 0x14), &pMtrx2, sizeof(pMtrx2));

ReadProcessMemory(hProcess, (LPVOID) (pPed + 0x540), &fPlayerHP, sizeof(fPlayerHP));

ReadProcessMemory(hProcess, (LPVOID) (pActor + 0x14), &pMtrx1, sizeof(pMtrx1));
 

barspinoff

Известный
126
34
Ну вот, как-то так, но с 37 по 43 нельзя преобразовать float в LPVOID

C++:
    private: System::Void TEST_Click(System::Object^ sender, System::EventArgs^ e) {

        WORD wID;

        DWORD pActor, pPed, pMtrx1, pMtrx2;

        float fPlayerHP;

        ReadProcessMemory(hProcess, (LPVOID)0xBAA410, &wID, sizeof(wID),0);
        ReadProcessMemory(hProcess, (LPVOID)0xBAA410, &pActor, sizeof(pActor),0);
        ReadProcessMemory(hProcess, (LPVOID)(pActor + 0x79C), &pPed, sizeof(pPed),0);
        ReadProcessMemory(hProcess, (LPVOID)(pPed + 0x14), &pMtrx2, sizeof(pMtrx2),0);
        ReadProcessMemory(hProcess, (LPVOID)(pPed + 0x540), &fPlayerHP, sizeof(fPlayerHP),0);

        if (&pPed > 0)
        {
            float* x = (float*)((&pMtrx1) + 0x30);//X position Ped
            float* y = (float*)((&pMtrx1) + 0x34);//Y position Ped
            float* z = (float*)((&pMtrx1) + 0x38);//Z position Ped
            float* x1 = (float*)((&pMtrx2) + 0x30);//X position Target
            float* y1 = (float*)((&pMtrx2) + 0x34);//Y position Target
            float* z1 = (float*)((&pMtrx2) + 0x38);//Z position Target
            float* RotAngle = (float*)((&pActor) + 0x558);//health of target player
            float Xwiping = (float)*x + 2 * (float)cos(*RotAngle + 1.48353F);
            float Ywiping = (float)*y + 2 * (float)sin(*RotAngle + 1.48353F);
            float Zwiping = (float)*z + 0.5F;
            *x1 = (float)Xwiping;
            *y1 = (float)Ywiping;
            *z1 = (float)Zwiping;
            ReadProcessMemory(hProcess, (LPVOID)(float*)((&pMtrx1) + 0x30), &pMtrx1, sizeof(pMtrx1), 0);
            ReadProcessMemory(hProcess, (LPVOID)(float*)((&pMtrx1) + 0x34), &pMtrx1, sizeof(pMtrx1), 0);
            ReadProcessMemory(hProcess, (LPVOID)(float*)((&pMtrx1) + 0x38), &pMtrx1, sizeof(pMtrx1), 0);
            ReadProcessMemory(hProcess, (LPVOID)(float*)((&pMtrx1) + 0x30), &pMtrx2, sizeof(pMtrx2), 0);
            ReadProcessMemory(hProcess, (LPVOID)(float*)((&pMtrx1) + 0x34), &pMtrx2, sizeof(pMtrx2), 0);
            ReadProcessMemory(hProcess, (LPVOID)(float*)((&pMtrx1) + 0x38), &pMtrx2, sizeof(pMtrx2), 0);
            ReadProcessMemory(hProcess, (LPVOID)(float*)((&pActor) + 0x558), &pActor, sizeof(pActor), 0);
            ReadProcessMemory(hProcess, (LPVOID)(float)*x + 2 * (float)cos(*RotAngle + 1.48353F), &RotAngle, sizeof(RotAngle), 0);
            ReadProcessMemory(hProcess, (LPVOID)(float)*y + 2 * (float)sin(*RotAngle + 1.48353F), &RotAngle, sizeof(RotAngle), 0);
            ReadProcessMemory(hProcess, (LPVOID)(float)*z + 0.5F, &RotAngle, sizeof(RotAngle), 0);

            WriteProcessMemory(hProcess, (LPVOID)(float)Xwiping, &Xwiping, sizeof(Xwiping), 0);
            WriteProcessMemory(hProcess, (LPVOID)(float)Ywiping, &Ywiping, sizeof(Ywiping), 0);
            WriteProcessMemory(hProcess, (LPVOID)(float)Zwiping, &Zwiping, sizeof(Zwiping), 0);
     

        }
    }
видимо, ты совсем ничего не понял
C:
float x, y, z, xt, yt, zt, angle, xw, yw, zw;
ReadProcessMemory(hProcess, (LPVOID)(pMtrx1 + 0x30), &x, sizeof(x), 0);
ReadProcessMemory(hProcess, (LPVOID)(pMtrx1 + 0x34), &y, sizeof(y), 0);
ReadProcessMemory(hProcess, (LPVOID)(pMtrx1 + 0x38), &z, sizeof(z), 0);

ReadProcessMemory(hProcess, (LPVOID)(pMtrx2 + 0x30), &xt, sizeof(xt), 0);
ReadProcessMemory(hProcess, (LPVOID)(pMtrx2 + 0x34), &yt, sizeof(yt), 0);
ReadProcessMemory(hProcess, (LPVOID)(pMtrx2 + 0x38), &zt, sizeof(zt), 0);

ReadProcessMemory(hProcess, (LPVOID)(pActor + 0x558), &angle, sizeof(angle), 0);

xw = (float)x + 2 * (float)cos(angle + 1.48353F);
yw = (float)y + 2 * (float)sin(angle + 1.48353F);
zw = (float)z + 0.5F;

WriteProcessMemory(hProcess, (LPVOID)(pMtrx2 + 0x30), &xw, sizeof(xw), 0);
WriteProcessMemory(hProcess, (LPVOID)(pMtrx2 + 0x34), &yw, sizeof(yw), 0);
WriteProcessMemory(hProcess, (LPVOID)(pMtrx2 + 0x38), &zw, sizeof(zw), 0);