Re: перехват апи вызова, что не так ?
От: lc  
Дата: 27.09.06 14:30
Оценка:
проблема с перехватом. делаю так

#pragma pack(1)
typedef struct ServiceDescriptorEntry
{
unsigned int *ServiceTableBase;
unsigned int *ServiceCounterTableBase; //Used only in checked build
unsigned int NumberOfServices;
unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
#pragma pack()

__declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable;

#define SYSTEMSERVICE(_function) KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]

_asm cli
OldZwCreateKey = (ZWCREATEKEY)(SYSTEMSERVICE(ZwCreateKey));
OldNtUserSetClipboardData = (NTUSERSETCLIPBOARDDATA)(SYSTEMSERVICE(0x77D50F0D));

SYSTEMSERVICE(ZwCreateKey) = (DWORD) NewZwCreateKey;
SYSTEMSERVICE(0x77D50F0D) = (DWORD) NewNtUserSetClipboardData;
_asm sti


0x77D50F0D адрес NtUserSetClipboardData в user32.dll
для ZwCreateKey и еще нескольких функций из ntdll.dll все работает, для NtUserSetClipboardData — синий экран.
по адресу (PUCHAR)NtUserSetClipboardData + 1 лежит значение 0x11FC, а значение количества сервисов 0x11c.
т.е. явно выход за границу, но код NtUserSetClipboardData полностью аналогичен коду ZwCreateKey, разница только в номере сервиса. как же он тогда работает и где я не прав ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.