mirror of
https://github.com/GameHackingBook/GameHackingCode
synced 2026-06-08 11:08:54 +00:00
159 lines
3.7 KiB
C++
159 lines
3.7 KiB
C++
#include <iostream>
|
|
#include <windows.h>
|
|
|
|
/* numeric values */
|
|
unsigned char ubyteValue = 0xFF;
|
|
char byteValue = 0xFE;
|
|
|
|
unsigned short uwordValue = 0x4142;
|
|
short wordValue = 0x4344;
|
|
|
|
unsigned int udwordValue = 0xDEADBEEF;
|
|
int dwordValue = 0xDEADBEEF;
|
|
|
|
unsigned long long ulongLongValue = 0xEFCDAB8967452301;
|
|
long long longLongValue = 0xEFCDAB8967452301;
|
|
|
|
float floatValue = 1337.7331;
|
|
|
|
/* string values */
|
|
char* thinStringP = "my_thin_terminated_value_pointer";
|
|
char thinStringA[40] = "my_thin_terminated_value_array";
|
|
wchar_t* wideStringP = L"my_wide_terminated_value_pointer";
|
|
wchar_t wideStringA[40] = L"my_wide_terminated_value_array";
|
|
|
|
/* structures */
|
|
struct MyStruct {
|
|
unsigned char ubyteValue;
|
|
char byteValue;
|
|
unsigned short uwordValue;
|
|
short wordValue;
|
|
unsigned int udwordValue;
|
|
int dwordValue;
|
|
unsigned long long ulongLongValue;
|
|
char interruptor;
|
|
long long longLongValue;
|
|
float floatValue;
|
|
};
|
|
|
|
/* classes with no VF tables */
|
|
class bar {
|
|
public:
|
|
bar() : bar1(0x898989), bar2(0x10203040) {}
|
|
void myfunction() { bar1++; }
|
|
int bar1, bar2;
|
|
};
|
|
|
|
/* classes with VF tables */
|
|
class foo {
|
|
public:
|
|
foo() : myValue1(0xDEADBEEF), myValue2(0xBABABABA) {}
|
|
int myValue1;
|
|
static int myStaticValue;
|
|
virtual void bar() { printf("foo::bar()\n"); }
|
|
virtual void baz() { printf("foo::baz()\n"); }
|
|
virtual void barbaz() {}
|
|
int myValue2;
|
|
};
|
|
int foo::myStaticValue = 0x12121212;
|
|
class fooa : public foo {
|
|
public:
|
|
fooa() : foo() {}
|
|
virtual void bar() { printf("fooa::bar()\n"); }
|
|
virtual void baz() { printf("fooa::baz()\n"); }
|
|
};
|
|
class foob : public foo {
|
|
public:
|
|
foob() : foo() { }
|
|
virtual void bar() { printf("foob::bar()\n"); }
|
|
virtual void baz() { printf("foob::baz()\n"); }
|
|
};
|
|
|
|
/* class protection */
|
|
class baz {
|
|
public:
|
|
baz() : baz1(0x11111111), baz2(0x22222222),
|
|
baz3(0x33333333), baz4(0x44444444) {}
|
|
int baz1, baz2;
|
|
void printStuff()
|
|
{
|
|
printf("0x%x : baz->baz1\n", &this->baz1);
|
|
printf("0x%x : baz->baz2\n", &this->baz2);
|
|
printf("0x%x : baz->baz3\n", &this->baz3);
|
|
printf("0x%x : baz->baz4\n", &this->baz4);
|
|
}
|
|
private:
|
|
int baz3, baz4;
|
|
};
|
|
|
|
int main(void)
|
|
{
|
|
/* just using global values so they don't get optimized away */
|
|
ubyteValue = ubyteValue;
|
|
byteValue = byteValue;
|
|
wordValue = wordValue;
|
|
uwordValue = uwordValue;
|
|
udwordValue = udwordValue;
|
|
dwordValue = dwordValue;
|
|
ulongLongValue = ulongLongValue;
|
|
longLongValue = longLongValue;
|
|
floatValue = floatValue;
|
|
|
|
thinStringP = thinStringP;
|
|
if (thinStringA){}
|
|
wideStringP = wideStringP;
|
|
if (wideStringA){}
|
|
|
|
/* printing addresses so we can easily find the dumps */
|
|
printf("0x%x : ubyteValue\n", &ubyteValue);
|
|
printf("0x%x : thinStringP\n", &thinStringP);
|
|
|
|
/* showing structure arrangement */
|
|
MyStruct* m = 0;
|
|
printf("Offsets: %d,%d,%d,%d,%d,%d,%d,%d,%d\n",
|
|
&m->ubyteValue, &m->byteValue,
|
|
&m->uwordValue, &m->wordValue,
|
|
&m->udwordValue, &m->dwordValue,
|
|
&m->ulongLongValue, &m->longLongValue,
|
|
&m->floatValue);
|
|
|
|
/* union stuff */
|
|
union {
|
|
BYTE byteValue;
|
|
struct {
|
|
WORD first;
|
|
WORD second;
|
|
} words;
|
|
DWORD value;
|
|
} dwValue;
|
|
dwValue.value = 0xDEADBEEF;
|
|
printf("Size %d; Addresses 0x%x,0x%x; Values 0x%x,0x%x\n",
|
|
sizeof(dwValue), &dwValue.value, &dwValue.words,
|
|
dwValue.words.first, dwValue.words.second);
|
|
|
|
/* classes with no VF tables */
|
|
bar _bar = bar();
|
|
printf("Size %d; Address 0x%x : _bar\n", sizeof(_bar), &_bar);
|
|
|
|
/* class VF call */
|
|
foo* _testfoo = (foo*)new fooa();
|
|
_testfoo->bar();
|
|
|
|
/* classes with VF tables */
|
|
foo _foo = foo();
|
|
fooa _fooa = fooa();
|
|
foob _foob = foob();
|
|
printf("0x%x : _foo\n", &_foo);
|
|
printf("0x%x : _fooa\n", &_fooa);
|
|
printf("0x%x : _foob\n", &_foob);
|
|
|
|
_foo.barbaz();
|
|
_fooa.bar();
|
|
_foob.baz();
|
|
|
|
/* class protection */
|
|
baz* _baz = 0;
|
|
_baz->printStuff();
|
|
|
|
system("pause");
|
|
} |