мега-кул, ребята! ваши иследования помогли разобраться в теме
int vs
sysenter..
вобщем, тоже вот крутилась в голове идея на тему "служебных входов" в
kmode в
win2k, без особо лишних телодвижений (иногда довольно тесно приходится общаться с железяками, в связке с SoftICE).
И хотя это было не особо актуально - ну какбы усё боле-менее работало через драйвера, а вот решил заюзать прерывания - всетаки, как никак инструкция CPU, а не какие нить, системные функции (в которых я мало рублю, да и так, надебажив, этак с километр, пропадет охота там чето юзать).
что получилось.. поскрёб тут по сусекам в поисках DPL3 backdor'ов, и ага! int 2Ah, вроде как без дела торчит, с софт-айсом выйти на код обработчика, трабл особо никаких. не долго думая меняю обработчик забитый в глубинах
ntoskrnl следующим макаром.
и.. бугага, бугага, бугага, код пашет так как и планировалось - в ring3 проге, обрабатываю прерывания.
Code: Select all
function int2A (_eax, _edx, _ecx :integer):integer;
asm
pop ecx // eip to return in r3
int $2A
nop
nop
nop
nop
iretd;
end;
Потом мне этого показалось маловато, решил зохавать и
sysenter. Вот, нарисовалась тестовая прога.
{$apptype console}
program test; uses windows;
const
count = 20000000;
MSR_SYSENTER_CS = $174;
MSR_SYSENTER_ESP = $175;
MSR_SYSENTER_EIP = $176;
var i, dwStart : integer;
function sys_enter:integer;
asm
sti
sysexit
end;
function sysenter(_eax, _edx, _ecx :integer):integer;
asm
pop edx // eip to return in r3
mov ecx, esp // esp to return in r3
sysenter
end;
function int2A (_eax, _edx, _ecx :integer):integer;
asm
pop ecx // eip to return in r3
int $2A
nop
nop
nop
nop
iretd;
end;
procedure setup_MSR;
asm
pop ecx
mov ebp, esp
int $2A
xor edx, edx
lea eax, sys_enter //загрузить указатель обработчика
mov ecx, MSR_SYSENTER_EIP
wrmsr
mov ecx, MSR_SYSENTER_CS
mov eax, 8 //WinNT kmode selector
wrmsr
mov eax, ebp
mov ecx, MSR_SYSENTER_ESP
wrmsr
iretd
end;
begin
write ('Wait... ');
Setup_MSR;
dwStart := GetTickCount;
for i:= 0 to count do int2A(0,0,0);
Write('int test: ', GetTickCount - dwStart, ', ');
dwStart := GetTickCount;
for i:= 0 to count do sysenter(0,0,0);
Writeln('sysenter test: ', GetTickCount - dwStart);
end.
результаты (на cel-1300):
Wait... int test: 4204, sysenter test: 1031
в принципе, с пивком потянет.
Так, веду кой какие разработки DOSx расширителя (по мотивам WDOSx & FreeDOS32),
вот.. ну а эNTяа2k, довольно ничего так полигон, для обкатки решений..
боле-менее на DOS начал смахивать, (хыы, а вместо Turbo Pascal7 - Turbo Delphi)... вотъ...