А что мешает переписать первые байты функции, и вписать прыжок на свою функцию? я так делаю и с антивирусами живёт отлично Мешает, то что это нужно делать ОЧЕНЬ аккуратно. Например нужно быть уверенным, что никакой другой поток в то же самое время не исполняет изменяемый код. Одно неверное движение и Вы отетц ... ребенка зовут Блю, фамилия - Скрин. У меня нет никакой идеи как сделать пропатчить функцию безопасным образом.
Функция установки хука, учитывает особеность масм добавлять левую процедуру прыжка и коректирует адрес Код (Text): SetHookFunk proc stdcall FuncAdr:dword,NewAddr:dword,Old:dword,NoSave:word, UnHook:word LOCAL CR0Reg:ULONG push ebx push ecx cli mov eax, cr0 mov CR0Reg,eax and eax,0FFFEFFFFh mov cr0, eax mov eax,[FuncAdr] mov eax,[eax+2] mov eax,[eax] mov ecx,Old cmp UnHook,0 jnz @UH cmp NoSave,0 jnz @NS assume ecx:ptr _OldCode mov bx,word ptr [eax] mov [ecx].One,bx push dword ptr [eax+2] pop [ecx].TWO @NS: mov byte ptr [eax],68h mov ebx,[NewAddr] mov dword ptr [eax+1],ebx mov byte ptr [eax+5],0C3h jmp final @UH: mov bx,[ecx].One mov word ptr [eax],bx push [ecx].TWO pop [eax+2] assume ecx:nothing final: mov eax, CR0Reg mov cr0, eax sti pop ecx pop ebx ret SetHookFunk endp Пример использования Код (Text): ;Установить перехват invoke SetHookFunk,offset NtOpenProcess,addr HNtOpenProcess,addr OldNtOp,0,0 ;снять перехват invoke SetHookFunk,addr NtOpenProcess,addr HNtOpenProcess,addr OldNtOp,0,1 Пример обработчика Код (Text): HNtOpenProcess proc ProcessHandle:DWORD, DesiredAccess:DWORD, ObjectAttributes:DWORD, ClientId:dword LOCAL ProcessId:dword LOCAL Result:dword mov eax,ClientId mov eax,[eax] cmp eax,ProcID ;хендл процесса jne final mov eax,STATUS_ACCESS_DENIED ret final: invoke SetHookFunk,addr NtOpenProcess,offset HNtOpenProcess,addr OldNtOp,0,1 invoke NtOpenProcess ,ProcessHandle, DesiredAccess,ObjectAttributes, ClientId mov Result,eax invoke SetHookFunk,addr NtOpenProcess,offset HNtOpenProcess,addr OldNtOp,1,0 mov eax,Result ret HNtOpenProcess endp для хранения переписаных байт использует структуру Код (Text): _OldCode struct One word ? TWO DWORD ? _OldCode ends .data? OldNtOp _OldCode <>
2FED Извиняюсь, но мне кажется в Вашем коде нет защиты на случай если кто-то исполняет модифицируемый код. Или я чего-то не вижу?
Про сплайсинг сто тыщ мильёнов раз говорили. Код скопированный 2FED, не гарантирует стабильности и проч, да и вообще ничего не гарантирует. в общем удалить, чтобы не было дурным примером.
как это нет защиты, почему нестабильный? в перехватчике код функции восстанавливается перед её вызовом, а по завершению опять ставится перехват, в функции установки/снятия перехвата есть команды cli и sti который запрещают прерывания во время установки перехвата, таким образом ничто не вызовет функцию когда она будет переписыватся. я этот код сам(ну почти) писал и очень много тестил, и работает стабильно, проверено
Ну блин сколько раз говорилось что cli sti это для одноядерного процессора на многоядерных (коих щас не меряно) касяки вазможны в виде синяка
Сплайсинг начала обработчика сервиса - слишком ненадёжно, его легко снять, не говоря уже про модификацию SST.
У меня нет особой проблемы, что мой хук можно снять. Главное, чтоб это не приводила к караху системы.