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

Vesca

Новичок
20
0
1586440635130.png
 

MrCold

Активный
364
118
1. Ваш вопрос. Решил на самоизоляции попробовать написать на C++ простой код. Раньше этого не делал, поэтому возможны костыли и небрежность. Суть в чем - выводится не то, что нужно, а именно:
1586456557337.png


Может кто показать ошибку?
C++:
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>
#include <tchar.h>
#include <psapi.h>

using namespace std;

DWORD GetProcId(const wchar_t* procname)
{
    PROCESSENTRY32 pe;
    HANDLE hSnap;

    pe.dwSize = sizeof(PROCESSENTRY32);
    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (Process32First(hSnap, &pe)) {
        do {
            if (wcscmp(pe.szExeFile, procname) == 0)
                break;
        } while (Process32Next(hSnap, &pe));
    }
    return pe.th32ProcessID;
}

DWORD get_module(HANDLE hProcess, const wchar_t* name)
{
    HMODULE hMods[1024];
    DWORD cbNeeded;
    unsigned int i;


    if (EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
    {
        for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
        {
            TCHAR szModName[MAX_PATH];

            if (GetModuleBaseName(hProcess, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR)))
            {
                if (wcscmp(szModName, name) == 0) return (DWORD)hMods[i];
            }
        }
    }

    CloseHandle(hProcess);

    return 0;
}

int main()
{
    DWORD pID = GetProcId(L"gta_sa.exe");

    HANDLE pGta = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
    DWORD pSamp = (DWORD)get_module(pGta, L"samp.dll");

    float X = 0, Y = 0, Z = 0;

    while (true)
    {
        ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x76F3B8 + 0x14 + 0x30), &X, 8, 0);
        ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x76F3B8 + 0x14 + 0x34), &Y, 8, 0);
        ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x76F3B8 + 0x14 + 0x38), &Z, 8, 0);
        cout << "My Coord: " << X << " | " << Y << " | " << Z << endl;
    }
}
 
У

Удалённый пользователь 123482

Гость
1. Ваш вопрос. Решил на самоизоляции попробовать написать на C++ простой код. Раньше этого не делал, поэтому возможны костыли и небрежность. Суть в чем - выводится не то, что нужно, а именно:
Посмотреть вложение 53043

Может кто показать ошибку?
C++:
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>
#include <tchar.h>
#include <psapi.h>

using namespace std;

DWORD GetProcId(const wchar_t* procname)
{
    PROCESSENTRY32 pe;
    HANDLE hSnap;

    pe.dwSize = sizeof(PROCESSENTRY32);
    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (Process32First(hSnap, &pe)) {
        do {
            if (wcscmp(pe.szExeFile, procname) == 0)
                break;
        } while (Process32Next(hSnap, &pe));
    }
    return pe.th32ProcessID;
}

DWORD get_module(HANDLE hProcess, const wchar_t* name)
{
    HMODULE hMods[1024];
    DWORD cbNeeded;
    unsigned int i;


    if (EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
    {
        for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
        {
            TCHAR szModName[MAX_PATH];

            if (GetModuleBaseName(hProcess, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR)))
            {
                if (wcscmp(szModName, name) == 0) return (DWORD)hMods[i];
            }
        }
    }

    CloseHandle(hProcess);

    return 0;
}

int main()
{
    DWORD pID = GetProcId(L"gta_sa.exe");

    HANDLE pGta = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
    DWORD pSamp = (DWORD)get_module(pGta, L"samp.dll");

    float X = 0, Y = 0, Z = 0;

    while (true)
    {
        ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x76F3B8 + 0x14 + 0x30), &X, 8, 0);
        ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x76F3B8 + 0x14 + 0x34), &Y, 8, 0);
        ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x76F3B8 + 0x14 + 0x38), &Z, 8, 0);
        cout << "My Coord: " << X << " | " << Y << " | " << Z << endl;
    }
}
Зачем тебе тут самп, если получить можно с помощью указателя локального CPed'a
 

checkdasound

Известный
Проверенный
963
410
Как строку перевести в utf-8? Есть ли штука типа u8, но чтобы работала еще и с переменными?
 

-raymond-

Известный
110
9
если у меня в длл будет использоваться имгуи, и при условии что я запротекчу ее VMProtect, возможно ли будет по сигнатуре файла распознать что там есть имгуи?
 

FormatC

Участник
94
29
если у меня в длл будет использоваться имгуи, и при условии что я запротекчу ее VMProtect, возможно ли будет по сигнатуре файла распознать что там есть имгуи?
VMProtect снимается на изи, и очень сильно нагружает процесс gta, все другие распаковщики так же снимаются, и вообще обязательно найдётся человек, который снимет твой протект за плату. Смысл тогда защищать его? И да, с VMProtect при правильных настройках не будет видно что там ImGui.
---------------------------------------------------
Кто знает как можно сделать поиск hex строк или просто строк в памяти процесса gta? Искал долго оч, так и не нашел, вроде пробывал чекать в исходниках Process Hacker там где функция Memory -> Strings но тоже не нашел. буду оч благодарен если подскажите КОДОМ
 
Последнее редактирование:

SKIC

Известный
64
0
Как подключить imgui для gta sa в ASI? если вопрос слишком банальный, скажите что хоть изучить чтобы понять как подключить.
 

papercut

Известный
125
25
я задолбался искать решение, тыкать наугад и так далее. Может тут кто-то сталкивался с таким.. Делю SF плагин, котоырй по команде в чат просто тупо берет цвет указанного пиксела.
Проблемная функция:
void CALLBACK getp(std::string param) {
    DWORD color = GetPixel(GetDC(GetActiveWindow()), 380, 770);
    char c[4];
    sprintf(c, "%d", color);
    sampAddChatMessage(D3DCOLOR_XRGB(0xAA, 0xAA, 0xAA), c);
}

При попытке сборки получаю:
 
Последнее редактирование:

san0

Известный
Друг
411
268
Желательно поставить для всех конфигураций
iu0pcw5gyU.png

И добавить
3N12jo0hK1.png
По поводу кода, как-то так хоть, правда еще желательно больше проверок разных на валидность GetDC, например, и т.д.
C++:
#include <regex>
#include <charconv>
// ...
void __stdcall getp(std::string param) {
    std::smatch match;
    const auto regex_result = std::regex_search(param, match, std::regex(R"eof((\d+)\s+(\d+))eof"));

    struct DCResource {
        HWND hwnd;
        HDC hdc;
        DCResource(const HWND hwnd = ::GetActiveWindow()) : hwnd(hwnd), hdc(::GetDC(this->hwnd)) {}
        ~DCResource() {
            ::ReleaseDC(hwnd, hdc);
        }
        inline HDC operator*() {
            return hdc;
        }
    };

    int numbers[2];
    for (unsigned int i = 0; i < 2; i++) {
        bool defaults = true;

        if (regex_result) {
            const auto str = match[i + 1].str();
            if (std::from_chars(str.data(), str.data() + str.size(), numbers[i]).ec == std::errc()) {
                defaults = false;
            }
        }
          
        if (defaults) {
            SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_RGBA(255, 255, 0, 0),
                "<warning>: Defaulting %s to 0", !i ? "X" : "Y");
            numbers[i] = 0;
        }
    }

    union {
        struct {
            unsigned red   : 8;
            unsigned green : 8;
            unsigned blue  : 8;
            unsigned alpha : 8;
        };
        COLORREF as_int;
    } color{ .as_int = ::GetPixel(*DCResource{}, numbers[0], numbers[1]) };

    if (color.as_int == CLR_INVALID) {
        SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(255, 255, 0),
            "<error>: Color cannot be retrieved");
    }
    else {
        SF->getSAMP()->getChat()->AddChatMessage(color.as_int | 0xFF000000,
            "Color of the point %d %d is the following: %u (0x%x) (R: %u, G: %u, B: %u)",
                numbers[0], numbers[1], color.as_int, color.as_int,
                color.red,
                color.green,
                color.blue
            );
    }
}
 
Последнее редактирование:
  • Нравится
Реакции: papercut

-raymond-

Известный
110
9
VMProtect снимается на изи, и очень сильно нагружает процесс gta, все другие распаковщики так же снимаются, и вообще обязательно найдётся человек, который снимет твой протект за плату. Смысл тогда защищать его? И да, с VMProtect при правильных настройках не будет видно что там ImGui.
---------------------------------------------------
Кто знает как можно сделать поиск hex строк или просто строк в памяти процесса gta? Искал долго оч, так и не нашел, вроде пробывал чекать в исходниках Process Hacker там где функция Memory -> Strings но тоже не нашел. буду оч благодарен если подскажите КОДОМ
знаешь как правильно настроить вмпротект чтобы не было видно имгуи?