Начал постигать всяческие извращения, которые можно замутить в С++ ^__^
Первое, что пришло в голову - подменить у класса виртуальный метод :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] ? Или есть..
Буду искать новые извращения и потом добавлять сюда, а пока надо делами заниматься.
Первое, что пришло в голову - подменить у класса виртуальный метод :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] ? Или есть..
Буду искать новые извращения и потом добавлять сюда, а пока надо делами заниматься.
Комментариев нет:
Отправить комментарий