1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
FUNCTION References (librairie, target : string): cardinal; stdcall;
var SDT, Buffer, BI_Target, Resultat, BI_Librairie : cardinal;
P_SDT : ^dword absolute SDT;
P_Buffer : ^dword absolute Buffer;
P_BI_Target : ^dword absolute BI_Target;
begin
// resultat := 1er NtQuery "a vide", la taille du buffer nécessaire
NtQuerySystemInformation(SystemModuleInfo, nil, 0, @Resultat);
// On arrondit cette "taille" a la page supérieure
Resultat := (resultat + $1000) and (not masque);
P_Buffer := VirtualAlloc(nil, resultat, MEM_COMMIT, PAGE_READWRITE);
NtQuerySystemInformation(SystemModuleInfo, P_Buffer, Resultat, @Resultat);
// Le 1er module est toujours NtOSKrnl.exe
// + $0C : passe le compteur de Modules + les 2 dword réservés
// Récupère l'Adresse-Base du 1er module - NtOSKrnl.exe
Buffer := Buffer + $0C;
BV_Librairie := P_Buffer^; * <----- 1ere Référence
// Récupère la taille du 1er module - NtOSKrnl.exe
// Buffer := Buffer + $04;
// Size_NtOSKrnl := P_Buffer^;
VirtualFree(P_Buffer, 0, MEM_RELEASE); * si ok, retour <> 0
BI_Librairie := LoadLibrary(PChar(librairie));
P_BI_Target := GetProcAddress (BI_Librairie, PChar(target));
FreeLibrary(BI_Librairie);
if BI_Target = 0 then
begin
res:= 1 ; Error(888);
end;
// P_BI_Target et BI_Target sont "absolute"
result := (BI_Target - BI_Librairie) + BV_Librairie;
// result = Base Vraie Target <----- 2eme Référence
end; |
Partager