[EXTERN ExitProcess] [EXTERN FreeLibrary] [EXTERN GetProcAddress] [EXTERN LoadLibraryA] [EXTERN MessageBoxA] [IMPORT ExitProcess kernel32.dll] [IMPORT FreeLibrary kernel32.dll] [IMPORT GetProcAddress kernel32.dll] [IMPORT LoadLibraryA kernel32.dll] [IMPORT MessageBoxA user32.dll] [SEGMENT CODE USE32 CLASS=CODE] ..start ; ========================== ; ========================== ; Charge la dll push dword DllName call [LoadLibraryA] ; Si EAX == 0, le chargement a echoue cmp eax, 0 je LoadLibraryFailed ; ========================== ; Le probleme vient de la mov hDll, dword eax ; =============================================================================================== ; =============================================================================================== ; Recupere l'adresse de la fonction TestFun grace a GetProcAdress push dword FuncName push dword hDll call [GetProcAddress] ; L'adresse de la fonction se trouve dans eax. Si eax == 0, la fonction a echouee cmp eax, 0 je GetProcAddressFailed ; =============================================================================================== ; Appel la fonction ( pas de call [eax] sinon sa plante ;-) ) call eax ; ======================================================================================================================== ; ======================================================================================================================== ; Liberation de la DLL en memoire grace a FreeLibrary ; Comme le handle a deja ete sauvegarde sur la pile, on a plus qu'a appelle FreeLibrary qui se chargera de tout ; (la pile etant redevenu a son etat d'origine apres l'appel a GetProcAddress) call [FreeLibrary] cmp eax, 0 je FreeLibFailed ; ======================================================================================================================== ; ==================== ; ==================== ; Fin du programme push dword 0 call [ExitProcess] ; ==================== ; En cas d'echec de LoadLbraryA, on affiche un message d'erreur et on quitte le programme LoadLibraryFailed: push dword 0 push dword MsgTitle push dword MsgFailedText push dword 0 call [MessageBoxA] push dword 0 call [ExitProcess] ; En cas d'echec de GetProcAddress, on affiche un message d'erreur et on quitte le programme GetProcAddressFailed: push dword 0 push dword MsgTitle2 push dword MsgFailedText push dword 0 call [MessageBoxA] push dword 0 call [ExitProcess] ; En cas d'echec de FreeLibrary, on affiche un message d'erreur et on quitte le programme FreeLibFailed: push dword 0 push dword MsgTitle3 push dword MsgFailedText push dword 0 call [MessageBoxA] push dword 0 call [ExitProcess] [SEGMENT DATA USE32 CLASS=DATA] DllName db "PE.dll", 0 FuncName db "TestFunc", 0 MsgTitle db "LoadLibraryA", 0 MsgTitle2 db "GetProcAdress", 0 MsgTitle3 db "FreeLibrary", 0 MsgFailedText db "Chargement échoué", 0 MsgSuccessText db "Chargement effectué", 0 [SEGMENT BSS US32 CLASS=BSS] hDll: resd 1