URing.DLL v1.00 - Dynamic Link Library contenant les principales procédures utilisées pour passer en Ring0, Hooker des interruptions, poser des BreakPoints et convertir des nombres.
Ring0
Ring0Ret
HookInt
PageAllocate
PageFree
MovIntSys
SetBPM
SetBPX
DWord2Str
Str2DWord
La procédure Ring0 passe le programme en Ring0 en modifiant les registres CS et SS (CS:030h SS:028h) et redonne la main au programme à l'adresse passée en paramètre.
Ring0(
DWORD Addresse
);
Paramètre
Addresse
Addresse de retour de la procédure. La modification des registres se faisant à l'aide de l'ExceptionHandler, les premières instructions se trouvant en CS:Addresse devront donc restaurer le SEH ( MACRO RemoveSEH )
Remarques
Pour repasser en Ring3, il suffit d'appeler la PROC Ring0Ret avec comme paramètre l'addresse de retour.
Example
RemoveSEH MACRO
pop fs:[0]
add esp,4h
ENDM
...
invoke RingZero2, offset Ring0ProcRing0Proc:
RemoveSEH
...
invoke Ring0Ret, offset EndRing0ProcEndRing0Proc:
...
La fonction HookInt hook une interruption en modifiant l'IDT (Interrupt Descriptor Table).
DWORD HookInt(
DWORD IntNum,
DWORD IntProc
);
Paramètres
IntNum
Numéro de l'interruption à hooker.
IntProc
Adresse de la procédure exécutée lors de l'appel à l'interruption hookée.
Valeur de retour
Renvois dans EAX l'adresse original de la procédure de l'interruption.
DWORD PageAllocate(
);
Valeur de retour
Renvois dans EAX l'adresse de la page allouée.
Remarque
Cette procédure doit absolument s'exécuter en Ring0.
La procédure PageFree libère une page allouée en zone système.
PageFree(
DWORD pPage
);
Paramètre
pPage
Adresse de la page ( allouée précédemment par PageAllocate ) à libérer.
Remarque
Cette procédure doit absolument s'exécuter en Ring0.
MovIntSys(
DWORD StartAddr,
DWORD EndAddr,
DWORD pPage
);
Paramètres
StartAddr
Adresse pointant vers le début des procédures d'interruption.
EndAddr
Adresse pointant vers la fin des procédure d'int.
pPage
Adresse en zone système où transférer le code des procédure d'int.
Remarque
Cette procédure peut être utilisée pour transférer le bloc située entre l'adresse StartAddr et EndAddr en pPage.
SetBPM(
DWORD DrNumber,
DWORD Address,
DWORD BpmType
);
Paramètres
DrNumber
Spécifie le numéro du DebugRegister ( 0=Dr0, 1=Dr1, 2=Dr2 ou 3=Dr3 ) à utiliser pour poser le BPM.
Address
Address du BPM
BpmType
Type de BreakPoint on Memory
00000000 ( BreakPoint on Memory Execution ), il y aura donc un Break si l'instruction située en CS:Address est exécutée.
00000001 ( BreakPoint on Memory Write Access ), Break lors d'un accès en écriture à l'adresse CS:Address.
00000003 ( BreakPoint on Memory Read/Write Access ), Break lors d'un accès mémoire en CS:Address.
Remarque
Cette procédure doit être exécutée en Ring3 !
DWORD SetBPX(
DWORD ProcessID,
DWORD Address
);
Paramètres
ProcessID
Spécifie l'ID du Process où poser le BPX.
Address
Adresse où poser le BPX.
Valeur de retour
Renvoit dans AL ( EAX = 000000xx ) la valeur de l'octet original du process concerné à l'adresse CS:Address.
Remarque
Cette procédure doit être exécutée en Ring3 !
DWord2Str(
DWORD Num,
DWORD Buff
);
Paramètres
Num
DWord à convertir.
Buff
Adresse du buffer recevant la chaine ASCII.
DWORD Str2DWord(
DWORD Buff
);
Paramètre
Buff
Adresse du buffer contenant la chaine à convertir.
Valeur de retour
Renvoit dans EAX la correspondance hexa de la chaine ASCII.
Remarque
La Chaine ASCII doit être composée de 8 charactère. Par exemple, '004' donnera une erreur, pour corriger, il faudrait mettre '00000004' !
Ring0Ret(
DWORD Addresse
);
Paramètre
Addresse
Addresse de retour de la procédure.