_=Gigant=_
Известный
- 134
- 191
are there any tutorials on how to find this SAMP_CMP "F8036A004050518D4C24" ?
Как вариант, в Cheat Engine поставить брейкпоинт на запись в адрес здоровья игрока, заставить сервер вызвать SetPlayerHealth, найти место где устанавливается хп, это и будет функция SetPlayerHealth. Для нопа функции в ее начале установить байты C2 04 00Слушайте, такое дело:
Есть кастомный самп клиент, там оффсеты другие (луашные методы, связанные с сампом там не работают)
Нужно как-то ловить функцию SetPlayerHealth (0x15BA0) и игнорировать её посредством чтения памяти, а не какими-либо готовыми функциями sampfuncs'a или луа.
Как это можно сделать?
Как я понял, сначала нужно взять хэндл dll'а сампа
GetModuleHandle(L"samp.dll");
И к этому значению прибавить 0x15BA0?
Как это вообще работает?
#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;
}
я хочу определить загружен ли в игру определенный плагин, но не по его названию а по его внутренностям, ну типа плагин+оффсет и по этому адресу должна быть определенная строчка если это так, то плагин загруженЯ что-то не понял. Что ты конкретно хочешь сделать?
Нихуя ты выдал, мне даже интересно стало для чего ?🙃я хочу определить загружен ли в игру определенный плагин, но не по его названию а по его внутренностям, ну типа плагин+оффсет и по этому адресу должна быть определенная строчка если это так, то плагин загружен
Ну CMDHelper популярный плагин, у меня в плагине есть функция подмены главного символа команды типа / на что-то другое например на #, если я заменяю на # то CMDHelper перестает подсказывать доступные команды, я нашел адрес для патча плагина, теперь нужно только определить загружен он или нет)Нихуя ты выдал, мне даже интересно стало для чего ?🙃
Нихуя не понял, но очень интересно.Помомогите пожалуйста с опредением загруженого модуля(сф плагина) в гташку?
Так как название файла сф плагина можна пожно изменить я написал функцию которая по идее должна определять загружен ли плагин в игру или нет, название плагина 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; }
Определяй не по строке, а по массиву байт. Пример можешь посмотреть в собейте, там так детектится версия сампаНу CMDHelper популярный плагин, у меня в плагине есть функция подмены главного символа команды типа / на что-то другое например на #, если я заменяю на # то CMDHelper перестает подсказывать доступные команды, я нашел адрес для патча плагина, теперь нужно только определить загружен он или нет)
Открыть .sln файл с собрать проектКак из исходника сделать длл?
найти плагины в папке? если я правильно понял, то вотКаким способом лучше всего проверять директорию плагина? Как извлечь расширение файла из строки? Нуждаюсь в самых лучших способах
#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;
}
ребят есть у кого getproccessbyid, вставлять char, получать int?
DWORD GetPID(char* window)
{
HWND idf = FindWindowA(NULL , window);
DWORD pid;
return GetWindowThreadProcessId(
idf,
&pid);
}