А есть ли хуки, которые не затрагивают ридонли память? Тот же минхук помоему затирает пролог функции и вставляет туда переход. Вмт вроде тоже легко детектятся. Что тогда делать? Вообще хуки не юзать?
минхук это .text модификация. вмт хук это .rdata модификация. оба ридонли. содержимое этих сегментов в памяти должно быть равно содержимому сегментов с диска после релокации(в файле лежат виртуальные адреса относительно имейджбазы которая указна в файле(ну наверно все видели фигню в иде типа "sub_138001000". так вот это как раз виртуальный адрес относительно имейджбазы. в файле который я взял имейджбаза 0x138000000, а функция находится на RVA 0x1000, в итоге ее виртуальный адрес 0x138001000). изза ASLR(секьюрити фича) в память файлы выгружаются на рандомных адресах, и чтобы они нормально работали нужна таблица релокаций(не всегда). она содержит адреса всех переменных(и их типы) которые содержат виртуальные адреса относительно имейджбазы(их может не быть). из этих адресов вычитается имейджбаза оригинальная(она в заголовках PE лежит. в нашем примере 0x138000000) и прибавляется реальная имейджбаза(ну т.е. где мы аллоцировали память под наш модуль)) и резолва импортов(импорт таблица в .rdata обычно. собственно и экспорты тоже в .rdata)
хороший пример того что надо релоцировать - втейблы.
вот допустим втейбла:
.rdata:0000000140031658 ; const std::exception::`vftable'
.rdata:0000000140031658 ??_7exception@std@@6B@ dq offset sub_140001070
.rdata:0000000140031658 ; DATA XREF: sub_140001010+C↑o
.rdata:0000000140031658 ; sub_140001070+A↑o ...
.rdata:0000000140031660 dq offset sub_140001050
она в файле содержит указатели относительно имейджбазы. если ее прямо так выгрузить в память и потом че-нибудь из нее вызвать то крашнет же нахуй просто - нету такого адреса 140001070(т.к. модуль выгрузился на рандомный адрес а не на 140000000)
после релокации относительно 00007FF6E39E0000(туда выгрузился модуль) втейбла будет выглядеть уже вот так(140001070 - 140000000 + 00007FF6E39E0000 = 00007FF6E39E1070)
вот теперь можно вызвать спокойно.
так вот кароче после релокаций и резолва импортов эти ридонли сегменты становятся уже РЕАЛЬНО ридонли(до резолва импортов и релокаций они еще не совсем ридонли, ведь там лежат те же импорты, а у импортов может быть разный адрес(опять таки изза ASLR + сами дллки откуда импортим могут быть разных версий(на разных версиях винды например) и тд), плюс еще релоцировать надо). античит берет из файла оригинальные сегменты, релоцирует(в .text ваще нет релокаций как правило. он прямо с диска грузится без выебонов и 1 в 1 совпадает(не всегда)), резолвит импорты, и сравнивает с тем что в памяти(только ридонли сегменты. ридврайт сегменты естественно могут отличаться им никто не запрещает), и дает пизды если не совпадает
байтпатч хуки: инструкции лежат в .text(ридонли)
вмт хуки: втейблы лежат в .rdata(ридонли)
иат хуки: импорты лежат в .rdata(ридонли)
еат хуки: экспорты лежат в .rdata(ридонли)
юзай .data хуки и тд, при условии что их сложно будет проверить. например тот же Shadow VMT(свап указателя на вмт в объекте(объект может находиться в ридврайт памяти)). впрочем указатель на вмт должен указывать в .rdata, поэтому если он указывает в ебеня кудато то античит может дать пизды(т.е. шедоу вмт говно), но если он не будет проверять(ну ему чтобы проверить нужна(для удобства) какая-то таблица объектов с вмтшками. т.е. например те же таблицы с CreateInterface могут проверить, могут директикс хуйню проверить и тд и тп, а какието индивидуальные объекты могут не проверить при условии что их нет в таблице или их руками не проверяют) то все норм; альтернативно можно заменить указатель на вмт указателем на другую легальную вмт например(существуют вмтшки которые делегируют всю втейблу на член например. ну т.е. у тебя была нормальная вмт которая сама чето делает, а ты ее поменял на эквивалентную вмтшку(их может и не быть) которая перекидывает всю работу на один из членов(который ты подменил на нужный))(
) и потом заменить члены и т.д. (вряд ли античит станет особо глубоко копаться), также можно заменять указатели на функции в ридврайт таблицах всяких(однако функции должны в .text лежать как правило, поэтому античит тоже может это проверить если захочет)
в общем заменяй все что разрешено заменять, при условии что проверить это будет трудно. а то что запрещено лучше не трогать.