//Reposter: Ich habe einen solchen Artikel schon einmal gesehen, der von Herrn Lu Lin übersetzt wurde. Ich habe ihn heute erfolglos bei Tsinghua BBS gepostet.
Absender: Litoad (Rick), Gebiet: Delphi
Titel: Die Delphi-Version des Self-Delete-Programms ist endlich fertig. (Abdruck)
Sendestation: BBS Shuimu Tsinghua Station (Mo, 4. Juni 20:51:55 2001)
[Der folgende Text stammt aus dem Diskussionsbereich „Programmierung“]
Absender: Litoad (Rick), Abschnitt: Programmierung
Titel: Die Delphi-Version des Self-Delete-Programms ist endlich fertig.
Sendestation: BBS Shuimu Tsinghua Station (Mo, 4. Juni 20:50:42 2001)
Ich bin in Borlands Forum gegangen und habe nachgefragt, und es war tatsächlich das Gleiche, was Laoduan gesagt hat.
GetProcAdressieren Sie sich selbst. Der Code lautet wie folgt:
Programm Projekt1;
verwendet
Windows;
Prozedur DeleteSelf;
var
hModule: THandle;
Buff: Array[0..255] of Char;
hKernel32: THandle;
pExitProcess, pDeleteFileA, pUnmapViewOfFile: Zeiger;
beginnen
hModule := GetModuleHandle(nil);
GetModuleFileName(hModule, buff, sizeof(buff));
CloseHandle(THandle(4));
hKernel32 := GetModuleHandle('KERNEL32');
pExitProcess := GetProcAddress(hKernel32, 'ExitProcess');
pDeleteFileA := GetProcAddress(hKernel32, 'DeleteFileA');
pUnmapViewOfFile := GetProcAddress(hKernel32, 'UnmapViewOfFile');
asm
LEA EAX, Buff
DRÜCKEN 0
DRÜCKEN 0
DRÜCKEN SIE EAX
PUSH pExitProcess
PUSH hModule
PUSH pDeleteFileA
PUSH pUnmapViewOfFile
RET
Ende;
Ende;
beginnen
Selbst löschen;
Ende.
Nun gibt es eine seltsame Sache: Der Code muss in einer Prozedur platziert werden.
Es wird nicht funktionieren, es direkt in die Mitte von begin...end zu setzen. Möglicherweise können globale Variablen nicht verwendet werden
, aber warum es nicht verwendet werden kann, ist noch unklar.
Schreiben Sie außerdem anstelle von GetProcAddress direkt wie folgt:
PUSH OFFSET UnmapViewOfFile
Das Ergebnis der Ablaufverfolgung ist, dass die Ausführung in KERNEL32.UnmapViewOfFile eintritt, jedoch erst danach
Als RET $4 die Funktion verließ, ist ein Fehler aufgetreten, der an eine unerklärliche Stelle gesprungen ist. Warum
Also? Liegt es am Delphi-Compiler?
Darüber hinaus ist der RE-Code im Borland-Forum nicht der oben genannte, aber der Effekt ist der gleiche wie der, den ich geschrieben habe.
. Aber hat FreeLibrary(p) den gleichen Effekt wie UnmapViewOfFile(hModule)?
Der Code lautet wie folgt:
Programm Projekt1;
verwendet
Fenster;
Prozedur DeleteSelf;
var
Modul: HMODULE;
buf: Array [ 0 .. MAX_PATH - 1 ] of char;
p:ULONG;
hKrnl32: HMODULE;
pExitProcess, pDeleteFile, pFreeLibrary: Zeiger;
beginnen
module := GetModuleHandle ( nil );
GetModuleFileName ( module, buf, sizeof ( buf ) );
CloseHandle ( THandle ( 4 ) );
p := ULONG (Modul) + 1;
//Was bedeutet der obige Satz?
hKrnl32 := GetModuleHandle ( 'kernel32' );
pExitProcess := GetProcAddress ( hKrnl32, 'ExitProcess' );
pDeleteFile := GetProcAddress ( hKrnl32, 'DeleteFileA' );
pFreeLibrary := GetProcAddress ( hKrnl32, 'FreeLibrary' );
asm
lea eax, buf
0 drücken
0 drücken
eax drücken
pExitProcess drücken
p drücken
pDeleteFile drücken
pFreeLibrary drücken
im Ruhestand
Ende;
Ende;