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

_Vine_

Активный
154
57
Слушайте, такое дело:

Есть кастомный самп клиент, там оффсеты другие (луашные методы, связанные с сампом там не работают)

Нужно как-то ловить функцию SetPlayerHealth (0x15BA0) и игнорировать её посредством чтения памяти, а не какими-либо готовыми функциями sampfuncs'a или луа.

Как это можно сделать?

Как я понял, сначала нужно взять хэндл dll'а сампа
GetModuleHandle(L"samp.dll");

И к этому значению прибавить 0x15BA0?

Как это вообще работает?
Как вариант, в Cheat Engine поставить брейкпоинт на запись в адрес здоровья игрока, заставить сервер вызвать SetPlayerHealth, найти место где устанавливается хп, это и будет функция SetPlayerHealth. Для нопа функции в ее начале установить байты C2 04 00
 

Stiopko

Известный
Проверенный
307
218
Помомогите пожалуйста с опредением загруженого модуля(сф плагина) в гташку?

Так как название файла сф плагина можна пожно изменить я написал функцию которая по идее должна определять загружен ли плагин в игру или нет, название плагина CMDHelper.sf

я хотел делать так если в памяти выделенной под модуль есть определенная строка то это тот модуль который мне нужен, но не не работает

C++:
#define CMDHELPER_CHECK 0x172C8

HANDLE CmdEdit::CheckCMDHelperHANDLE() {
    static const char* checkStr = "{FFA0661D}[blast.hk] {FFFFFF}CMD helper by {FFA0661D}MISTER_GONWIK";

    HANDLE hProcess;
    HMODULE hMods[1024];
    DWORD cbNeeded;
    
    hProcess = GetCurrentProcess();

    if (NULL == hProcess)
        return NULL;

    HMODULE ret = NULL;

    if (K32EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded) != NULL) {
        
        DWORD dwProt;
        MODULEINFO module_info;
        MEMORY_BASIC_INFORMATION mem_info;
        TCHAR szModName[MAX_PATH];
        DWORD base;
        for (int i = 0; i < (cbNeeded / sizeof(HMODULE)) && ret == NULL; i++) {
            memset(&module_info, 0, sizeof(module_info));
            memset(&mem_info, 0, sizeof(mem_info));

            if (K32GetModuleFileNameExA(hProcess, hMods[i], szModName,
                sizeof(szModName) / sizeof(TCHAR)) == NULL) continue;

            if (K32GetModuleInformation(hProcess, hMods[i], &module_info, sizeof(module_info)) == NULL)
                continue;
            
            base = (DWORD)module_info.lpBaseOfDll;
            if (module_info.SizeOfImage > CMDHELPER_CHECK + strlen(checkStr)+1) {
                if (VirtualQuery((void*)(base + CMDHELPER_CHECK), &mem_info, sizeof(mem_info)) != NULL) {
                    if (mem_info.Protect == PAGE_READONLY &&
                        (DWORD)mem_info.AllocationBase + mem_info.RegionSize > base + CMDHELPER_CHECK + strlen(checkStr) + 1) {
                        if (!strcmp((const char*)(hMods[i] + CMDHELPER_CHECK), checkStr))
                            ret = hMods[i];
                        else SF->getSAMP()->getChat()->AddChatMessage(-1, "INC STR %s", szModName);
                    }
                }
                else SF->getSAMP()->getChat()->AddChatMessage(-1, "ERR %s (0x%08X) %u", szModName, hMods[i], GetLastError());
            }
            
        }
    }

    CloseHandle(hProcess);
    return ret;
}
 

Stiopko

Известный
Проверенный
307
218
Я что-то не понял. Что ты конкретно хочешь сделать?
я хочу определить загружен ли в игру определенный плагин, но не по его названию а по его внутренностям, ну типа плагин+оффсет и по этому адресу должна быть определенная строчка если это так, то плагин загружен
 

SiTrak

Известный
192
251
я хочу определить загружен ли в игру определенный плагин, но не по его названию а по его внутренностям, ну типа плагин+оффсет и по этому адресу должна быть определенная строчка если это так, то плагин загружен
Нихуя ты выдал, мне даже интересно стало для чего ?🙃
 

Stiopko

Известный
Проверенный
307
218
Нихуя ты выдал, мне даже интересно стало для чего ?🙃
Ну CMDHelper популярный плагин, у меня в плагине есть функция подмены главного символа команды типа / на что-то другое например на #, если я заменяю на # то CMDHelper перестает подсказывать доступные команды, я нашел адрес для патча плагина, теперь нужно только определить загружен он или нет)
 
  • Нравится
Реакции: SiTrak

Carrentine

Потрачен
570
460
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Помомогите пожалуйста с опредением загруженого модуля(сф плагина) в гташку?

Так как название файла сф плагина можна пожно изменить я написал функцию которая по идее должна определять загружен ли плагин в игру или нет, название плагина CMDHelper.sf

я хотел делать так если в памяти выделенной под модуль есть определенная строка то это тот модуль который мне нужен, но не не работает

C++:
#define CMDHELPER_CHECK 0x172C8

HANDLE CmdEdit::CheckCMDHelperHANDLE() {
    static const char* checkStr = "{FFA0661D}[blast.hk] {FFFFFF}CMD helper by {FFA0661D}MISTER_GONWIK";

    HANDLE hProcess;
    HMODULE hMods[1024];
    DWORD cbNeeded;
   
    hProcess = GetCurrentProcess();

    if (NULL == hProcess)
        return NULL;

    HMODULE ret = NULL;

    if (K32EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded) != NULL) {
       
        DWORD dwProt;
        MODULEINFO module_info;
        MEMORY_BASIC_INFORMATION mem_info;
        TCHAR szModName[MAX_PATH];
        DWORD base;
        for (int i = 0; i < (cbNeeded / sizeof(HMODULE)) && ret == NULL; i++) {
            memset(&module_info, 0, sizeof(module_info));
            memset(&mem_info, 0, sizeof(mem_info));

            if (K32GetModuleFileNameExA(hProcess, hMods[i], szModName,
                sizeof(szModName) / sizeof(TCHAR)) == NULL) continue;

            if (K32GetModuleInformation(hProcess, hMods[i], &module_info, sizeof(module_info)) == NULL)
                continue;
           
            base = (DWORD)module_info.lpBaseOfDll;
            if (module_info.SizeOfImage > CMDHELPER_CHECK + strlen(checkStr)+1) {
                if (VirtualQuery((void*)(base + CMDHELPER_CHECK), &mem_info, sizeof(mem_info)) != NULL) {
                    if (mem_info.Protect == PAGE_READONLY &&
                        (DWORD)mem_info.AllocationBase + mem_info.RegionSize > base + CMDHELPER_CHECK + strlen(checkStr) + 1) {
                        if (!strcmp((const char*)(hMods[i] + CMDHELPER_CHECK), checkStr))
                            ret = hMods[i];
                        else SF->getSAMP()->getChat()->AddChatMessage(-1, "INC STR %s", szModName);
                    }
                }
                else SF->getSAMP()->getChat()->AddChatMessage(-1, "ERR %s (0x%08X) %u", szModName, hMods[i], GetLastError());
            }
           
        }
    }

    CloseHandle(hProcess);
    return ret;
}
Нихуя не понял, но очень интересно.
 

Roger571

Известный
58
31
Ну CMDHelper популярный плагин, у меня в плагине есть функция подмены главного символа команды типа / на что-то другое например на #, если я заменяю на # то CMDHelper перестает подсказывать доступные команды, я нашел адрес для патча плагина, теперь нужно только определить загружен он или нет)
Определяй не по строке, а по массиву байт. Пример можешь посмотреть в собейте, там так детектится версия сампа
 
  • Нравится
Реакции: Stiopko и Cake_

LuaQ

Участник
84
27
Каким способом лучше всего проверять директорию плагина? Как извлечь расширение файла из строки? Нуждаюсь в самых лучших способах
 

ALF

Известный
Проверенный
320
534
Каким способом лучше всего проверять директорию плагина? Как извлечь расширение файла из строки? Нуждаюсь в самых лучших способах
найти плагины в папке? если я правильно понял, то вот
C++:
#include <filesystem>
#include <cctype>

namespace fs = std::filesystem;

std::vector<std::string> FindFiles()
{
    std::vector<std::string> vFiles;

    for (auto p : fs::directory_iterator(fs::current_path().string().append("\\SAMPFUNCS")))
    {
        if (!is_regular_file(p.status())) continue;

        auto strExtension = p.path().extension().string();
        std::transform(strExtension.begin(), strExtension.end(), strExtension.begin(), [](BYTE c) { return std::tolower(c); });

        if (!strExtension.compare(".sf")) vFiles.push_back(p.path().filename().string());
    }

    return vFiles;
}
 
  • Нравится
Реакции: LuaQ

atizoff

приобретаю кашель за деньги
Проверенный
1,295
1,177
ребят есть у кого getproccessbyid, вставлять char, получать int?