Извращения в С++
Первое, что пришло в голову – подменить у класса виртуальный метод :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;
}
Блджад, почему тут нету тега ? Или есть..
Буду искать новые извращения и потом добавлять сюда, а пока надо делами заниматься.
Leave a Reply