Как определить адрес функции путем импорта ее из ядра?

Тема в разделе "WASM.WIN32", создана пользователем Guest, 11 янв 2006.

  1. Guest

    Guest Guest

    Публикаций:
    0
    Читаю третью статью Ms Remа, пытаюсь написать аналогичный драйвер на ассемблере, который перехватывает функцию

    NtOpenProcess, не могу понять как правильно на асме высчитать адрес ф-и. Вот у автора вычисляется таким образом
    Код (Text):
    1.  
    2.     POldCode Func = (POldCode)NtOpenProcess;
    3.     pfar_jmp Fnjp = (pfar_jmp)NtOpenProcess;
    4.  


    как вычислить на асме?
     
  2. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Если пишешь на фасме, то mov eax, [NtOpenProcess]

    P.S. способ с постоянной установкой/снятием хука юзать в ядре нельзя, очень нестабильно. Юзай лучше сплайсинг с дизасмом длин или хуки через SDT.
     
  3. Guest

    Guest Guest

    Публикаций:
    0
    Более того провел небольшое исследование, вот как компилятор C++ переводит этот код POldCode Func = (POldCode)NtOpenProcess;
    Код (Text):
    1.  
    2. .idata:00010508 extrn NtOpenProcess:dword
    3. .text:0001045E  mov   eax, ds:NtOpenProcess
    4.  


    вот что получается у меня средствами масма
    Код (Text):
    1.  
    2. .idata:000103B0                 extrn NtOpenProcess:dword
    3. .text:0001038A                 jmp     ds:NtOpenProcess
    4. .text:00010264                 lea     esi, loc_1038A
    5.  




    вот строка
    Код (Text):
    1.  
    2. lea esi,NtOpenProcess
    3.  


    получается что масм ставит заглушку, тоесть перхват я так понимаю не получится?
     
  4. Guest

    Guest Guest

    Публикаций:
    0


    нет на масм32



    Синий экран вылетает чтоли?



    Про это где почитать? Я об дизасме длин и понятия не имею



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

    2. это ж надо под каждую винду НТ знать номер ф-и в ядре?

    меняется номер ф-и в различных сервиспаках, или только в разных версия винды (2к,ХР,2к3 ?)
     
  5. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"


    Вторая статья про апихуки.



    Ну, их можно скрыть.



    Нет, можно извлечь номер из соответствующей функции ntdll.
     
  6. Guest

    Guest Guest

    Публикаций:
    0
    А каким образом тот же каспер или аутпост хуки ставят?

    Или они какой то новый метод изобрели?

    Что если поставить перехват на одну и ту же функцию, допустим обычным сплайсингом, может быть синий экран? (при устовии что допустим перехват в разных местах)

    (Как показала практика др. веб и нортон несовместимы. Синий экран сразу после илициализации сервисов)
     
  7. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"


    Хукают SDT.





    Зависит от того, правильно ли реализован перехват (обрабатываются ли rel32 команды при переносе куска кода).
     
  8. Guest

    Guest Guest

    Публикаций:
    0
    В общем наверное тоже остановлюсь на SDT. Видел твою утилиту, которая достает номера системных вызовов. Напишу такую же только для асма, чтото типа этого



    get_ntdll_func_number proc lpszFuncName:dword



    кому надо потом выложу
     
  9. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Код (Text):
    1. ULONG GetSdtEntryNumber(IN PCSTR lpProcName)
    2. {
    3.     PUCHAR  pProc  = GetProcAddress(GetModuleHandle("ntdll.dll"), lpProcName);
    4.  
    5.     if (pProc) return *(PULONG)(pProc + 1);
    6.    
    7.     return 0;  
    8. }
     
  10. Guest

    Guest Guest

    Публикаций:
    0
    мда... а я уже до экспорта из ntdll добрался ч-з PE заголовок... а все проще оказывается

    Это ж надо до такого дожится =). Спасибо МС Рему



    p.s. Вот перевел на асм может кому надо
    Код (Text):
    1.  
    2. get_sdt_entry_number    proc uses ebx   lpszProcName:dword
    3.    
    4.     xor ebx,ebx
    5.     lea eax,szNtDll
    6.     invoke  GetModuleHandle,eax
    7.     .if eax
    8.         invoke  GetProcAddress,eax,lpszProcName
    9.         .if eax
    10.             mov ebx,eax
    11.             inc ebx
    12.             mov ebx,[ebx]
    13.         .endif
    14.     .endif 
    15.     mov eax,ebx
    16.     ret
    17.     szNtDll db  "ntdll.dll",0
    18. get_sdt_entry_number endp
    19.  
    20.  
     
  11. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Если этот код предполагается юзать из ядра, то нужна своя реализация GetModuleHandle и GetProcAddress.

    Куски моего пелоадера гдето на форуме проскакивали, так что ищите кому надо.
     
  12. Guest

    Guest Guest

    Публикаций:
    0
    Нет, я планирую передавать номер ф-и драйверу ч-з

    DeviceIoControl
     
  13. Sharp

    Sharp New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2003
    Сообщения:
    143
    Адрес:
    Ukraine
    Я ошибаюсь или этот код:
    Код (Text):
    1. inc ebx


    не равен этому:
    Код (Text):
    1. *(PULONG)(pProc + 1);


    Ведь согласно арифметике указателей, в Си-коде возвращается значение+4?
     
  14. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    указатель pProc обьявлен как PUCHAR, следовательно прибавляется 1