Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Native API


noname ©   (2004-09-29 17:50:00) 

При дизасме некоторых функций ntdll.dll можно увидеть код такого типа:

 mov     eax, 101h
 mov     ebx, 7FFE0300h
 call    ebx

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

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


n0name   (2004-09-30 13:04:00) [1]

У меня работает вот так:

unit ZwTerminateProc;

interface

uses
Windows;

function ZwTerminateProcess(ProcHndl: DWORD; ExitCode: DWORD): Integer; stdcall;

implementation

function ZwTerminateProcess(ProcHndl: DWORD; ExitCode: DWORD): Integer; stdcall;
asm
push 0
push 0FFFFFFFFh
push eax
mov  eax, 0101h
mov  edx, 7ffe0300h
call DWORD PTR ds:[edx]
ret 8
end;

end.


Надо через DWORD по адресу 7ffe0300h.
push eax - для фейкого ret. address.


Игорь Шевченко   (2004-09-30 10:11:00) [2]

n0name   (30.09.04 09:29) [7]

Тогда я не знаю, чем тебе помочь. У меня мой пример работает, WinXP Pro Russian, без SP.

Hint: при установке сервис-паков номера функций в NTDLL меняются.


n0name   (2004-09-30 09:29:00) [3]

eиx - ebx.
заменял на edx.
Твой пример у меня тож не работает =).


Игорь Шевченко   (2004-09-29 23:11:00) [4]

Замени регистр на edx. И выкинь дизассемблер.


Игорь Шевченко   (2004-09-29 22:20:00) [5]


> mov eиx, $7FFE0300
> call eиx


Что за регистр ?


n0name   (2004-09-29 18:59:00) [6]

Извини.

program Test;

{$APPTYPE CONSOLE}

function MyZwTerminateProcess(hProc: LongWord; Code: LongWord): Integer; stdcall;
asm
pop ebp
mov eax, $101
mov eиx, $7FFE0300
call eиx
ret 8
end;

begin
MyZwTerminateProcess($FFFFFFFF, 0);
end.

Вот это всё и не работает =(


Игорь Шевченко   (2004-09-29 18:29:00) [7]


> А у меня он какой?


Вот если бы ты код показал...А то я в угадайку играю.

Я, например, так делал:

unit HSXPCalls;

interface
uses
 Windows;

function HSNtUserCreateWindowEx (p1,p2,p3,p4,p5, X, Y, Width, Height : Integer;
                            hWndParent : HWND; p11,
                            p12,p13,p14,p15 : Integer) : HWND; stdcall;
implementation

function HSNtUserCreateWindowEx (p1,p2,p3,p4,p5, X, Y, Width, Height : Integer;
                            hWndParent : HWND; p11,
                            p12,p13,p14,p15 : Integer) : HWND; stdcall;
asm
 pop ebp
 mov eax,00001157h
 mov edx,7FFE0300h
 call edx
 ret 60
end;

end.


n0name   (2004-09-29 18:22:00) [8]

А у меня он какой?
Я push'ом аргументы передаю.
В ntdll.dll никаких изменений с esp нет.


Игорь Шевченко   (2004-09-29 18:03:00) [9]


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


Потому что указатель стека еще нужен корректный


Наверх

Титульная страница Поиск, карта сайта Написать письмо