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

Carrentine

Потрачен
569
463
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
это общий раздел с++, да и разница с длл и exe не велика, не неси хуйни
я сказал в основном.

в EXE мы работаем со своим процессом, а в DLL с чужим.
форум в основном посвещен GTA:SAMP, т.е соответственно работа с чужим процессом 😀
 

Gafask

Участник
137
13
C++:
DWORD adr = GetModuleHandle("samp.dll") + 0x12345
Если ее юзать то выдает ошибку - значение типа "HMODULE" нельзя использовать для инициализации сущности типа "DWORD" .
Отрывок из main.h:
float* KZ = (float*)(("samp.dll") + 0x38A888);
= так тоже не хочет , и если вроде как прочитать тоже не получатся .
 

Cake_

Потрачен
Проверенный
263
313
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Если ее юзать то выдает ошибку - значение типа "HMODULE" нельзя использовать для инициализации сущности типа "DWORD" .
Отрывок из main.h:
float* KZ = (float*)(("samp.dll") + 0x38A888);
= так тоже не хочет , и если вроде как прочитать тоже не получатся .
C++:
DWORD dwSamp = (DWORD)GetModuleHandle(L"samp.dll");
DWORD var = (DWORD)(dwSamp + 0x000);
 
  • Нравится
Реакции: Сырник и Gafask

0xNull_Dll

Известный
143
21
Слушайте, такое дело:

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

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

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

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

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

Как это вообще работает?
 

Dark_Knight

Me, me and me.
Друг
4,078
2,095
Советую уйти в RakPeer и RakClient хуки. ПО твоей теме пару страниц назад уже был подобный вопрос.
 

_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
253
я хочу определить загружен ли в игру определенный плагин, но не по его названию а по его внутренностям, ну типа плагин+оффсет и по этому адресу должна быть определенная строчка если это так, то плагин загружен
Нихуя ты выдал, мне даже интересно стало для чего ?🙃
 

Stiopko

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

Carrentine

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

Так как название файла сф плагина можна пожно изменить я написал функцию которая по идее должна определять загружен ли плагин в игру или нет, название плагина 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_