C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Ring0 - Вызов функции с PL0 (в нулевом кольце защиты). ОС: Win9x/Me (VC) / Общие вопросы. / Система. Общее

Ring0 - Вызов функции с PL0 (в нулевом кольце защиты). ОС: Win9x/Me (VC)

//Test.cpp
#include <windows.h>
#include <stdio.h>
#include "ring0.h"


DWORD __fastcall CheckRing0(void);


int main(int argc, char* argv[])
{
DWORD dwPL;

  dwPL = CheckRing0();
  printf("Ring - %d\n", dwPL);

  CallRing0((PRING0FUNC)CheckRing0, 0, &dwPL);
  printf("Ring - %d\n", dwPL);

  return 0;
}


DWORD __fastcall CheckRing()
{
  __asm
  {
    xor   eax,eax
    mov   ax,cs
    and   al,3
  } 
}


********************************************************************

//Ring0.h
#ifndef __RING0_H__
#define __RING0_H__


typedef DWORD (__fastcall *PRING0FUNC)(DWORD dwParams);


BOOL  CallRing0(PRING0FUNC pRing0Func, DWORD dwParams, LPDWORD lpdwRetValue);


#endif // __RING0_H__


********************************************************************
//Ring0.cpp
#include <windows.h>
#include "ring0.h"


/******************************************************************************/
/*                         !!! Только для Win9x !!!                           */
/******************************************************************************/

void  Ring0FarFunc();

__declspec(naked) BOOL CallRing0(PRING0FUNC pRing0Func, DWORD dwParams,
                                 LPDWORD lpdwRetValue)
{
  __asm
  {
    push  ebp
    mov   ebp,esp
    push  esi

    /* Определяем базовый адрес LDT */
    sldt  ax                  /* AX = селектор LDT */
    and   eax,0FFF8h
    jz    NoFreeEntries

    push  esi
    sgdt  FWORD PTR [esp-2]
    pop   esi                 /* ESI = базовый адрес GDT */
    add   esi,eax

    movzx ecx,WORD PTR [esi]
    inc   ecx
    shr   ecx,3               /* ECX = число дескрипторов в LDT */
    mov   edx,[esi+1]
    mov   dl,[esi+7]
    ror   edx,8               /* EDX = базовый адрес LDT */
    mov   esi,edx

    /* Ищем свободный дескриптор в LDT */
EntryLoop:
    cmp   BYTE PTR [esi+5],0
    je    FoundFreeEntry
    add   esi,8
    loop  EntryLoop

NoFreeEntries:
    xor   eax,eax
    jmp   Done

FoundFreeEntry:
    /* Найден свободный дескриптор LDT */

    /* Преобразуем дескриптор LDT в шлюз вызова */
    mov   eax,OFFSET Ring0FarFunc
    mov   DWORD PTR [esi],eax
    mov   DWORD PTR [esi+4],eax
    mov   DWORD PTR [esi+2],0EC000028h

    /* Вызываем процедуру через шлюз вызова */
    mov   eax,esi
    sub   eax,edx
    or    al,7                /* AX = селектор шлюза вызова */
    push  ax
    push  eax
    mov   eax,[pRing0Func]
    mov   ecx,[dwParams]
    call  FWORD PTR [esp]
    add   esp,6
    mov   ecx,[lpdwRetValue]
    jecxz FreeEntry
    mov   DWORD PTR [ecx],eax

FreeEntry:
    /* Освобождаем дескриптор LDT */
    xor   eax,eax
    mov   DWORD PTR [esi],eax
    mov   DWORD PTR [esi+4],eax
    inc   eax

Done:
    pop   esi
    pop   ebp
    ret
  }
}

__declspec(naked) void Ring0FarFunc()
{
  __asm
  {
    call  eax
    retf
  }
}