если вы видите этот текст, отключите в настройках форума использование JavaScript
Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания .
Новичкам также крайне полезно ознакомиться с данным документом .
[ASM] Переход в RING 0 под виндой 28.10.01 11:18 Число просмотров: 1126
Автор: z0 <z0> Статус: Member
> Пожалкуйста ссылки или примеры!
в винде 9.х таблицы дескрипторов не защищены страничной защитой.
модификация GDT/IDT дает возможность получения PL0 в юзеровском коде
ниже приведена одна из возможных техник перехода на PL0
1) просмотр GDT и нахождение 2-х пустых слотов
2) в них делаем call gate с 3 на 0 кольцо и алиас юзеровского
дескриптора кода с PL0
3) используем этот call gate на какую-нибудь свою процедуру (ВАЖНО!!!
СИСТЕМНЫЕ Ф-ИИ В ЭТОЙ ПРОЦЕДУРЕ РАБОТАТЬ НЕ БУДУТ. RTFM. МОЖНО ИСПОЛЬЗОВАТЬ ЛИШЬ VXD-СЕРВИСЫ)
4) возвращаемся из процедуры PL0 через тот же call gate
5) восстанавливаем GDT
возможны и другие методики (например через IDT) но это IMHO самая простая
винды на основе NT не позволяют такого обращения, там или через .SYS или патчем загрузчика NTLDR
------------------------------ CUT -----------------------------------
.386p
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
code32 segment byte public use32 'CODE'
assume cs:code32
assume ds:data
;input EDX=0 RW selector; else R selector
;output AX selector; 0=failed
data4g proc
push ecx
push edx
push ebx
mov edx,eax
sgdt [gdtr]
movzx ecx,word ptr [gdtr]
shr ecx,3
mov eax,8
a_0: lsl ebx,eax
jnz a_1
inc ebx
or ebx,ebx
jnz a_1
verr ax
jnz a_1
or edx,edx
jnz a_2
verw ax
jnz a_1
a_2: pop ebx
pop edx
pop ecx
ret
a_1: add eax,8
loop a_0
xor eax,eax
jmp a_2
data4g endp
pl0code proc far
call near dword ptr [pl0task]
ret
pl0code endp
public gate0open
;input NO
;output EAX<>0 -> pl0 call structure pointer
; EAX=0 -> error
gate0open proc
push ecx
push ebx
push esi
push edi
push gs
xor eax,eax
mov [code_offset],eax
mov [gate_offset],eax
call data4g
or ax,ax
jz a_ff
mov gs,ax
mov esi,dword ptr [gdtr+2]
mov ax,cs
test ax,4
jnz a_0
mov edi,esi
jmp a_1
a_0: xor edi,edi
sldt di
and di,0fff8h
mov bl,gs:[esi+edi+7]
shl ebx,8
mov bl,gs:[esi+edi+4]
shl ebx,10h
mov bx,gs:[esi+edi+2]
mov edi,ebx
a_1: movzx ecx,word ptr [gdtr]
shr ecx,3
mov ebx,8
a_2: cmp dword ptr gs:[esi+ebx],0
jnz a_3
cmp dword ptr gs:[esi+ebx+4],0
jnz a_3
jmp a_4
a_3: add ebx,8
loop a_2
jmp a_ff
a_4: and ax,0fff8h
push gs:[edi+eax]
push gs:[edi+eax+4]
pop gs:[esi+ebx+4]
pop gs:[esi+ebx]
and byte ptr gs:[esi+ebx+5],9fh
mov [code_offset],ebx
mov edi,ebx
a_5: cmp dword ptr gs:[esi+ebx],0
jnz a_6
cmp dword ptr gs:[esi+ebx+4],0
jnz a_6
jmp a_7
a_6: add ebx,8
loop a_5
jmp a_fe
a_7: mov gs:[esi+ebx+2],di
mov eax,offset pl0code
mov gs:[esi+ebx],ax
shr eax,10h
mov gs:[esi+ebx+6],ax
mov word ptr gs:[esi+ebx+4],0ec00h
mov [gate_offset],ebx
mov word ptr [pl0gate_ptr+4],bx
or word ptr [pl0gate_ptr+4],3
mov eax,offset pl0task
a_8: pop gs
pop edi
pop esi
pop ebx
pop ecx
ret
a_fe: mov dword ptr gs:[esi+edi],0
mov dword ptr gs:[esi+edi+4],0
a_ff: xor eax,eax
jmp a_8
gate0open endp
public gate0close
;input NO
;output EAX<>0 -> ok
; EAX=0 -> error
gate0close proc
push ecx
push ebx
push esi
push gs
mov ebx,[code_offset]
or ebx,ebx
jz b_ff
mov ecx,[gate_offset]
or ecx,ecx
jz b_ff
xor eax,eax
call data4g
or ax,ax
jz b_0
mov gs,ax
mov esi,dword ptr [gdtr+2]
mov dword ptr gs:[esi+ebx],0
mov dword ptr gs:[esi+ebx+4],0
mov dword ptr gs:[esi+ecx],0
mov dword ptr gs:[esi+ecx+4],0
b_0: pop gs
pop esi
pop ebx
pop ecx
ret
b_ff: xor eax,eax
jmp b_0
gate0close endp
code32 ends
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
data segment byte public
gdtr dw 0
dd 0
align 4
gate_offset dd 0
code_offset dd 0
pl0task dd 0
pl0gate_ptr dd 0
dw 0
data ends
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
end
------------------------------ CUT -----------------------------------
<programming >
[ASM] Переход в RING 0 под виндой 27.10.01 11:00
Автор: eXeC001er Статус: Незарегистрированный пользователь
Пожалкуйста ссылки или примеры!
[ASM] Переход в RING 0 под виндой 28.10.01 11:18
Автор: z0 <z0> Статус: Member
> Пожалкуйста ссылки или примеры!
в винде 9.х таблицы дескрипторов не защищены страничной защитой.
модификация GDT/IDT дает возможность получения PL0 в юзеровском коде
ниже приведена одна из возможных техник перехода на PL0
1) просмотр GDT и нахождение 2-х пустых слотов
2) в них делаем call gate с 3 на 0 кольцо и алиас юзеровского
дескриптора кода с PL0
3) используем этот call gate на какую-нибудь свою процедуру (ВАЖНО!!!
СИСТЕМНЫЕ Ф-ИИ В ЭТОЙ ПРОЦЕДУРЕ РАБОТАТЬ НЕ БУДУТ. RTFM. МОЖНО ИСПОЛЬЗОВАТЬ ЛИШЬ VXD-СЕРВИСЫ)
4) возвращаемся из процедуры PL0 через тот же call gate
5) восстанавливаем GDT
возможны и другие методики (например через IDT) но это IMHO самая простая
винды на основе NT не позволяют такого обращения, там или через .SYS или патчем загрузчика NTLDR
------------------------------ CUT -----------------------------------
.386p
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
code32 segment byte public use32 'CODE'
assume cs:code32
assume ds:data
;input EDX=0 RW selector; else R selector
;output AX selector; 0=failed
data4g proc
push ecx
push edx
push ebx
mov edx,eax
sgdt [gdtr]
movzx ecx,word ptr [gdtr]
shr ecx,3
mov eax,8
a_0: lsl ebx,eax
jnz a_1
inc ebx
or ebx,ebx
jnz a_1
verr ax
jnz a_1
or edx,edx
jnz a_2
verw ax
jnz a_1
a_2: pop ebx
pop edx
pop ecx
ret
a_1: add eax,8
loop a_0
xor eax,eax
jmp a_2
data4g endp
pl0code proc far
call near dword ptr [pl0task]
ret
pl0code endp
public gate0open
;input NO
;output EAX<>0 -> pl0 call structure pointer
; EAX=0 -> error
gate0open proc
push ecx
push ebx
push esi
push edi
push gs
xor eax,eax
mov [code_offset],eax
mov [gate_offset],eax
call data4g
or ax,ax
jz a_ff
mov gs,ax
mov esi,dword ptr [gdtr+2]
mov ax,cs
test ax,4
jnz a_0
mov edi,esi
jmp a_1
a_0: xor edi,edi
sldt di
and di,0fff8h
mov bl,gs:[esi+edi+7]
shl ebx,8
mov bl,gs:[esi+edi+4]
shl ebx,10h
mov bx,gs:[esi+edi+2]
mov edi,ebx
a_1: movzx ecx,word ptr [gdtr]
shr ecx,3
mov ebx,8
a_2: cmp dword ptr gs:[esi+ebx],0
jnz a_3
cmp dword ptr gs:[esi+ebx+4],0
jnz a_3
jmp a_4
a_3: add ebx,8
loop a_2
jmp a_ff
a_4: and ax,0fff8h
push gs:[edi+eax]
push gs:[edi+eax+4]
pop gs:[esi+ebx+4]
pop gs:[esi+ebx]
and byte ptr gs:[esi+ebx+5],9fh
mov [code_offset],ebx
mov edi,ebx
a_5: cmp dword ptr gs:[esi+ebx],0
jnz a_6
cmp dword ptr gs:[esi+ebx+4],0
jnz a_6
jmp a_7
a_6: add ebx,8
loop a_5
jmp a_fe
a_7: mov gs:[esi+ebx+2],di
mov eax,offset pl0code
mov gs:[esi+ebx],ax
shr eax,10h
mov gs:[esi+ebx+6],ax
mov word ptr gs:[esi+ebx+4],0ec00h
mov [gate_offset],ebx
mov word ptr [pl0gate_ptr+4],bx
or word ptr [pl0gate_ptr+4],3
mov eax,offset pl0task
a_8: pop gs
pop edi
pop esi
pop ebx
pop ecx
ret
a_fe: mov dword ptr gs:[esi+edi],0
mov dword ptr gs:[esi+edi+4],0
a_ff: xor eax,eax
jmp a_8
gate0open endp
public gate0close
;input NO
;output EAX<>0 -> ok
; EAX=0 -> error
gate0close proc
push ecx
push ebx
push esi
push gs
mov ebx,[code_offset]
or ebx,ebx
jz b_ff
mov ecx,[gate_offset]
or ecx,ecx
jz b_ff
xor eax,eax
call data4g
or ax,ax
jz b_0
mov gs,ax
mov esi,dword ptr [gdtr+2]
mov dword ptr gs:[esi+ebx],0
mov dword ptr gs:[esi+ebx+4],0
mov dword ptr gs:[esi+ecx],0
mov dword ptr gs:[esi+ecx+4],0
b_0: pop gs
pop esi
pop ebx
pop ecx
ret
b_ff: xor eax,eax
jmp b_0
gate0close endp
code32 ends
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
data segment byte public
gdtr dw 0
dd 0
align 4
gate_offset dd 0
code_offset dd 0
pl0task dd 0
pl0gate_ptr dd 0
dw 0
data ends
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
end
------------------------------ CUT -----------------------------------
[ASM] Если из DOS-программ, то... 27.10.01 13:36
Автор: Chingachguk <Chingachguk> Статус: Member
...То ниже есть диалог (тема - ASM), я там пример своей проги с комментариями кинул. Тама есть и другие примеры. Стандартный способ вроде vxd.