NativeAPI

Тема в разделе "WASM.WIN32", создана пользователем n0name, 29 сен 2004.

  1. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    При дизасме некоторых функций ntdll.dll можно увидеть код такого типа:
    Код (Text):
    1.  
    2.   mov     eax, 101h
    3.   mov     ebx, 7FFE0300h
    4.   call    ebx
    5.  


    Это для Nt/ZwTerminateProcess.

    Если я вставлю это в свою прогу то вырабатывается исключение по адрессу 7FFE0297h на доступ к ячейке 101h. Почему?



    Всё это в WinXP. В Win2k всё это сделано иначе.
     
  2. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    А перед этим 2х push не должно быть?
     
  3. PavPS

    PavPS New Member

    Публикаций:
    0
    Регистрация:
    24 фев 2004
    Сообщения:
    109
    Адрес:
    Russia
    2n0name чтай Свена Шрайбера. Там всё подробно разжёвано.
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Должно, но только если не реализовывать этот код как отдельную процедуру.



    вот весь мой код:
    Код (Text):
    1.  
    2.  push 0
    3.  push FFFFFFFFh
    4.  mov eax, 101h
    5.  mov ebx, 7FFE0300h
    6.  call ebx
    7.  




    ZwTerminateProcess(LONG; LONG);
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    2PavPS:

    Свен пишет про Win2K.

    Там механизм сис вызовов через int 2E реализован.

    В WinXP по другому.
     
  6. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    n0name



    Правда. Но есть другой вопрос. Ты абсолютно точно уверен, что в твоей версии XP используются ИМЕННО ЭТИ СМЕЩЕНИЯ?
     
  7. PavPS

    PavPS New Member

    Публикаций:
    0
    Регистрация:
    24 фев 2004
    Сообщения:
    109
    Адрес:
    Russia
    2 n0name

    Всё верно! Пишет. Если не видешь Int 2Eh, то не значит, что это не то! Попробуй ка глянь, что такое там сидит за ф-я по адресу 7FFE0300h?? А? SYSENTER. Всё верно. А теперь набери в SoftIce "ntcall", и увидешь что за ф-я там под номером 101h. Это и будет для все Win2K,XP



    2 volodya

    Ради прикола - совпадения, но у меня тоже адрес 7FFE0300h :)))))
     
  8. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    n0name >




    Call тоже ложит DWORD в стек.

    Не call ebx, а тот которого как раз нет в твоём коде после push'ей.



    см. ntdll!NtTerminateProcess - ret 8 снимает 3 DWORD'а
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    2 volodya

    это смещение для всех SP под WinXP.

    2 PavPS

    Мож показать код. Такой у меня не работает:
    Код (Text):
    1.  
    2. .586p
    3. .model  flat,stdcall
    4. .code
    5. start:
    6. ; push eax        ; pseudo ret addr
    7.  push 0h          ; ExitCode
    8.  push 0FFFFFFFFh  ; ProcHndl
    9.  mov eax, 101h    ; 101h = ZwTerminateProcess
    10. ; mov edx, 7FFE0300h
    11. ; call edx
    12.  int 02Eh
    13. end start
    14.  




    2 S_T_A_S_

    Я знаю, что call ложит в стек адресс возврата.

    Но код не работает ни с дополнительным pushem, ни буз него.
     
  10. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    n0name, сначала вызови...
    Код (Text):
    1.     invoke ZwTerminateProcess, -1, 0


    ...внимательно пройди под отладчиком и смотри на esp, потом делйа так:
    Код (Text):
    1.  
    2.     push 0
    3.     push 0FFFFFFFFh
    4.     push 'Wasm'
    5.     mov  eax, 0101h
    6.     mov  edx, 7ffe0300h
    7.     call edx
    8.  
     
  11. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    2 Four-F:

    tnx за направление в котором надо было копать.

    Такой код у меня работает:
    Код (Text):
    1.  
    2. .386
    3. .model flat, stdcall
    4. option casemap :none
    5. .code
    6. start:
    7.  push 0
    8.  push 0FFFFFFFFh
    9.  push eax
    10.  mov  eax, 0101h
    11.  mov  edx, 7ffe0300h
    12.  call DWORD PTR ds:[edx]
    13. end start
    14.  
     
  12. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    IMHO этот код не рабочий - ОС просто прибивает процесс по-тихой из-за access violation при попытке выполнить несуществующий код по адресу 340FD48Bh
     
  13. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    сорри, инет совсем глючный :dntknw:
     
  14. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    S_T_A_S_

    сорри, инет совсем глючный :dntknw:



    Это не инет, это что-то с форумом, последние несколько дней днем оооочень тормозит :-(
     
  15. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Неа не прибивает =)

    Просто в SP2 всё переиначили =(

    Теперь вместо

    call edx

    надо писать

    call DWORD PTR ds:[edx]

    Тогда на SP2 работает а на SP1 и просто WinXP - нет.

    Из этого вопрос:

    Как сделать и для WinXP и для SP2?

    Пробовал через int 2Eh и через sysenter, но ничего не фурычит.

    Через sysenter я ret. address назначаю $+14.

    Это nop. Но процесс исполняется дальше!!!

    Хотя должен был завершиться.
    Код (Text):
    1.  
    2.  
     
  16. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Сорри код забыл =)
    Код (Text):
    1.  
    2. .386
    3. .model flat, stdcall
    4. option casemap :none
    5. .code
    6. start:
    7.  push 0
    8. ; push 0FFFFFFFFh
    9.  push -1
    10.  push $+14
    11.  mov  eax, 0101h
    12. ; int 2Eh
    13. ; mov  edx, 7ffe0300h
    14. ; call DWORD PTR ds:[edx]
    15.  mov edx, esp
    16.  dw  340Fh ; sysenter
    17. ; nop
    18. end start
    19.  
     
  17. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Знатоки асма не могли бы протестить плиз.

    На моём WinXP SP2 всё работает.

    А вот на других системах не знаю.

    Если можно проверьте на WinXP, WinXP SP1, Win2k, Win2k SP4, WinNT 4.0, Win9X.
    Код (Text):
    1.  
    2. .386
    3. .model flat, stdcall
    4. option casemap :none
    5. .code
    6. start:
    7.  push 0
    8.  push -1
    9.  push 'WASM'
    10.  push 'COOL'
    11.  mov  eax, 0101h
    12.  mov edx, esp
    13.  dw  340Fh ; sysenter
    14. end start
    15.  
     
  18. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Тот код, который я приводил у мя под XP sp0 работает. Твой тоже.
     
  19. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Ниже XP можно и не пытаться , там sysenter - привелигированная инструкция . Да и циферки другие , могут вообще левые сервисы быть .
     
  20. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    2 bogrus:

    Мож тогда реализацию int 2Eh для Win2k показать - у меня под рукой дистра нет.