Код функции

Тема в разделе "WASM.BEGINNERS", создана пользователем cembo, 18 ноя 2006.

  1. cembo

    cembo New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    17
    Здравствуйте, у меня такой вопрос:

    Есть драйвер работающий в ринг-0. Я прочитал, что для того, чтобы получить индекс zw функции на ssdt надо открыть код функции и прочитать второй байт. Может кто нибудь пожалуйста показать как ето сделать? Вот как я ето пробовал реализовать:

    Код (Text):
    1. GetIndex proc function:DWORD
    2.  
    3.     mov ebx, function
    4.     xor eax, eax
    5.     mov eax, byte ptr [ebx][1]
    6.     ret
    7.  
    8. GetIndex endp
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    dword, не байт.
    Код (Text):
    1. mov eax, dword ptr [ebx]
     
  3. cembo

    cembo New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    17
    спасибо за ответ, пробовал и так, вот результат:

    ZwCreateFile: 334025ff
    ZwDeleteFile: 334425ff

    Позиция ZwCreateFile должна быть 25h, здесь она 40h. Ешё резуьтат функции почему то меняетсья каждий раз когда запускаю драйвер. Я думал, что физические адреса неменяются?

    К тому же первая команда должна быть 8bNumber (mov eax, number) а здесь её нет.
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    AFAIR mov eax. Imm32/16 = B8 Imm32/16
    Я изначально некорректно понял вопрос, сорри.
    Получить номер syscall'a можно посмотрев второй байт в ntdll.dll, тк большинство функций являются обертками над r0. Для драйвера тоже можно открыть ntdll.dll(найти в памяти) и проччитать номер syscall'a.
     
  5. cembo

    cembo New Member

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

    почему такая фукция работает:

    #define SYSCALL_INDEX(_Function) *(PULONG) ((PUCHAR) _Function+1)

    простите, ето даже не функция, а обычний c макрос

    мне кажется что там делатся впринципе то же самое, что и я сделал...

    Простите за мои весьма глупые вопросы, просто мне до вас ещё далеко. :)

    P.S. Да, я перепутал B8 с 8B сорри.
     
  6. nermest

    nermest New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    157
    Макрос работает таким образом:
    Сначала берется указатель _Function и преводится к типу char - это значит, что в памяти мы "смотрим" на 1 байт. Прибавляя еденицу, мы смещаемся на 1 байт, таким образом, смотрим мы уже на номер функции - он занимает целый лонг, поэтому приводится указатель к типу указатель на лонг.
    Если в переменной func лежит адрес начала
    Код (Text):
    1. mov ebx, func
    2. mov eax, [ebx+1]
    ]
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    работает где? В драйвере?
     
  8. cembo

    cembo New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    17
    Именно, сам пока нетестил, но в книжке Rootkits: Subverting the Windows Kernel прочитал, что данний макрос используется в драйвере и помогает поставить хук в ссдт. Я понимаю, что он необязателен, но раз начал портировать, то хотел бы и закончить. :)

    Поменял фунцию, на ту, которую ти запостил, и вот результат:

    ZwCreateFile: b8934025
    ZwDeleteFile: b8934425

    типа есть b8 , но селдующий байт неменяется.