Odczytywanie rejestrów MSR na poziomie użytkownika (ring 3 )

0

Witam,

Potrzebuję pobrać dane z rejestrów MSR będąć na poziomie użytkownika (ring 3) w systemie Windows. Niestety specyfikacja Intel'a podaje że próba odwołania sie do niego z poziomu >0 skutkuje błędem ochrony.
Da się to jakoś obejść ? Np przerzucić program do ring 0. Nie uśmiecha mi się szczerze mówiąc pisanie sterownika po to żeby odczytać parę bajtów informacji o procesorze.

Pozdrawiam,
W2K

0

Zainteresuj się crackingiem i rootkitami :) Poniższy kod wymaga uprawnień administratora.

#include "stdafx.h"
#include "windows.h"
#include "stdio.h"

const IA32_SYSENTER_CS  = 0x174;
const IA32_SYSENTER_ESP = 0x175;
const IA32_SYSENTER_EIP = 0x176;

struct MSR_STRUCT {
	DWORD MsrNum; // MSR number
	DWORD NotUsed; // Never accessed by the kernel
	DWORD MsrLo; // IN (write) or OUT (read): Low 32 bits of MSR
	DWORD MsrHi; // IN (write) or OUT (read): High 32 bits of MSR
};
typedef enum DEBUG_CONTROL_CODE {
	DebugSysReadIoSpace = 14,
	DebugSysWriteIoSpace,
	DebugSysReadMsr,
	DebugSysWriteMsr,
	DebugSysReadBusData,
	DebugSysWriteBusData
};
typedef int(__stdcall *ZWSC)(
	DEBUG_CONTROL_CODE ControlCode,
	PVOID InputBuffer,
	ULONG InputBufferLength,
	PVOID OutputBuffer,
    ULONG OutputBufferLength,ULONG* ReturnLength);

ZWSC ZwSystemDebugControl;


int main()
{
	TOKEN_PRIVILEGES tp;
	HANDLE hToken;

	// adjust debug privileges
	OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
	LookupPrivilegeValue(0, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
	tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
	tp.PrivilegeCount = 1;
	AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
	CloseHandle(hToken);


	MSR_STRUCT msr;
	ZwSystemDebugControl = (ZWSC)GetProcAddress(GetModuleHandle("ntdll.dll"), "ZwSystemDebugControl");
	if (!ZwSystemDebugControl)
		return printf("ntdll required\n");

	msr.MsrNum = IA32_SYSENTER_CS;
	if (!ZwSystemDebugControl(DebugSysReadMsr, &msr, sizeof(MSR_STRUCT), 0, 0, 0))
		printf("IA32_SYSENTER_CS: %X\n", msr.MsrLo);

	msr.MsrNum = IA32_SYSENTER_ESP;
	if (!ZwSystemDebugControl(DebugSysReadMsr, &msr, sizeof(MSR_STRUCT), 0, 0, 0))
		printf("IA32_SYSENTER_ESP: %X\n", msr.MsrLo);

	msr.MsrNum = IA32_SYSENTER_EIP;
	if (!ZwSystemDebugControl(DebugSysReadMsr, &msr, sizeof(MSR_STRUCT), 0, 0, 0))
		printf("IA32_SYSENTER_EIP: %X\n", msr.MsrLo);

	return 0;
}
0

Dzięki sapero. W sumie to mile widziany byłby opis tego kodu. Nie lubię wklepywać kodu którego nie rozumiem

0

Czego nie rozumiesz?
Jedną z kilku furtek do ring0 bez używania jakichś driverów jest funkcja ZwSystemDebugControl, ale aby jej użyć system NT wymaga od procesu uprawnień debuggera, co można załatwić standardowym kodem z AdjustTokenPrivileges, lub uruchomić program z konta systemowego gdzie takie uprawnienie jest automatycznie nadawane.

Odpowiednio używając funkcji ZwSystemDebugControl możesz wywołać dowolny kod z pełnymi prawami systemu, ale jest to ryzykowna droga bo o nieoczekiwane przerwanie bardzo łatwo :)

0

Czy ktoś orientuje sie w jaki sposób odczytać msr pod vistą?

1 użytkowników online, w tym zalogowanych: 0, gości: 1