I was bored, pretty much it easily allows you to manage all your addresses.
There are some things you can do to easily make this better(Get the original bytes for the addresses automatically), but hey its for the public
Credits: mmbob, nubzgetskillz
Code:
/*===============================|
|Simple MemoryMgr Class |
| |
|By CodeDemon |
|Credits: mmbob, nubzgetskillz |
|===============================*/
#include <Windows.h>
#define ON true
#define OFF false
#define ingamecheck 0x37829B4C
struct memory{
char * name;
bool enabled;
int address;
int size;
char * original;
char * newbytes;
};
class MemoryMgr{
public:
memory mem[99]; //change 99 to however many addresses you have as to not allocate too much memory
void AddOffset(char * name, int address, char * original, char * newbytes , int size);
void UnPatchAll();
void PatchBytes(char * name, bool onoff);
private:
int adrcount;
};
void MemoryMgr::AddOffset(char * name, int address, char * original, char * newbytes, int size)
{
mem[adrcount].address = address;
mem[adrcount].name = name;
mem[adrcount].size = size;
mem[adrcount].original = original;
mem[adrcount].newbytes = newbytes;
mem[adrcount].enabled = false;
adrcount++;
}
void MemoryMgr::UnPatchAll()
{
for(int i = 0; i<(sizeof(mem)/sizeof(memory)); i++){
memcpy((LPVOID)mem[i].address,mem[i].original,mem[i].size);
mem[i].enabled = false;
}
}
void MemoryMgr::PatchBytes(char * name, bool onoff)
{
for(int i = 0; i<(sizeof(mem)/sizeof(memory)); i++){
if(mem[i].name == name){
if(*(int*)ingamecheck == 1){
if(onoff == true){
memcpy((LPVOID)mem[i].address,mem[i].newbytes,mem[i].size);
mem[i].enabled = true;
} else {
memcpy((LPVOID)mem[i].address,mem[i].original,mem[i].size);
mem[i].enabled = false;
}
} else {
memcpy((LPVOID)mem[i].address,mem[i].original,mem[i].size);
}
}
}
}
How to use:
Paste the code into a new header file.
Create a new instance of the class, preferably where your DLL main function is, or where your hacks are. You can also extern it if that will be easier for you.
In your DLL main, initiate the addresses, this is done, so that you dont initiate addresses more than once.
Code:
bool APIENTRY DllMain(HMODULE hMod, DWORD pReason, LPVOID lpReserved)
{
if (pReason == DLL_PROCESS_ATTACH)
{
mempatch.AddOffset("NoReload", 0x374BB8F4, "\x0F\x84\xB1\x01\x00\x00", "\x90\x90\x90\x90\x90\x90", 6);
mempatch.AddOffset("SuperBullets", 0x374B65D6, "\x0F\x94\xC0", "\x90\x90\x90", 3);
}
return true;
}
Use:
Code:
mempatch.PatchBytes("HACKNAME",ON);
or
Code:
mempatch.PatchBytes("HACKNAME",OFF);
The function automatically checks if bytes can be patched(patches only if in game), and patches them accordingly.