Исследование недр win

Тема в разделе "WASM.RESEARCH", создана пользователем punxer, 23 сен 2010.

  1. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Доброго времени суток. Допустим например мы имеем сервис NtUserSendInput, знаем егоо номер, знаем что он больше 1000 и принадлежит win32k.sys, загружая оный в дизассемблер, например, IDA, как найти ту самую NtUserSendInput,ведь даже с отладочными сиволами она не видна, ну или я не могу ее найти. В экспорте ее точно нет. Подскажите правильный путь/
     
  2. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    вот пример из статьи

    Далее управление передается в ядро. Что ж, грузим в IDA win32k.sys
    Обратимся к листингу NtUserSetTimer:
    как это найдено?
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1. .text:BF949D78 ; =============== S U B R O U T I N E =======================================
    2. .text:BF949D78
    3. .text:BF949D78 ; Attributes: bp-based frame
    4. .text:BF949D78
    5. .text:BF949D78 ; int __stdcall NtUserSendInput(int, void *, int)
    6. .text:BF949D78 _NtUserSendInput@12 proc near           ; DATA XREF: .data:BFA05860o
    7. .text:BF949D78
    8. .text:BF949D78 var_28          = byte ptr -28h
    9. .text:BF949D78 var_1C          = dword ptr -1Ch
    10. .text:BF949D78 ms_exc          = CPPEH_RECORD ptr -18h
    11. .text:BF949D78 arg_0           = dword ptr  8
    12. .text:BF949D78 arg_4           = dword ptr  0Ch
    13. .text:BF949D78 arg_8           = dword ptr  10h
    14. .text:BF949D78
    15. .text:BF949D78                 push    18h
    16. .text:BF949D7A                 push    offset unk_BF9FD990
    17. .text:BF949D7F                 call    __SEH_prolog4
    18. .text:BF949D84                 and     [ebp+var_1C], 0
    19. .text:BF949D88                 call    _UserEnterUserCritSec@0 ; UserEnterUserCritSec()
    Отладочные символы.
     
  4. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    >>знаем егоо номер, знаем что он больше 1000

    Первая единица не входит в номер сервиса, она указывает, что сервисная таблица W32pServiceTable (и этот символ тоже есть, см. Names Window) и находится в win32k.sys. То есть в статье номер сервиса был 21E. Если у вас подгружены символы, то нужный сервис по имени можно найти в "Function Window" IDA, в экспортах, разумеется, ничего не найдете. Так, в

    Код (Text):
    1. .text:0000000077C4CA30 ; UINT __stdcall NtUserSendInput(UINT cInputs, LPINPUT pInputs, int cbSize)
    2. .text:0000000077C4CA30                 public NtUserSendInput
    3. .text:0000000077C4CA30 NtUserSendInput proc near               ; CODE XREF: mouse_event+3Cp
    4. .text:0000000077C4CA30                                         ; keybd_event+3Dp
    5. .text:0000000077C4CA30                                         ; DATA XREF: ...
    6. .text:0000000077C4CA30                 mov     r10, rcx
    7. .text:0000000077C4CA33                 mov     eax, 1083h
    8. .text:0000000077C4CA38                 syscall
    9. .text:0000000077C4CA3A                 retn
    10. .text:0000000077C4CA3A NtUserSendInput endp
    Номер сервиса - 83h в W32pServiceTable. Листинг из user32 winxp x64, но сути это не меняет.
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Код (Text):
    1. UINT NtUserSendInput(
    2.     IN UINT    cInputs,
    3.     IN CONST INPUT *pInputs,
    4.     IN int     cbSize)
    5. {
    6.     LPINPUT pInput2 = NULL;
    7.     PTHREADINFO ptiCurrent;
    8.     TL tlInput;
    9.     DWORD dwArgumentError = ERROR_INVALID_PARAMETER;
    10.  
    11.     BEGINRECV(UINT, 0);
    12.  
    13.     if (sizeof(INPUT) != cbSize || cInputs == 0) {
    14.         MSGERROR(dwArgumentError);
    15.     }
    16.  
    17.     ptiCurrent = PtiCurrent();
    18.  
    19.     /*
    20.      * Probe arguments
    21.      */
    22.     try {
    23.         ProbeForReadBuffer(pInputs, cInputs, DATAALIGN);
    24.  
    25.         pInput2 = UserAllocPoolWithQuota(cInputs * sizeof(*pInputs), TAG_SENDINPUT);
    26.         if (pInput2 == NULL) {
    27.             ExRaiseStatus(STATUS_NO_MEMORY);
    28.         }
    29.         RtlCopyMemory(pInput2, pInputs, cInputs * sizeof(*pInputs));
    30.     } except (StubExceptionHandler(TRUE)) {
    31.         MSGERRORCLEANUP(0);
    32.     }
    33.  
    34.     ThreadLockPool(ptiCurrent, pInput2, &tlInput);
    35.     retval = xxxSendInput(cInputs, pInput2);
    36.     ThreadUnlockPool(ptiCurrent, &tlInput);
    37. CLEANUPRECV();
    38.     if (pInput2) {
    39.         UserFreePool(pInput2);
    40.     }
    41.     TRACE("NtUserSendInput");
    42.     ENDRECV();
    43. }
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Clerk
    готовься расписывать каждую подфунцию - PtiCurrent, xxxSendInput, ....
     
  7. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    n0name
    а ты та еще язва///
     
  8. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Clerk
    это wrk или сорцы w2k?
     
  9. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    punxer
    В WRK этого нет, win2k.