|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2001
Città: Torino
Messaggi: 712
|
[asm/C]chiamata con privilegi per leggere msr-SYSENTER?
Ciao, ho bisogno di leggere/scrivere un registro della cpu (intel) msr il 0x199, contentente moltiplicatore e v-core della cpu. ho trovato una funziona assembler "rdmsr" che dovrebbe fare al caso mio solo che và chiamata con i privilegi di kernel mode (livello 0), ho letto che la SYSENTER o un sistema call gate potrebbe fare al caso mio. ma nn ho capito come usarlo.
Qualche idea? mi andrebbe bene anche una funzione C o asm già fatta che legga i msr. ad esempio Crystal CPU (open source) fà quel lavoro ma nn riesco a nemmeno a ricompilare il programma o a estrarre le parti che mi servono perchè con VS dà un sacco di errori. Grazie
__________________
Ryzen 1600 - RTX 3060- Msi X370 - corsair 600gs - 16GB Corsair 3200 - iiyama LCD ---- ho fatto affari su mercatino con wubby, kisser, Pether, Airbus77, mrmic, gup133, buster, Nikydbp, rcurle, molti altri di cui ho perso i dati + 100 feedback ebay 100% pos
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
ma grazie al piffero (scusa la schiettezza), non é che puoi entrare in kernel mode e uscire cosi come ti pare
invocare SYSENTER per te é inutile, su Windows serve solo ad invocare le chiamate di sistema, quindi non faresti altro che invocare qualche servizio del kernel. non conosco questa istruzione rdmsr di cui parli e purtroppo al momento non ho a portata di mano i manuali dell'architettura x86, quindi non posso controllare, ma prima di impelagarti con la modalitá kernel controlla che quella sia effettivamente un'istruzione privilegiata. anyway, diamo per scontato che lo sia, e che tu debba scrivere un programma che gira in kernel mode: in Windows i programmi che girano in kernel mode si chiamano drivers. forse tu hai bisogno di scrivere un driver per Windows, che é una cosa molto lontana dall'essere semplice, comunque per poter giudicare se questa soluzione é appropriata per quello che devi fare servono informazioni aggiuntive su cosa vuoi ottenere. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2001
Città: Torino
Messaggi: 712
|
è privilegiata perchè compilandola su visual studio mi dà questo errore alla linea del comando rdmsr (file C++ con assembly inline):
Eccezione non gestita a 0x004113d5 in prova.exe: 0xC0000096: Privileged instruction. Devo semplicemente leggere e scrivere in questi Model-Specific Registers con indirizzo noto... Bel problema dunque, però sono credo che Cristal CPUID non utilizzi un driver per fare quelle operazioni..quindi magari c'è qualche exploit. ho trovato questo che è più o meno quello che devo fare io ma mi dà dei problemi in compilazione: http://www.computing.net/answers/pro...n9x/15126.html
__________________
Ryzen 1600 - RTX 3060- Msi X370 - corsair 600gs - 16GB Corsair 3200 - iiyama LCD ---- ho fatto affari su mercatino con wubby, kisser, Pether, Airbus77, mrmic, gup133, buster, Nikydbp, rcurle, molti altri di cui ho perso i dati + 100 feedback ebay 100% pos
|
|
|
|
|
|
#4 | ||
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
Quote:
![]() scrivere un VxD oggi é perfettamente inutile, semmai dovresti scrivere un driver WDM, ma prima indaga sulla questione dell'istruzione CPUID. |
||
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2001
Città: Torino
Messaggi: 712
|
Ho cercato info su questa istruzione CPUID, interessante però permette solo di leggere informazioni sulla cpu e non di scrivere su registri. invece cristal cpuid ha un modulo (provato e funzionante) che permette di inserire l'indirizzo del MSR e scriverci il valore che si vuole. ho trovato anche un altra applicazione open source che lo fà: performance inspector
http://perfinsp.sourceforge.net/ che ha un modulo che funziona su riga di comando..però anche lì si appoggia su varie dll è abbastanza complicato.. Comunque di sicuro usano qualche altra funzione...hai qualche indicazione da darmi su questi driver WDM? grazie!!
__________________
Ryzen 1600 - RTX 3060- Msi X370 - corsair 600gs - 16GB Corsair 3200 - iiyama LCD ---- ho fatto affari su mercatino con wubby, kisser, Pether, Airbus77, mrmic, gup133, buster, Nikydbp, rcurle, molti altri di cui ho perso i dati + 100 feedback ebay 100% pos
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
decisamente troppe. faccio un'altra proposta: se il registro che devi scrivere fa parte del contesto del thread corrente (cioé viene cambiato ad ogni thread switch) puoi usare questa API: http://msdn.microsoft.com/en-us/libr...32(VS.85).aspx
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2001
Città: Bastia Umbra (PG)
Messaggi: 6395
|
I model-specific registers (MSR) sono accessibili solo da kernel mode, ring0. Ma non è strettamente necessario utilizzare un driver per poter lavorarei in kernel mode.
Tuttavia stiamo parlando di tecniche molto avanzate, per cui l'utilizzo di un driver è fortemente consigliato. Sì, le istruzioni sono rdmsr e wrmsr per leggere e scrivere questo specifico registro
__________________
:: Il miglior argomento contro la democrazia è una conversazione di cinque minuti con l'elettore medio :: |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Nov 2001
Città: Bastia Umbra (PG)
Messaggi: 6395
|
Giusto per completezza, potresti utilizzare un'API non documentata.
ZwSystemDebugControl fa al caso tuo. Tecnicamente tra i comandi accettati di questa funzione ci sarebbero solo: SysDbgQueryModuleInformation=1, SysDbgQueryTraceInformation, SysDbgSetTracepoint, SysDbgSetSpecialCall, SysDbgClearSpecialCalls, SysDbgQuerySpecialCalls In realtà ce ne sono molti altri, tra cui anche DebugSysReadMsr e DebugSysWriteMsr. Per cui una chiamata da user mode a: ZwSystemDebugControl(DebugSysReadMsr,&msr,sizeof(msr),NULL,0,NULL) passandogli msr definito come MSR_STRUCT Codice:
typedef struct _MSR_STRUCT {
DWORD MsrNum;
DWORD NotUsed;
DWORD MsrLo;
DWORD MsrHi;
} MSR_STRUCT;
Occhio che questo "trucchetto", mentre funziona bene su Windows XP, potrebbe darti qualche noia su Windows Vista e Windows 7. Ah, ovviamente richiede diritti di amministratore (richiede il SeDebugPrivilege).
__________________
:: Il miglior argomento contro la democrazia è una conversazione di cinque minuti con l'elettore medio :: |
|
|
|
|
|
#9 | |||
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
Quote:
Quote:
|
|||
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Oct 2001
Città: Torino
Messaggi: 712
|
Ciao, ho provato il metodo SetThreadContext Function ma non va bene perchè non mi permette di vedere i resistri msr ma solo i vari general eax...perchè sono fuori dal contesto del tread.
Poi ho provato il ZwSystemDebugControl come consigliato da eraser, anche aiutandomi con questo esempio: http://archives.neohapsis.com/archiv...xploit_dbg.cpp il codice che ho prodotto è questo (gira con codeblock compilatore gcc, con VS08 mi dà un errore in runtime), però non mi restituisce i valori in MsrLo e MsrHi, ho sbagliato qualcosa? potete aiutarmi? grazie mille a tutti. Codice:
#include <stdlib.h>
#include <windows.h>
#include <iostream>
using namespace std;
typedef struct _MSR_STRUCT {
DWORD MsrNum;
DWORD NotUsed;
DWORD MsrLo;
DWORD MsrHi;
} MSR_STRUCT;
typedef enum _DEBUG_CONTROL_CODE {
DebugSysReadIoSpace = 14,
DebugSysWriteIoSpace = 15,
DebugSysReadMsr = 16,
DebugSysWriteMsr = 17,
DebugSysReadBusData = 18,
DebugSysWriteBusData = 19,
} DEBUG_CONTROL_CODE;
typedef int NTSTATUS;
#define NTAPI __stdcall
typedef
NTSTATUS
(NTAPI *PZwSystemDebugControl)(
DEBUG_CONTROL_CODE ControlCode,
PVOID InputBuffer,
ULONG InputBufferLength,
PVOID OutputBuffer,
ULONG OutputBufferLength,
PULONG ReturnLength
);
PZwSystemDebugControl ZwSystemDebugControl = NULL;
int main()
{
HMODULE hNtdll;
hNtdll = LoadLibrary("ntdll.dll");
ZwSystemDebugControl = (PZwSystemDebugControl)GetProcAddress(hNtdll, "ZwSystemDebugControl");
MSR_STRUCT msr;
msr.MsrNum=0x199;
msr.MsrHi=0;
msr.MsrLo=0;
ZwSystemDebugControl(DebugSysReadMsr,&msr,sizeof(msr),NULL,0,NULL);
cout<<msr.MsrLo;
cout<<msr.MsrHi;
system ("PAUSE");
return 0;
}
__________________
Ryzen 1600 - RTX 3060- Msi X370 - corsair 600gs - 16GB Corsair 3200 - iiyama LCD ---- ho fatto affari su mercatino con wubby, kisser, Pether, Airbus77, mrmic, gup133, buster, Nikydbp, rcurle, molti altri di cui ho perso i dati + 100 feedback ebay 100% pos
|
|
|
|
|
|
#11 | ||
|
Senior Member
Iscritto dal: Nov 2001
Città: Bastia Umbra (PG)
Messaggi: 6395
|
![]() Sì, Microsoft - come qualsiasi altra società - non dice tutto per ovvi motivi. Ciò non significa che non sia utilizzabile Quote:
Quote:
__________________
:: Il miglior argomento contro la democrazia è una conversazione di cinque minuti con l'elettore medio :: Ultima modifica di eraser : 14-06-2010 alle 01:33. |
||
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Nov 2001
Città: Bastia Umbra (PG)
Messaggi: 6395
|
Quote:
Puoi farlo attraverso l'API AdjustTokenPrivileges http://msdn.microsoft.com/en-us/libr...02(VS.85).aspx che è documentata. (Oppure molto più semplicemente tramite l'API non ufficialmente documentata RtlAdjustPrivilege, in maniera molto più rapida e semplice. Sempre che siano tutti d'accordo
__________________
:: Il miglior argomento contro la democrazia è una conversazione di cinque minuti con l'elettore medio :: |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Oct 2001
Città: Torino
Messaggi: 712
|
ok funziona! grazie mille per l'aiuto, posto il codice completo nel caso servisse a qualcun altro, ciao
Codice:
#include <stdlib.h>
#include <windows.h>
#include <iostream>
using namespace std;
typedef int NTSTATUS;
#define NTAPI __stdcall
typedef NTSTATUS (WINAPI *pFnRtlAdjustPrivilege)(
ULONG Privilege,
BOOLEAN Enable,
BOOLEAN CurrentThread,
PBOOLEAN Enabled
);
pFnRtlAdjustPrivilege RtlAdjustPrivilege;
typedef struct _MSR_STRUCT {
DWORD MsrNum;
DWORD NotUsed;
DWORD MsrLo;
DWORD MsrHi;
} MSR_STRUCT;
typedef enum _DEBUG_CONTROL_CODE {
DebugSysReadIoSpace = 14,
DebugSysWriteIoSpace = 15,
DebugSysReadMsr = 16,
DebugSysWriteMsr = 17,
DebugSysReadBusData = 18,
DebugSysWriteBusData = 19,
} DEBUG_CONTROL_CODE;
typedef
NTSTATUS
(NTAPI *PZwSystemDebugControl)(
DEBUG_CONTROL_CODE ControlCode,
PVOID InputBuffer,
ULONG InputBufferLength,
PVOID OutputBuffer,
ULONG OutputBufferLength,
PULONG ReturnLength
);
PZwSystemDebugControl ZwSystemDebugControl = NULL;
int main()
{
//setto i privilegi di debug
RtlAdjustPrivilege = (pFnRtlAdjustPrivilege)GetProcAddress(LoadLibrary("Ntdll.dll"), "RtlAdjustPrivilege");
BOOLEAN bEnabled = FALSE;
RtlAdjustPrivilege(20, 1, 0, &bEnabled);;
HMODULE hNtdll;
hNtdll = LoadLibrary("ntdll.dll");
ZwSystemDebugControl = (PZwSystemDebugControl)GetProcAddress(hNtdll, "ZwSystemDebugControl");
MSR_STRUCT msr;
//MSR_STRUCT msr_o;
msr.MsrNum=0x199;
msr.MsrHi=0;
msr.MsrLo=2599;
ZwSystemDebugControl(DebugSysReadMsr,&msr,sizeof(msr),NULL,0,NULL);
//ZwSystemDebugControl(DebugSysWriteMsr,&msr,sizeof(msr),NULL,0,NULL);
cout<<"alti "<<msr.MsrHi;
cout<<"bassi"<<msr.MsrLo;
system ("PAUSE");
return 0;
}
__________________
Ryzen 1600 - RTX 3060- Msi X370 - corsair 600gs - 16GB Corsair 3200 - iiyama LCD ---- ho fatto affari su mercatino con wubby, kisser, Pether, Airbus77, mrmic, gup133, buster, Nikydbp, rcurle, molti altri di cui ho perso i dati + 100 feedback ebay 100% pos
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Nov 2001
Città: Bastia Umbra (PG)
Messaggi: 6395
|
Quote:
Mi raccomando, non è un modo standard di funzionare e funziona senza problemi solo su Windows XP (su Windows Vista e Windows 7 ci sono alcuni problemi dovuti ad una configurazione interna leggermente differente). Per cui se devi fare qualcosa di affidabile e distribuirlo su larga scala io punterei più ad un driver che esegua le istruzioni privilegiate rdmsr e wrmsr. Se invece è solo per test o per qualcosa di interno, allora può andare Ciao!
__________________
:: Il miglior argomento contro la democrazia è una conversazione di cinque minuti con l'elettore medio :: |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:13.










Ryzen 1600 - RTX 3060- Msi X370 - corsair 600gs - 16GB Corsair 3200 - iiyama LCD ---- ho fatto affari su mercatino con wubby, kisser, Pether, Airbus77, mrmic, gup133, buster, Nikydbp, rcurle, molti altri di cui ho perso i dati + 100 feedback ebay 100% pos












