Подскажите почему перехват NtUserTranslateMessage не работает вWin2003

Тема в разделе "WASM.NT.KERNEL", создана пользователем 0xFox, 17 фев 2010.

  1. 0xFox

    0xFox Андрей

    Публикаций:
    0
    Регистрация:
    14 янв 2010
    Сообщения:
    47
    Адрес:
    Белгород
    Спасибо Сэр
     
  2. 0xFox

    0xFox Андрей

    Публикаций:
    0
    Регистрация:
    14 янв 2010
    Сообщения:
    47
    Адрес:
    Белгород
    Люди, подскажите еще такую вещь: где взять отладочную версию ntoskrnl.exe для Win2003 ??

    для WinXp нашел в составе DDK, для Win7 там тоже есть, а вот где взть это дело для Win2003??

    Подскажите пожалуйста
     
  3. reader323

    reader323 New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    134
    нубье такое нубье
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    0xFox
    Отладочный билд вам не нужен.
     
  5. 0xFox

    0xFox Андрей

    Публикаций:
    0
    Регистрация:
    14 янв 2010
    Сообщения:
    47
    Адрес:
    Белгород
    Подскажите пожалуйста такую вещь:

    нашел адреса функций в ntoskrnl.exe
    MmGetNextSession = 0x00411F3B;
    MmGetSessionId = 0x00442B28;
    MmAttachSession = 0x0041BCC3;
    MmDetachSession = 0x0041BC6B;
    MmQuitNextSession = 0x00505E08;

    по средствам анализа в IDA, но при вызове получаю БСОД, прошелся отладчиком, выяснил что
    вызов происходит в неизвестное направление. Адрес инструкции, с которого вызываю 0хf5789162,
    соответственно большая разница адресах

    В чем ошибка?? нужно ли к адресам функций добавлять какое либо смешение, или просто адреса которые я нашел не верные??
     
  6. 0xFox

    0xFox Андрей

    Публикаций:
    0
    Регистрация:
    14 янв 2010
    Сообщения:
    47
    Адрес:
    Белгород
    Подскажите пожалуйста такую вещь:

    нашел адреса функций в ntoskrnl.exe
    MmGetNextSession = 0x00411F3B;
    MmGetSessionId = 0x00442B28;
    MmAttachSession = 0x0041BCC3;
    MmDetachSession = 0x0041BC6B;
    MmQuitNextSession = 0x00505E08;

    по средствам анализа в IDA, но при вызове получаю БСОД, прошелся отладчиком, выяснил что
    вызов происходит в неизвестное направление. Адрес инструкции, с которого вызываю 0хf5789162,
    соответственно большая разница адресах

    В чем ошибка?? нужно ли к адресам функций добавлять какое либо смешение, или просто адреса которые я нашел не верные??
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    - 0x400000 + KernelBase.
     
  8. 0xFox

    0xFox Андрей

    Публикаций:
    0
    Регистрация:
    14 янв 2010
    Сообщения:
    47
    Адрес:
    Белгород
    Такой вопрос.

    База ядра находится по адресу 0x80800000 + 0x400000 = 0x80C00000,
    по данным отладчика получается что мы выходим за границы ядра и при вызове функции MmGetNextSession опять выбрасывает в BSOD. Может я что то не так делаю????

    по данным отладчика модуль NT находится в диапозоне от 0x80800000 по 0x80axxxxx

    может к 0x80800000 нужно добавлять смешение???
    подскажите пожалуйста
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    0xFox
    Нужно к базе ядра загруженного прибавить RVA функи, которая вычисляется из локальной проекции, либо в загруженном ядре(но обычно с диска). В заголовке модуля у вас база загрузки 0x400000, соответственно от рва нужно её отнять.
     
  10. 0xFox

    0xFox Андрей

    Публикаций:
    0
    Регистрация:
    14 янв 2010
    Сообщения:
    47
    Адрес:
    Белгород
    Нашел адреса нужных функций, через отладчик правда.

    Вопрос в следующем, после того как присоединяюсь к сессии следующим кодом:

    Код (Text):
    1. for (Session = MmGetNextSession (NULL);
    2.       Session != NULL;
    3.       Session = MmGetNextSession (Session)) {
    4.  
    5.          if (NT_SUCCESS (MmAttachSession (Session, &ApcState))) {
    6.  
    7.              _asm
    8.      {
    9.         int 3
    10.                }
    11.     HookFunctions();
    12.  
    13.     MmDetachSession (Session, &ApcState);
    14.          }
    15.      }
    при вызове функции MmDetachSession вылетает БСОД, с сообщением о невозможности отсоедениться,
    перехват функции в Шадоу таблице осуществляется функцией HookFunctions(), следующего вида:

    Код (Text):
    1. NTSTATUS HookFunctions()
    2. {
    3.   NTSTATUS NTstatus;
    4.   ULONG result;
    5.  
    6.  
    7.   NTstatus= PsLookupProcessByProcessId((ULONG)GetCsrPid(), &crsEProc);   // процесс System используется
    8.   if (!NT_SUCCESS( NTstatus ))  
    9.   {  
    10.     DbgPrint("PsLookupProcessByProcessId() error\n");  
    11.     return NTstatus;  
    12.   }  
    13.   KeAttachProcess(crsEProc);  
    14.    
    15.   __try  
    16.   {  
    17.       if ((KeServiceDescriptorTableShadow!=NULL))    
    18.       {
    19.          //g_OriginalNtUserGetForegroundWindow = (NTUSERGETFOREGROUNDWINDOW)KeServiceDescriptorTableShadow[1].ServiceTable[NtUserGetForegroundWindow_callnumber];  
    20.          g_OriginalNtUserTranslateMessage    = (NTUSERTRANSLATEMESSAGE)   KeServiceDescriptorTableShadow[1].ServiceTable[NtUserTranslateMessage_callnumber];  
    21.          //DbgPrint("g_OriginalNtUserTranslateMessage = 0x%x",g_OriginalNtUserTranslateMessage);
    22.          //g_OriginalNtUserGetKeyNameText      = (NTUSERGETKEYNAMETEXT)     KeServiceDescriptorTableShadow[1].ServiceTable[NtUserGetKeyNameText_callnumber];  
    23.  
    24.          //g_OriginalNtUserGetKeyboardState    = (NTUSERGETKEYBOARDSTATE)  KeServiceDescriptorTableShadow[1].ServiceTable[NtUserGetKeyboardState_callnumber];  
    25.          //g_OriginalNtUserToUnicodeEx         = (NTUSERTOUNICODEEX)       KeServiceDescriptorTableShadow[1].ServiceTable[NtUserToUnicodeEx_callnumber];  
    26.  
    27.       }  
    28.       else  
    29.         KeServiceDescriptorTableShadow=NULL;
    30.  
    31.       _asm  
    32.      {  
    33.         CLI                    //dissable interrupt  
    34.         MOV    EAX, CR0        //move CR0 register into EAX  
    35.         AND EAX, NOT 10000H    //disable WP bit    
    36.         MOV    CR0, EAX        //write register back  
    37.       }
    38.  
    39.     //(NTUSERGETFOREGROUNDWINDOW)KeServiceDescriptorTableShadow[1].ServiceTable[NtUserGetForegroundWindow_callnumber] = MyNtUserGetForegroundWindow;
    40.     (NTUSERTRANSLATEMESSAGE)   KeServiceDescriptorTableShadow[1].ServiceTable[NtUserTranslateMessage_callnumber]    = MyNtUserTranslateMessage;
    41.       _asm    
    42.       {  
    43.         MOV    EAX, CR0        //move CR0 register into EAX  
    44.         OR     EAX, 10000H     //enable WP bit        
    45.         MOV    CR0, EAX        //write register back          
    46.         STI                    //enable interrupt  
    47.       }
    48.  
    49.   }  
    50.   __finally  
    51.   {  
    52.       KeDetachProcess();    
    53.   }  
    54.    
    55.   KdPrint(("Hook is Succeessfully\n"));  
    56.  
    57.   return STATUS_SUCCESS;
    58.  
    59. }
    что делаю не так?? почему после пропатчивания таблицы, отсоединение от сессии происходит не корректно??
    как это побороть, или я что то делаю не так?..
     
  11. 0xFox

    0xFox Андрей

    Публикаций:
    0
    Регистрация:
    14 янв 2010
    Сообщения:
    47
    Адрес:
    Белгород
    Смысл в том, чтобы сделать перехват во всех сессиях
     
  12. 0xFox

    0xFox Андрей

    Публикаций:
    0
    Регистрация:
    14 янв 2010
    Сообщения:
    47
    Адрес:
    Белгород
    Господа, всех благодарю.

    Все получилось, не нужно было аттачится второй раз к процессу, оказалось достаточно только приаттачится к сессии...

    Но возник другой вопрос, механизм APC. Под ХР работает нормально, все доставляется и выполняется, а под Win2003 ничего не происходит, то есть APC доставлена (так как результат успешный), а вот результата нет... Объясните, чем отличеается механизм АРС под ХР и Win2003 ..
     
  13. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Структурами...
     
  14. 0xFox

    0xFox Андрей

    Публикаций:
    0
    Регистрация:
    14 янв 2010
    Сообщения:
    47
    Адрес:
    Белгород
    А по подробней можно??
    для АРС использую следующие функции:

    KeStackAttachProcess
    KeUnstackDetachProcess

    KeInitializeApc
    KeInsertQueueApc

    Параметры для них какие то другие в Win2003 или что??
    функция работает в ХР но не хочет в Win2003 SP2, почему, что там со структурами??