
Originally Posted by
Ren4rd
why don't you just use same mask as your aob pattern?
Code:
DWORD JumpAddy = FindPattern("Transformice.exe",
"\xF3\x0F\x7E\x40\x10\x66\x0F\xD6\x45\x88\x8D\x8E\x60\x40\x00\x00\x8D\x55\xB0\xE8\xCE\x63\x67\x66\xF3\x0F\x7E\x4D\x88\x8B\xD0",
"xxxxxxxxx?x???xxxx?x????xxxx?xx");
I've tried this, and it's the same thing :-c
That's the code i get from fleeps tutorial:
Code:
#include <iostream>
#include <Windows.h>
#include <tlhelp32.h>
#include <Psapi.h>
//Print our pattern scan results if necessary
void MsgBoxAddy(DWORD addy)
{
char szBuffer[1024];
sprintf(szBuffer, "Addy: %02x", addy);
MessageBox(NULL, szBuffer, "Title", MB_OK);
}
//Get all module related info, this will include the base DLL.
//and the size of the module
MODULEINFO GetModuleInfo(char *szModule)
{
MODULEINFO modinfo = { 0 };
HMODULE hModule = GetModuleHandle(szModule);
if (hModule == 0)
return modinfo;
GetModuleInformation(GetCurrentProcess(), hModule, &modinfo, sizeof(MODULEINFO));
return modinfo;
}
void WriteToMemory(uintptr_t addressToWrite, char* valueToWrite, int byteNum)
{
//used to change our file access type, stores the old
//access type and restores it after memory is written
unsigned long OldProtection;
//give that address read and write permissions and store the old permissions at oldProtection
VirtualProtect((LPVOID)(addressToWrite), byteNum, PAGE_EXECUTE_READWRITE, &OldProtection);
//write the memory into the program and overwrite previous value
memcpy((LPVOID)addressToWrite, valueToWrite, byteNum);
//reset the permissions of the address back to oldProtection after writting memory
VirtualProtect((LPVOID)(addressToWrite), byteNum, OldProtection, NULL);
}
DWORD FindPattern(char *module, char *pattern, char *mask)
{
//Get all module related information
MODULEINFO mInfo = GetModuleInfo(module);
//Assign our base and module size
//Having the values right is ESSENTIAL, this makes sure
//that we don't scan unwanted memory and leading our game to crash
DWORD base = (DWORD)mInfo.lpBaseOfDll;
DWORD size = (DWORD)mInfo.SizeOfImage;
//Get length for our mask, this will allow us to loop through our array
DWORD patternLength = (DWORD)strlen(mask);
for (DWORD i = 0; i < size - patternLength; i++)
{
bool found = true;
for (DWORD j = 0; j < patternLength; j++)
{
//if we have a ? in our mask then we have true by default,
//or if the bytes match then we keep searching until finding it or not
found &= mask[j] == '?' || pattern[j] == *(char*)(base + i + j);
}
//found = true, our entire pattern was found
//return the memory addy so we can write to it
if (found)
{
return base + i;
}
}
return NULL;
}
And this is my dllmain
Code:
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>
#include <Psapi.h>
#include "Functions.h"
char FakeWJ[] = "\x45";
void InitiateHooks()
{
DWORD PseudumAddy = 0xDEA1DBEEF;
MsgBoxAddy(PseudumAddy);
MessageBox(NULL, "Engine", "starting...", MB_OK);
DWORD JumpAddy = FindPattern("Transformice.exe",
"\xF3\x0F\x7E\x40\x10\x66\x0F\xD6\x45\x88\x8D\x8E\x60\x40\x00\x00\x8D\x55\xB0\xE8\xCE\x63\x67\x66\xF3\x0F\x7E\x4D\x88\x8B\xD0",
"xxxxxxxxx?x???xxxx?x????xxxx?xx");
MsgBoxAddy(JumpAddy);
}
BOOL WINAPI DllMain(
HINSTANCE hinstDLL,
DWORD fdwReason,
LPVOID lpReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
MessageBoxA(NULL, "Attached", "", 0);
InitiateHooks();
break;
}
}
Maybe there's something wrong with the code?
edit: it also works on sigtest
Bingo!
After changing this:
Code:
//DWORD base = (DWORD)mInfo.lpBaseOfDll;
//DWORD size = (DWORD)mInfo.SizeOfImage;
DWORD base = 0xe710000;
DWORD size = 0x180000;
it works.
How do i get the correctly base and size from mInfo?
note: if i restart the game base and size changes