Доброго времени суток. Допустим например мы имеем сервис NtUserSendInput, знаем егоо номер, знаем что он больше 1000 и принадлежит win32k.sys, загружая оный в дизассемблер, например, IDA, как найти ту самую NtUserSendInput,ведь даже с отладочными сиволами она не видна, ну или я не могу ее найти. В экспорте ее точно нет. Подскажите правильный путь/
вот пример из статьи Далее управление передается в ядро. Что ж, грузим в IDA win32k.sys Обратимся к листингу NtUserSetTimer: как это найдено?
Код (Text): .text:BF949D78 ; =============== S U B R O U T I N E ======================================= .text:BF949D78 .text:BF949D78 ; Attributes: bp-based frame .text:BF949D78 .text:BF949D78 ; int __stdcall NtUserSendInput(int, void *, int) .text:BF949D78 _NtUserSendInput@12 proc near ; DATA XREF: .data:BFA05860o .text:BF949D78 .text:BF949D78 var_28 = byte ptr -28h .text:BF949D78 var_1C = dword ptr -1Ch .text:BF949D78 ms_exc = CPPEH_RECORD ptr -18h .text:BF949D78 arg_0 = dword ptr 8 .text:BF949D78 arg_4 = dword ptr 0Ch .text:BF949D78 arg_8 = dword ptr 10h .text:BF949D78 .text:BF949D78 push 18h .text:BF949D7A push offset unk_BF9FD990 .text:BF949D7F call __SEH_prolog4 .text:BF949D84 and [ebp+var_1C], 0 .text:BF949D88 call _UserEnterUserCritSec@0 ; UserEnterUserCritSec() Отладочные символы.
>>знаем егоо номер, знаем что он больше 1000 Первая единица не входит в номер сервиса, она указывает, что сервисная таблица W32pServiceTable (и этот символ тоже есть, см. Names Window) и находится в win32k.sys. То есть в статье номер сервиса был 21E. Если у вас подгружены символы, то нужный сервис по имени можно найти в "Function Window" IDA, в экспортах, разумеется, ничего не найдете. Так, в Код (Text): .text:0000000077C4CA30 ; UINT __stdcall NtUserSendInput(UINT cInputs, LPINPUT pInputs, int cbSize) .text:0000000077C4CA30 public NtUserSendInput .text:0000000077C4CA30 NtUserSendInput proc near ; CODE XREF: mouse_event+3Cp .text:0000000077C4CA30 ; keybd_event+3Dp .text:0000000077C4CA30 ; DATA XREF: ... .text:0000000077C4CA30 mov r10, rcx .text:0000000077C4CA33 mov eax, 1083h .text:0000000077C4CA38 syscall .text:0000000077C4CA3A retn .text:0000000077C4CA3A NtUserSendInput endp Номер сервиса - 83h в W32pServiceTable. Листинг из user32 winxp x64, но сути это не меняет.
Код (Text): UINT NtUserSendInput( IN UINT cInputs, IN CONST INPUT *pInputs, IN int cbSize) { LPINPUT pInput2 = NULL; PTHREADINFO ptiCurrent; TL tlInput; DWORD dwArgumentError = ERROR_INVALID_PARAMETER; BEGINRECV(UINT, 0); if (sizeof(INPUT) != cbSize || cInputs == 0) { MSGERROR(dwArgumentError); } ptiCurrent = PtiCurrent(); /* * Probe arguments */ try { ProbeForReadBuffer(pInputs, cInputs, DATAALIGN); pInput2 = UserAllocPoolWithQuota(cInputs * sizeof(*pInputs), TAG_SENDINPUT); if (pInput2 == NULL) { ExRaiseStatus(STATUS_NO_MEMORY); } RtlCopyMemory(pInput2, pInputs, cInputs * sizeof(*pInputs)); } except (StubExceptionHandler(TRUE)) { MSGERRORCLEANUP(0); } ThreadLockPool(ptiCurrent, pInput2, &tlInput); retval = xxxSendInput(cInputs, pInput2); ThreadUnlockPool(ptiCurrent, &tlInput); CLEANUPRECV(); if (pInput2) { UserFreePool(pInput2); } TRACE("NtUserSendInput"); ENDRECV(); }