There are probably still some errors with this (I have never coded hacks before; I wrote this yesterday in the span of about 20 minutes), but I thought I'd share my ideas. The idea is to make a more efficient pattern finding function. I based this off of the boyer-moore string searching algorithm.
Code:
#define realAddy( cast, base, offset ) (cast)((DWORD)(base) + (DWORD)(offset))
template <typename T>
bool exist(BYTE part, T whole)
{
BYTE *start = (BYTE*)&whole;
for(DWORD loc = 0; loc < sizeof(whole); loc++)
if(*(BYTE*)(start + loc) == part) return true;
return false;
}
DWORD lastLocationOfByte(BYTE part, T whole)
{
BYTE *start = (BYTE*)&whole;
for(DWORD loc = 0; loc < sizeof(whole); loc++)
if(*(BYTE*)(start + sizeof(whole) - loc) == part) return (sizeof(whole) - loc);
}
T *searchAddy(T val)
{
MEMORY_BASIC_INFORMATION memInfo;
VirtualQuery(NULL, &memInfo, sizeof(MEMORY_BASIC_INFORMATION));
size_t total = memInfo.RegionSize;
T *first = (T*)memInfo.BaseAddress;
size_t next = sizeof(val);
T *addy = (T*)(--(&val + next));
bool exist = false;
T *loc;
unsigned char check;
for(DWORD n = (next - 1); n < total;)
{
DWORD spot;
for(spot = 0; *(unsigned char*)(first + n - spot) == *(unsigned char*)(addy - spot); spot++);
if(spot == next) return realAddy( T*, first, n );
else if(exist(*(BYTE*)(first + n), val)
n += lastLocationOfByte(*(BYTE*)(first + n), val);
else n += next;
}
return false;
}
I haven't tested this yet because I am still working on making a complete hack (I don't want to use someone else's base). If you try this out, please tell me how it worked for you.
The game crashes. I've looked at some other PTC functions and it seems that most people prefer to use C strings. I prefer having access to string methods for my decryption function, but this may be causing my issue. I will update when I get different results.
Originally Posted by supercarz1991
same here, i just redownloaded the lithtech jupiter source and something called XNA engine
I'm waiting for the cryengine 3 sdk. I'm interesting in making an RTS.
Umm... yes. A std::string can't fit in an argument, so the compiler actually passes a pointer to the std::string. PTC wants a pointer to a char array, not a string.
@CAFlames
Originally Posted by mmbob
Fixed. That's why people use C strings.
Well, it still crashes. Thanks for the help though. I will use this function as a scanner and see if that portion of the hack is working.
Originally Posted by yodaliketaco
Well, it still crashes. Thanks for the help though. I will use this function as a scanner and see if that portion of the hack is working.
You could show a message box with the value of PTCAddy in it to make sure your scanner is working correctly.
Now that I'm using the function in a logger it seems to be crashing combat arms. I'm not sure where the problem is yet; I will look again tomorrow. If anyone looks at/implements the function, please let me know your results.
Originally Posted by CAFlames
Don't really have time to look at it, but good job.
OMFG, whos the bigshot now?
Originally Posted by CAFlames
Don't really have time to look at it, but good job.
If you didn't even look at the thread, why would you come in here and post. You don't have time to look at the code but you have time to raise your post count with spam, huh?
What were you thinking when you clicked the post button...