Извращения в С++

Начал постигать всяческие извращения, которые можно замутить в С++  ^__^

Первое, что пришло в голову – подменить у класса виртуальный метод  :3 Легального способа тут конечно нет, но just for fun можно VisualStudio-only намутить код ) Всё тут просто – у каждого объекта любого класса при наличии в классе виртуальных методов в самом начале записывается указатель на таблицу виртуальных методов этого класса. Таблица – просто набор указателей на методы! Осталось написать подложный метод и перезаписать указатель в таблице виртуальных методов ^^ Что я, собственно, и сделал. И.. и обломался: access violation writing location… )

vtable записывается в read-only память :  Бида…  казалось бы ) Но за что я люблю С++  (в отличае от шарпа на котором раньше писал) – в нём можно сделать всё, даже то, что запрещено  😀

VirtualQuery, VirtualProtect спасут отца Русской демократии.

struct Foo
{
virtual void VirtualMethod(){
printf(“VIRTUAL METHODn”);
}
};

void ReplacementFunc(){
printf(“LOL FUNCTION!!n”);
}

int _tmain(int argc, _TCHAR* argv[])
{
typedef void (*func)();
 Foo* foo = new Foo();

size_t* vtbl;
 memcpy(&vtbl, foo, sizeof(size_t));

func ptr = &ReplacementFunc;

MEMORY_BASIC_INFORMATION meminfo;
DWORD oldprotect;
VirtualQuery(&vtbl[0], &meminfo, sizeof(meminfo));
VirtualProtect(meminfo.BaseAddress, 4, PAGE_EXECUTE_READWRITE, &oldprotect);

memcpy(&vtbl[0], &ptr, sizeof(func));

 foo->VirtualMethod();  //тадааам ) В консоли:  LOL FUNCTION!!
getchar();
return 0;
}

Блджад, почему тут нету тега  ?  Или есть..

Буду искать новые извращения и потом добавлять сюда, а пока надо делами заниматься.

0
0