проблемка с KeAddSystemServiceTable и стеком из юзермода

Тема в разделе "WASM.WIN32", создана пользователем xdf, 15 июл 2006.

  1. xdf

    xdf New Member

    Публикаций:
    0
    Регистрация:
    14 июл 2006
    Сообщения:
    21
    в драйвере:

    Код (Text):
    1. DWORD NTAPI ZwTest(PDWORD arg)
    2. {
    3.     if(!arg)
    4.         return -1;
    5.  
    6.     __try
    7.     {
    8.         *arg = 0xdeadbeef;
    9.     }
    10.     __except(1)
    11.     {
    12.         return 0x666;
    13.     }
    14.  
    15.     return 1;
    16. }
    17.  
    18. PVOID m_ppNewServiceTable[] = { ZwTest, 0 };
    19. UCHAR m_pbNewArgumentTable[] = { 4, 0 };
    20.  
    21. ULONG m_ulIndex = 0; // <- DRV.m_ulSstIndex
    22.  
    23. bool (NTAPI* KeAddSystemServiceTable)(PPVOID Base, PULONG Count OPTIONAL, ULONG Limit, PUCHAR Number, ULONG Index);
    24. bool (NTAPI* KeRemoveSystemServiceTable )(IN ULONG Index);
    25.  
    26. VOID AddSystemServiceTable()
    27. {
    28.     UNICODE_STRING us;
    29.     RtlInitUnicodeString(&us, L"KeAddSystemServiceTable");
    30.     *(PPVOID)&KeAddSystemServiceTable = MmGetSystemRoutineAddress(&us);
    31.  
    32.     if(!KeAddSystemServiceTable)
    33.         return;
    34.  
    35.     for(ULONG Index = 0; Index < 4 && !m_ulIndex; Index++)
    36.         if(KeAddSystemServiceTable(m_ppNewServiceTable, NULL, 1, m_pbNewArgumentTable, Index))
    37.             m_ulIndex = Index;
    38.  
    39.     DPRINT("KeAddSystemServiceTable -> %i", m_ulIndex);
    40. }
    41.  
    42. VOID RemoveSystemServiceTable()
    43. {
    44.     UNICODE_STRING us;
    45.     RtlInitUnicodeString(&us, L"KeRemoveSystemServiceTable");
    46.     *(PPVOID)&KeRemoveSystemServiceTable = MmGetSystemRoutineAddress(&us);
    47.  
    48.     if(KeRemoveSystemServiceTable && m_ulIndex)
    49.         KeRemoveSystemServiceTable(m_ulIndex);
    50. }
    функция добавляется, но работать с указателем на переменную в стеке отказывается :dntknw: а со статичными все пашет

    Код (Text):
    1. DWORD ZwTestId = NULL;
    2.  
    3. _declspec (naked)
    4. DWORD NTAPI ZwTest(PDWORD arg)
    5. {
    6.     _asm
    7.     {
    8.         mov eax, ZwTestId
    9.         call KiFastSystemCall
    10.         ret 4
    11.  
    12. KiFastSystemCall:
    13.         mov edx, esp
    14.         __emit 0Fh
    15.         __emit 34h
    16.         ret
    17.     }
    18. }
    19. void Check()
    20. {
    21. ZwTestId = (DRV.m_ulSstIndex << 0x0C) | 0 ;
    22.  
    23. char x[512];
    24. DWORD xxx = 0x4321; - если статик, то все ок :(
    25. ULONG xx = ZwTest(&xxx);
    26. wsprintf(x, "%X %X", xx, xxx );
    27. MessageBox(0, x, 0, 0);
    28. }
     
  2. xdf

    xdf New Member

    Публикаций:
    0
    Регистрация:
    14 июл 2006
    Сообщения:
    21
    ладно, хрен с ним :) и так норм. пашет

    еще вопросик. возможно получить юзермодный контекст потока из ETHREAD?
    (без вызова функций. есть только ETHREAD (получаемый в SwapContext) и всё)
     
  3. xdf

    xdf New Member

    Публикаций:
    0
    Регистрация:
    14 июл 2006
    Сообщения:
    21
    и еще вопросик :) один хрен расковыряю сам, однако задам

    переключатель контекстов от процесса к процесса переключает потоки, при этом сам он при этом находитяс в адресном пространстве *обрабатываемого процесса*? о_О