Как сделать активацию по читкоду в sf?
// 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"))
{
// ...
}
Попробуй использовать Wide-аналог этой функции - swscanf_s. В проекте используй набор символов Юникода (Unicode Character Set). Отпиши, помогло или нет.как заставить sscanf работать с русскими символами?
Странно, ведь у меня работает GetDC и при простом подключении Windows.h. Не забывай отрисовочный контекст (DC) чистить, когда ты им воспользовался, и он тебе не нужен. Т.к используется ф-я GetDC, то чистим при помощи ReleaseDC. Рекомендую ознакомиться с этой страницей - http://www.vsokovikov.narod.ru/New_MSDN_API/D_context/fn_releasedc.htm. В частности, нам интересен текст под заголовком "Замечания". Если ты скинул код неполностью и ты используешь эту функцию где-то у себя дальше, то прошу прощения за наезд.Ошибка 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; }
написано же. попытка чтения защищенного участка памяти. снимай virtual protectСпасибо большое, но уже
#pragma comment(lib, "User32.lib") #include <Dbghelp>
всё решило. Теперь у меня проблема с чтением памяти, или что-то вроде, не могу решить уже второй день. Выше мой вопрос.Посмотреть вложение 55507
Нужно снять защиту с памяти, записать туда необходимое значение и вернуть защиту.Спасибо большое, но уже
#pragma comment(lib, "User32.lib") #include <Dbghelp>
всё решило. Теперь у меня проблема с чтением памяти, или что-то вроде, не могу решить уже второй день. Выше мой вопрос.Посмотреть вложение 55507
Чет там все для шарпа, я не понимаю. Понял, что память не может читаться, но почему?
вот это вообще непонятно куда и зачем
Посмотреть вложение 55331
так ты тоже самое делаешь
удали 615-620 строкиНичего не понимаю, разве я таким образом не читаю память 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; }
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));
тебе стоит проделать такую же работу на 630-639 строкахЭто то, о чем сейчас Алфёров написал? Ошибка пропала, но работать не хочет.