четверг, 1 декабря 2011 г.

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

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

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

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

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

struct Foo
{
virtual void VirtualMethod(){
printf("VIRTUAL METHOD\n");
}
};

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;
}

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

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

Комментариев нет:

Отправить комментарий