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.
_______________________________________________________
;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