Вопрос: ставлю хук на: Код (Text): typedef NTSYSAPI NTSTATUS (*ZWCREATEFILE)( ...... typedef NTKERNELAPI PVOID (*MMMAPIOSPACE)( IN PHYSICAL_ADDRESS PhysicalAddress, IN SIZE_T NumberOfBytes, IN MEMORY_CACHING_TYPE CacheType ); PVOID NewMmMapIoSpace( IN PHYSICAL_ADDRESS PhysicalAddress, IN SIZE_T NumberOfBytes, IN MEMORY_CACHING_TYPE CacheType ) { ... PVOID ntS = (PVOID) NULL; // call original fucntion ntS = ((MMMAPIOSPACE)(OldMmMapIoSpace)) ( PhysicalAddress, NumberOfBytes, CacheType); return(ntS); Вса падает в момент постановки хука. В то же время хук на функции ZWCreate и т.п. прокатывает на ура. Винда 2003 SP1. В чем может быть дело? пасиб.
Метод как описано тут: (у меня работает для ZW...) http://www.donews.net/zwell/archive/2004/10/24/146350.aspx
С каким кодом? В какой момент - в момент перезаписи адреса или при первом вызове? Банальность про экстрасенсов уже на зубах навязла, а вопросы им все-равно адресуются :\
вот таким вот образом..., как и приведено по ссылке ниже. падает в момент перезаписи. Код (Text): INTERRUPT_OFF; OldMmMapIoSpace = (MMMAPIOSPACE) (SYSTEMSERVICE(MmMapIoSpace)); (MMMAPIOSPACE) (SYSTEMSERVICE(MmMapIoSpace)) = NewMmMapIoSpace; INTERRUPT_ON;
MmMapIoSpace не является функцией native api, поэтому ее адреса нет в KeServiceDescriptorTable. Макрос SYSTEMSERVICE вместо индекса сервиса возвращает какую-то фигню, и в результате запись Код (Text): (MMMAPIOSPACE) (SYSTEMSERVICE(MmMapIoSpace)) = NewMmMapIoSpace; происходит в произвольную область памяти. Не нативные функции можно хукать сплайсингом или подменой адреса экспорта в модуле ядра ЗЫ: Здесь http://www.metasploit.com/users/opcode/syscalls.html находится список функций, с которыми твой перехват будет нормально работать
<Не нативные функции можно хукать сплайсингом или подменой адреса экспорта в модуле ядра> Но даже в этом случае ты не сможешь перехватывать вызовы внутри NTOSKRNL, и в уже загруженых дровах тоже. Только в тех дровах, которые будут грузиться после. Если хочешь чтоб всё перехватывать, тут только сплайсинг.