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

DolgorukovGTA

Известный
Проверенный
652
345
как заставить 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

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

DolgorukovGTA

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

CleanLegend

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

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

ALF

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

barspinoff

Известный
126
33
Ничего не понимаю, разве я таким образом не читаю память 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
537
Ты пытаешься прочитать данные из текущего процесса.
Из других процессов ты должен читать и записывать через ReadProcessMemory / WriteProcessMemory.
 

barspinoff

Известный
126
33
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
33
Ну вот, как-то так, но с 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);
 

samp is meme

Активный
183
63
Я щас как ебучий абориген, которому показали зажигалку. Как этим пользоваться? Я что-то написал, исходя из инфы на странице этой функции msoft, но я ничего не понимаю. Подскажи, пожалуйста, как мне юзать это ?
Посмотреть вложение 55573

Не знаю, хоть как-то тебе облегчить жизнь, класс для работы с памятью.

C++:
#pragma once
#include    <Windows.h>
#include    <TlHelp32.h>
#include    <comdef.h>

struct PModule
{
    DWORD dwBase;
    DWORD dwSize;
};

class memory
{
public:
    inline bool Attach(const char* pName, DWORD dwSize)
    {
        HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);

        PROCESSENTRY32 entry;
        entry.dwSize = sizeof(entry);

        do
            if (!strcmp(_bstr_t(entry.szExeFile), pName))
            {
                _pId = entry.th32ProcessID;
                CloseHandle(handle);
                _process = OpenProcess(dwSize, false, _pId);
                return true;
            }
        while (Process32Next(handle, &entry));
        return false;
    }

    inline PModule GetModule(const char* pModule)
    {
        HANDLE module = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, _pId);
        MODULEENTRY32 entry;
        entry.dwSize = sizeof(entry);
       
        do
            if (!strcmp(_bstr_t(entry.szModule), pModule))
            {
                CloseHandle(module);
                return PModule{ reinterpret_cast<DWORD>(entry.hModule), entry.modBaseSize };
            }
        while (Module32Next(module, &entry));

        return PModule { 0 , 0 };
    }

    template <class T>
    T Read(const DWORD dwSize)
    {
        T _read;
        ReadProcessMemory(_process, LPVOID(dwSize), &_read, sizeof(T), NULL);
        return _read;
    }

    template <class T>
    void Write(const DWORD dwSize, const T value)
    {
        WriteProcessMemory(_process, LPVOID(dwSize), &value, sizeof(T), NULL);
    }

    void Exit()
    {
        CloseHandle(_process);
    }

private:
    HANDLE _process;
    DWORD _pId;
};

Как юзать на примере контры
C++:
memory mem;
PModule bClient;
while (!mem.Attach("csgo.exe", PROCESS_ALL_ACCESS)) {}

bClient = mem.GetModule("client_panorama.dll");
   
DWORD playerBase = mem.Read<DWORD>(bClient.dwBase + dwLocalPlayer);
 

RTD

Нестандартное звание
Модератор
391
414
Я щас как ебучий абориген, которому показали зажигалку. Как этим пользоваться? Я что-то написал, исходя из инфы на странице этой функции msoft, но я ничего не понимаю. Подскажи, пожалуйста, как мне юзать это ?
Посмотреть вложение 55573
Ну для начала я не вижу где ты получаешь hProcess
C++:
DWORD procId = GetProcId(L"gta-sa.exe");
if (procId == NULL) return;
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procId);
if (hProc == INVALID_HANDLE_VALUE) return;
По поводу virtualprotectex, то используется обычно для записи, выглядит примерно так
C++:
xw = (float)x + 2 * (float)cos(angle + 1.48353F);
DWORD oldProt;
VirtualProtectEx(hProcess, (void*)(pMtrx2 + 0x30), sizeof(xw), PAGE_EXECUTE_READWRITE, &oldProt);
WriteProcessMemory(hProcess, (LPVOID)(pMtrx2 + 0x30), &xw, sizeof(xw), 0);
VirtualProtectEx(hProcess, (void*)(pMtrx2 + 0x30), sizeof(xw), oldProt, NULL);
В конце всех твоих манипуляций не забудь прописать
C++:
CloseHandle(hProcess);
 

loganhackerdff

Известный
868
518
Как сделать чтоб русский текст из imgui::InputText в чат выводился нормальным а не каракулями