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

Merger

Новичок
1
0
Как в asi можно получить указатель на cchat. Тот, что передается первым аргументом в AddMessage.
 

ALF

Известный
Проверенный
320
539
Как сделать активацию по читкоду в sf?
C++:
// https://github.com/cleolibrary/CLEO4/blob/master/source/CTextManager.cpp#L67
bool TestCheat(const char* cheat)
{
    char* c = reinterpret_cast<char*>(0x00969110);
    char buf[30];
    strcpy(buf, cheat);
    char* s = _strrev(buf);
    if (_strnicmp(s, c, strlen(s))) return false;
    *reinterpret_cast<char*>(0x00969110) = 0;
    return true;
}

if (TestCheat("cheat"))
{
    // ...
}
 
Последнее редактирование:

Dark_Knight

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

DolgorukovGTA

Известный
Проверенный
652
346
как заставить 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,780
5,412
Спасибо большое, но уже
#pragma comment(lib, "User32.lib") #include <Dbghelp>
всё решило. Теперь у меня проблема с чтением памяти, или что-то вроде, не могу решить уже второй день. Выше мой вопрос.Посмотреть вложение 55507
написано же. попытка чтения защищенного участка памяти. снимай virtual protect
 

DolgorukovGTA

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

CleanLegend

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

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

ALF

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

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
539
Ты пытаешься прочитать данные из текущего процесса.
Из других процессов ты должен читать и записывать через 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));