В каких случаях лучше использовать NopEx и PatchEx, а когда WriteProcessMemory?
Снизу функция, делающая бесконечные патроны.
Код1:
Код2:
Снизу функция, делающая бесконечные патроны.
Код1:
C++:
void AmmoHack(Memory& mem, bool state)
{
if (state == true)
{
mem.NopEx((BYTE*)(mem.moduleBase + 0xC73EF), 2);
}
else
{
mem.PatchEx((BYTE*)(mem.moduleBase + 0xC73EF), (BYTE*)"\xFF\x08", 2);
}
}
Код2:
C++:
void AmmoHack(Memory& mem, bool state)
{
uintptr_t ammoInClipAddr = mem.ReadMemoryChain(mem.moduleBase + offsets::localPlayer, {0x364, offsets::currentWeaponClass, offsets::gunClipAmmo});
if (state == false)
{
originalValues::clipAmmo = mem.Read<short>(ammoInClipAddr);
}
else if (state == true)
{
mem.Write(ammoInClipAddr, originalValues::clipAmmo ? originalValues::clipAmmo : 1);
}
}
C++:
template<class T>
T Read(uintptr_t address)
{
T value{};
ReadProcessMemory(hProcess, (LPCVOID)address, &value, sizeof(value), NULL);
return value;
}
template<class T>
void Write(uintptr_t address, T value)
{
WriteProcessMemory(hProcess, (LPVOID)address, &value, sizeof(value), NULL);
}
void Memory::PatchEx(BYTE* dst, BYTE* src, unsigned int size)
{
DWORD oldprotect;
VirtualProtectEx(hProcess, dst, size, PAGE_EXECUTE_READWRITE, &oldprotect);
WriteProcessMemory(hProcess, dst, src, size, nullptr);
VirtualProtectEx(hProcess, dst, size, oldprotect, &oldprotect);
}
void Memory::NopEx(BYTE* dst, unsigned int size)
{
BYTE* nopArray = new BYTE[size];
memset(nopArray, 0x90, size);
PatchEx(dst, nopArray, size);
delete[] nopArray;
}