
08.07.2015, 12:37
|
|
Постоянный
Регистрация: 26.12.2007
Сообщений: 353
Провел на форуме: 905389
Репутация:
332
|
|
И так, коли за это время не поступило даже одного вопроса (не считая yarbabin), я решил расширить критерии.
Теперь используем следующие ОС: XP/Vista/7/8/10
И архитектуры: x32/x64
Приведу пример:
Сообщение от None
ОС:
Windows XP (x32)
Системный вызов:
Код:
NTSTATUS ZwTerminateProcess(
_In_opt_ HANDLE ProcessHandle,
_In_ NTSTATUS ExitStatus
);
Вызов:
Код:
ExitStatus equ 0x12345678
push ExitStatus
push -1 ;ProcessHandle
push 0 ;любое значение главное занять 4 байта =)
push 0 ;по сути здесь должен быть адрес возврата, куда будет передано управление после выполнения ядром своих функций. Но Ядро в этом системном вызове не проверяет это значение
mov edx,esp ;адрес по которому лежит адрес возврата. Должен принадлежать стеку и не может быть нулем, проверяется ядром.
mov eax, 0x101 ;номер системного вызова ZwTerminateProcess = 0x101
sysenter
Зависимости выполнения: отсутствуют
Пример № 2:
Сообщение от None
ОС:
Windows 8 (x32)
,
Windows 8.1 (x32)
Системный вызов:
Код:
NTSTATUS ZwTerminateProcess(
_In_opt_ HANDLE ProcessHandle,
_In_ NTSTATUS ExitStatus
);
Вызов:
Код:
ExitStatus equ 0x12345678
push ExitStatus
push -1 ;ProcessHandle
push 0 ;любое значение главное занять 4 байта =)
push 0 ;по сути здесь должен быть адрес возврата, куда будет передано управление после выполнения ядром своих функций. Но Ядро в этом системном вызове не проверяет это значение
mov edx,esp ;адрес по которому лежит адрес возврата. Должен принадлежать стеку и не может быть нулем, проверяется ядром.
mov eax, 0x23 ;номер системного вызова ZwTerminateProcess = 0x23
sysenter
Зависимости выполнения: отсутствуют
Как видно, с Windows XP изменился только номер системного вызова.
|
|
|