2017-10-18 25 views
1

J'ai pris un exemple de code qui crée une DLL simple à partir du répertoire d'exemples FASM et je l'ajuste à mes besoins. Cependant, quand je fais quelques changements (innocent de mon POV), le fichier binaire généré est corrompu - l'exécution d'un exe qui utilise cette bibliothèque produit le code d'erreur 0xC000007B, soit INVALID_IMAGE_FORMAT.Obtenir une image invalide lors de l'ajustement du code DLL exemple

code DLL:

; DLL creation example 

format PE GUI 4.0 DLL 
entry DllEntryPoint 

include 'win32a.inc' 

section '.text' code readable executable 

proc DllEntryPoint hinstDLL,fdwReason,lpvReserved 
     mov  eax,TRUE 
     ret 
endp 

proc ShowErrorMessage hWnd,dwError 
    local lpBuffer:DWORD 
     lea  eax,[lpBuffer] 
     invoke FormatMessage,FORMAT_MESSAGE_ALLOCATE_BUFFER+FORMAT_MESSAGE_FROM_SYSTEM,0,[dwError],LANG_NEUTRAL,eax,0,0 
     invoke MessageBox,[hWnd],[lpBuffer],NULL,MB_ICONERROR+MB_OK 
     ret 
endp 

proc ShowLastError hWnd 
     ret 
endp 

section '.idata' import data readable writeable 

    library kernel,'KERNEL32.DLL',\ 
      user,'USER32.DLL' 

    import kernel,\ 
     GetLastError,'GetLastError',\ 
     SetLastError,'SetLastError',\ 
     FormatMessage,'FormatMessageA',\ 
     LocalFree,'LocalFree' 

    import user,\ 
     MessageBox,'MessageBoxA' 

section '.edata' export data readable 

    export 'DLL.DLL',ShowErrorMessage,'ShowErrorMessage',ShowLastError,'ShowLastError' 

section '.reloc' fixups data readable discardable 

Code Executable:

format PE GUI 4.0 
entry start 

include 'win32a.inc' 

section '.text' code readable executable 

    start: 
jmp ShowLastError 

section '.idata' import data readable writeable 

    library mydll,'DLL.DLL' 

    import mydll,\ 
     ShowLastError,'ShowLastError' 

Quand je change, par exemple,

export 'DLL.DLL',ShowErrorMessage,'ShowErrorMessage',ShowLastError,'ShowLastError' 
ligne

à

export 'DLL.DLL',ShowLastError,'ShowLastError' 

le code se brise. La même chose se passe si je change ShowErrorMessage corps juste ret.

Je suis complètement confus par cela. Est-ce un bug FASM, ou je fais quelque chose de mal?

+1

Ce code ne traite pas du tout de la convention d'appel (en particulier 'stdcall', qui nécessite' DllEntryPoint'). Et il n'est pas sûr de 'JMP' dans une fonction DLL (' ShowLastError'), vous devez le 'INVOKE' à la place, comme les autres fonctions DLL importées que vous utilisez ('FormatMessage' et' MessageBox'). Et surtout parce que 'ShowLastError' prend un paramètre d'entrée que vous ne lui passez pas –

+0

@RemyLebeau la DLL n'est même pas chargée, donc c'est orthogonal à mon problème. – arrowd

+1

il est toujours utile de réparer. En tout cas, le coupable habituel pour 'INVALID_IMAGE_FORMAT' est un processus 32 bits chargeant une DLL 64 bits ou vice versa. est-ce le cas ici? –

Répondre

1

Je n'ai pas pu trouver d'explication pour cela, mais au moins j'ai trouvé une solution de contournement. Modification de la ligne suivante

section '.reloc' fixups data readable discardable 

à seulement

data fixups 
end data 

de résout le problème.