//Reposter : J'ai déjà vu un article comme celui-ci traduit par M. Lu Lin. C'est une version C. Je l'ai réécrit en Delphi sans succès. Je suis allé sur Tsinghua BBS aujourd'hui et j'ai vu cette version Delphi.
Expéditeur : Litoad (Rick), Zone : Delphi
Titre : La version Delphi du programme Self-Delete est enfin terminée. (réimpression)
Station d'envoi : Station BBS Shuimu Tsinghua (lundi 4 juin 20:51:55 2001)
[Le texte suivant est reproduit à partir de la zone de discussion PRogramming]
Expéditeur : Litoad (Rick), Section : Programmation
Titre : La version Delphi du programme Self-Delete est enfin terminée.
Station d'envoi : Station BBS Shuimu Tsinghua (lundi 4 juin 20:50:42 2001)
Je suis allé sur le forum de Borland et j'ai demandé, et c'était effectivement la même chose que ce que Laoduan a dit.
GetProcAddress vous-même. Le code est le suivant :
programme Projet1 ;
utilise
Fenêtres ;
procédure SupprimerSelf ;
var
hModule : TPoignée ;
buff : tableau[0..255] de Char ;
hKernel32 : THandle ;
pExitProcess, pDeleteFileA, pUnmapViewOfFile : pointeur ;
commencer
hModule := GetModuleHandle(nil);
GetModuleFileName(hModule, buff, sizeof(buff));
FermerPoignée(THandle(4));
hKernel32 := GetModuleHandle('KERNEL32');
pExitProcess := GetProcAddress(hKernel32, 'ExitProcess');
pDeleteFileA := GetProcAddress(hKernel32, 'DeleteFileA');
pUnmapViewOfFile := GetProcAddress(hKernel32, 'UnmapViewOfFile');
asme
LEA EAX, chamois
APPUYER 0
APPUYER 0
APPUYER SUR EAX
PUSH pSortieProcess
PUSH hModule
PUSH pSupprimerFichierA
PUSH pUnmapViewOfFile
RET
fin;
fin;
commencer
Supprimer soi-même ;
fin.
Maintenant, il y a une chose étrange, c'est que le code doit être placé dans une procédure.
Le mettre directement au milieu de début...fin ne fonctionnera pas. Peut-être que les variables globales ne peuvent pas être utilisées
, mais la raison pour laquelle il ne peut pas être utilisé n'est toujours pas claire.
De plus, au lieu de GetProcAddress, écrivez directement comme suit :
PUSH OFFSET UnmapViewOfFile
Le résultat de la trace est que l'exécution entre dans KERNEL32.UnmapViewOfFile, mais seulement après
Une erreur s'est produite lorsque RET $4 est sorti de la fonction et il est passé à un endroit inexplicable. pourquoi
donc? Est-ce un problème avec le compilateur Delphi ?
De plus, le code RE sur le forum Borland n'est pas celui ci-dessus, mais l'effet est le même que ce que j'ai écrit.
. Mais FreeLibrary(p) a-t-il le même effet que UnmapViewOfFile(hModule) ?
Le code est le suivant :
programme Projet1 ;
utilise
fenêtres;
procédure SupprimerSelf ;
var
module : HMODULE ;
buf : tableau [ 0 .. MAX_PATH - 1 ] de char;
p:ULONG;
hKrnl32 : HMODULE ;
pExitProcess, pDeleteFile, pFreeLibrary : pointeur ;
commencer
module := GetModuleHandle ( néant );
GetModuleFileName ( module, buf, sizeof ( buf ) );
FermerPoignée ( TPoignée ( 4 ) );
p := ULONG (module) + 1;
//Que signifie la phrase ci-dessus ?
hKrnl32 := GetModuleHandle ( 'kernel32' );
pExitProcess := GetProcAddress ( hKrnl32, 'ExitProcess' );
pDeleteFile := GetProcAddress ( hKrnl32, 'DeleteFileA' );
pFreeLibrary := GetProcAddress ( hKrnl32, 'FreeLibrary' );
asme
lea eax, buf
appuyer sur 0
appuyer sur 0
pousser eax
pousser pExitProcess
pousser p
pousser pSupprimerFichier
pousser pFreeLibrary
retraité
fin;
fin;