![]() |
Эмуляция VirtualProtect
Итак.... Представим ситуацию. Есть фаер/антитварь, ставящее хуки на нужные зловредному коду функции. И все бы ничего...
Возьмем да и снимем поставленые хуки... а нет... на функции ZwProtectVirtualMemory тоже стоит перехват=\ что тогда? с утра сегодня пришла идея сэмулировать нужную функцию... мож кому-то будет интересно. Если не будет -тему дельнете. делов-то Посидела немного за дизасмом VirtualProtectEx и ZwProtectVirtualMemory. Я их обе сэмулирую. Значит с первой проблем вообще не возникло. Просто проследила за содержанием стека, чтобы узнать где какой параметр. Далее... Далее вызов ntdll функции, на начале которой стоит наш воображаемый хук. Пять байт затерто. А нам надо узнать номер функции Код:
а тот же аутпост (в пример привожу его - это модный пример) ставит хук так Код:
7C90EA32 n> $- E9 71DE7393 JMP wl_hook.1004C8A8 ; это поясняет мои стова относительно пяти байтКод:
.386Вообще наверняка есть способ лучше.. |
Это всё канешн круто. Только нормальные АВ и фаеры ставят хуки в ядре в SSDT или сплайсингом Nt-вариантов родного апи.
|
Хм.. Зачем что-то изобретать? если нужно анхучить ntdll - читаем из файла оригиналиное содержимое функции да и затираем все хуки... Опять-же как можно изменить аттрибуты секции файла? разобрать PE заголовок, найти эту секцию и прописать новые аттрибуты? WFP сразу вернёт всё на место.
Да и грейт вообще-то прав. На моей памяти только аутпост СДТ не хучит. P.S. А вообще молодец. Хорошее предложение. Только в реальности работать не будет... |
хм, мо-моему оутпост ничё не вякал и позволял норм анхукать =d
покрайней мере в предпоследней версии... а ваще норм, пускай способ будет =) |
Цитата:
я ж пишу в эту процедуру непосредственно Код:
Цитата:
Цитата:
Цитата:
|
А работать не будет вот почему:
NtPrivilegeCheck 0x005d 0x005d 0x005d 0x005d 0x0074 0x0074 0x0074 0x0074 0x0074 0x0086 0x0086 0x0086 0x008c 0x008c 0x00cc NtPrivilegeObjectAuditAlarm 0x005f 0x005f 0x005f 0x005f 0x0076 0x0076 0x0076 0x0076 0x0076 0x0087 0x0087 0x0087 0x008d 0x008d 0x00cd NtPrivilegedServiceAuditAlarm 0x005e 0x005e 0x005e 0x005e 0x0075 0x0075 0x0075 0x0075 0x0075 0x0088 0x0088 0x0088 0x008e 0x008e 0x00ce NtPropagationComplete 0x0178 NtPropagationFailed 0x0179 NtProtectVirtualMemory 0x0060 0x0060 0x0060 0x0060 0x0077 0x0077 0x0077 0x0077 0x0077 0x0089 0x0089 0x0089 0x008f 0x008f 0x00cf NtPullTransaction 0x0176 NtPulseEvent 0x0061 0x0061 0x0061 0x0061 0x0078 0x0078 0x0078 0x0078 0x0078 0x008a 0x008a 0x008a 0x0090 0x0090 0x00d0 NtQueryAttributesFile 0x0063 0x0063 0x0063 0x0063 0x007a 0x007a 0x007a 0x007a 0x007a 0x008b 0x008b 0x008b 0x0091 0x0091 0x00d1 В разных версиях осей за и перед NtProtectVirtualMemory идут разные функции. |
Работать не будет при неск. условиях.
1. Функции идут не по порядку 2. имеют не такой вид Код:
А то, что функции разные, так это вообще не имеет значения. лишь бы по порядку шли (или просто ты не так выразился). Я ж кусок кода в начале приводила из ntdll. Хотя так-то это все ненадежно. Лучше из файла читать номер функции. седня вечером накатаю код... так канешн, будет правильней. |
Ge(X)oR про конкретно эмуляцию функций я не слышала=\ Если говоришь, что было, так аргументируй (ссылки и тд)... а "что-то подобное" мне ни о чем не говорит)
|
Переписала код.... в общем саму функцию эмуляции и получение номера функции.
Код:
emulator_vir_protect proc hProcess:dword,lpAddress:dword,dwSize:dword,flNewProtect:dword,lpflOldProtect:dword Вызывать так Код:
invoke emulator_vir_protect,-1,func_,10,40h,addr oldprot_Код:
GetNumberNtdllFunction proc address_function:dword,imagebase:dwordПример вызова Код:
invoke GetModuleHandleA,offset ntdl_Код:
MOV EAX,xxxx |
Теперь и под 2000 работает и под XP, все-таки доделала.... Суть в том, что вся процедура копируется в выделенную память. Конец процедуры определяется по опкоду рет xxxx. Написала для этого функцию. В качестве первого ее аргумента принимается адрес функции, в качестве второго - адрес загрузки библиотеки ntdll. Ясное дело, что без нормального дизассемблера длин тут не обойтись. Поэтому я встроила VirXasm32 (на васме можно взять), вы же можете другой встроить или свой написать. Лишь бы длина инструкции возвращалась в eax. Теперь не надо никаких характеристик секций менять, как раньше. все просто и удобно)))
Процедуре необходимо Код:
.dataКод:
procedurecopy proc address_function:dword,imagebase:dword |
| Время: 16:08 |