· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› NativeAPI

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Сен 29, 2004 17:52:45

При дизасме некоторых функций ntdll.dll можно увидеть код такого типа:
  mov     eax, 101h
  mov     ebx, 7FFE0300h
  call    ebx

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

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


Дата: Сен 29, 2004 18:59:20

А перед этим 2х push не должно быть?


Дата: Сен 29, 2004 19:15:44

2n0name чтай Свена Шрайбера. Там всё подробно разжёвано.


Дата: Сен 29, 2004 19:18:40

Должно, но только если не реализовывать этот код как отдельную процедуру.

вот весь мой код:
 push 0 
 push FFFFFFFFh
 mov eax, 101h
 mov ebx, 7FFE0300h
 call ebx


ZwTerminateProcess(LONG; LONG);


Дата: Сен 29, 2004 19:19:49

2PavPS:
Свен пишет про Win2K.
Там механизм сис вызовов через int 2E реализован.
В WinXP по другому.


Дата: Сен 29, 2004 20:08:02

n0name

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


Дата: Сен 29, 2004 21:55:30

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

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


Дата: Сен 29, 2004 22:24:07 · Поправил: S_T_A_S_

n0name > „но только если не реализовывать этот код как отдельную процедуру. “

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

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


Дата: Сен 30, 2004 09:39:54

2 volodya
это смещение для всех SP под WinXP.
2 PavPS
Мож показать код. Такой у меня не работает:
.586p
.model  flat,stdcall
.code
start:
; push eax        ; pseudo ret addr
 push 0h          ; ExitCode
 push 0FFFFFFFFh  ; ProcHndl
 mov eax, 101h    ; 101h = ZwTerminateProcess
; mov edx, 7FFE0300h
; call edx
 int 02Eh
end start


2 S_T_A_S_
Я знаю, что call ложит в стек адресс возврата.
Но код не работает ни с дополнительным pushem, ни буз него.


Дата: Сен 30, 2004 11:46:19

n0name, сначала вызови...
    invoke ZwTerminateProcess, -1, 0

...внимательно пройди под отладчиком и смотри на esp, потом делйа так:
    push 0 
    push 0FFFFFFFFh
    push 'Wasm'
    mov  eax, 0101h
    mov  edx, 7ffe0300h
    call edx


Дата: Сен 30, 2004 13:06:31

2 Four-F:
tnx за направление в котором надо было копать.
Такой код у меня работает:
.386
.model flat, stdcall
option casemap :none
.code
start:
 push 0 
 push 0FFFFFFFFh
 push eax
 mov  eax, 0101h
 mov  edx, 7ffe0300h
 call DWORD PTR ds:[edx]
end start


Дата: Сен 30, 2004 16:04:16

IMHO этот код не рабочий - ОС просто прибивает процесс по-тихой из-за access violation при попытке выполнить несуществующий код по адресу 340FD48Bh


Дата: Сен 30, 2004 16:26:21 · Поправил: S_T_A_S_

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


Дата: Сен 30, 2004 17:07:16

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

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


Дата: Сен 30, 2004 17:16:43

Неа не прибивает =)
Просто в SP2 всё переиначили =(
Теперь вместо
call edx
надо писать
call DWORD PTR ds:[edx]
Тогда на SP2 работает а на SP1 и просто WinXP - нет.
Из этого вопрос:
Как сделать и для WinXP и для SP2?
Пробовал через int 2Eh и через sysenter, но ничего не фурычит.
Через sysenter я ret. address назначаю $+14.
Это nop. Но процесс исполняется дальше!!!
Хотя должен был завершиться.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.043