# Export Table - Kernel32.dll - GetProcessAddress #

cs_joanna Messages postés 3 Date d'inscription dimanche 11 mai 2003 Statut Membre Dernière intervention 11 mai 2003 - 11 mai 2003 à 12:58
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 - 11 mai 2003 à 18:29
Voici le code qui devrait récupérer l'adresse de la fonction "GetProcessAddress" connaissant l'ImageBase du module "kernel32.dll".

Malheureusement à la ligne ### le programme plante. Tout ce que je sais pour le moment c'est qu'une exception est levée parce que je tente de lire à une adresse non valide.

Ce code ayant été récupéré d'un tutorial d'un pro en asm et cracking, je ne vois pas ce qui cloche.

_______________________________________________________
;Mes variables :

;ModuleA=ImageBase du module kernel32.dll
;ExportTableA=Adresse absolue de la table des exportations
;AddFunc=Adresse absolue du tableau contenant les RVAs des fonctions
;AddName=Adresse absolue du tableau contenant les RVAs des noms des fonctions
;AddOdr=Adresse absolue du tableau contenant les numéros d'ordre des fonctions
;limit=nombre de fonctions exportées par le module
;Nindex=Adresse absolue dans le tableau contenant les RVAs des noms des fonctions

------------------------------------------------------------------
;on récupère les infos essentielles depuis la table des exportations

;export table
;esi=ModuleA
mov esi,[esi+78h]
add esi,ModuleA
mov edx,Offset ExportTableA
mov [edx],esi

add esi,10h

;nBase
lodsd
mov edx,Offset base
mov [edx],eax

;NumberOfNames
lodsd
lodsd
mov edx,Offset limit
mov [edx],eax

;AddressOfFonctions
lodsd
add eax,ModuleA
mov edx,Offset AddFunc
mov [edx],eax

;AddressOfNames
lodsd
add eax,ModuleA
mov edx,Offset AddName
mov [edx],eax

;AddressOfNameOrdinals
lodsd
add eax,ModuleA
mov edx,Offset AddOrd
mov [edx],eax


--------------------------------------------------------------
;First_Api db 'GetProcAddress',0

Search_Apis:

mov esi,AddName
mov edx,offset Nindex
mov [edx],esi

mov edi,[esi]
add edi,ModuleA
mov ecx,0
mov ebx,offset First_Api



Try_Again:
mov esi,ebx


Match_Byte:
cmpsb
jne Next_One
cmp byte ptr [edi],0
je Got_It
jmp Match_Byte


Next_One:
inc ecx
cmp ecx,limit
je Fin

mov edx,offset Nindex
add dword ptr [edx],4

mov esi,Nindex
mov edi,[esi]
add edi,ModuleA
jmp Try_Again

--------------------------------------------------------------
;La fonction "GetProcAddress" est bien exportée par le module

Got_It:
shl ecx,1
mov esi,AddOrd
add esi,ecx
xor eax,eax

mov ax,word ptr [esi] #### ici ça plante ####

shl eax,2
mov esi,AddFunc
add esi,eax
mov edi,[esi]
add edi,ModuleA


mov edx,offset First_Api_A
mov [edx],edi

1 réponse

CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
11 mai 2003 à 18:29
Effectivement le segment DS n'a pas accès cet espace mémoire car c'est de la mémoire de niveau DPL 0 or le champs RPL dans DS pour une application est de 3 tu n'a donc pas les droits d'accès. Il faut que tu alloues un segment qui a un DPL de 3 mais là je ne sais pas comment faire sous Windows. Pour moi c'est impossible car sinon ce serait facile de détruire de noyau de Windows (par un virus par exemple).

Core Breaker :)
0
Rejoignez-nous