// Reposter: He visto un artículo como este traducido por el Sr. Lu Lin antes. Lo reescribí en Delphi sin éxito. Fui a Tsinghua BBS hoy y vi esta versión de Delphi.
Remitente: Litoad (Rick), Área: Delfos
Título: La versión Delphi del programa Self-Delete finalmente está lista. (reimpresión)
Estación emisora: Estación BBS Shuimu Tsinghua (lunes 4 de junio a las 20:51:55 de 2001)
[El siguiente texto es una reproducción del área de discusión sobre programación]
Remitente: Litoad (Rick), Sección: Programación
Título: La versión Delphi del programa Self-Delete finalmente está lista.
Estación emisora: Estación BBS Shuimu Tsinghua (lunes 4 de junio a las 20:50:42 de 2001)
Fui al foro de Borland y pregunté, y de hecho era lo mismo que dijo Laoduan.
GetProcDirección usted mismo. El código es el siguiente:
programa Proyecto1;
usos
ventanas;
procedimiento EliminarSelf;
var
hMódulo: THandle;
buff: matriz[0..255] de Char;
hKernel32: THandle;
pExitProcess, pDeleteFileA, pUnmapViewOfFile: puntero;
comenzar
hModule := GetModuleHandle(nulo);
GetModuleFileName(hModule, buff, sizeof(buff));
CloseHandle(THandle(4));
hKernel32 := GetModuleHandle('KERNEL32');
pExitProcess := GetProcAddress(hKernel32, 'ExitProcess');
pDeleteFileA := GetProcAddress(hKernel32, 'DeleteFileA');
pUnmapViewOfFile := GetProcAddress(hKernel32, 'UnmapViewOfFile');
ENSAMBLE
LEA EAX, pulir
EMPUJAR 0
EMPUJAR 0
EMPUJE EAX
PUSH pSalirProceso
PUSH hMódulo
PUSH pDeleteFileA
PUSH pUnmapViewOfFile
RETIRADO
fin;
fin;
comenzar
Eliminar yo;
fin.
Ahora hay una cosa rara, es decir, el código debe colocarse en un Procedimiento.
Ponerlo directamente en el medio del inicio...final no funcionará. Quizás no se puedan utilizar variables globales
, pero aún no está claro por qué no se puede utilizar.
Además, en lugar de GetProcAddress, escriba directamente lo siguiente:
EMPUJAR DESPLAZAMIENTO DesasignarViewOfFile
El resultado del seguimiento es que la ejecución ingresa a KERNEL32.UnmapViewOfFile, pero solo después
Se produjo un error cuando RET $4 salió de la función y saltó a un lugar inexplicable. por qué
¿entonces? ¿Es un problema con el compilador de Delphi?
Además, el código RE en el foro de Borland no es el anterior, pero el efecto es el mismo que escribí.
. ¿Pero FreeLibrary(p) tiene el mismo efecto que UnmapViewOfFile(hModule)?
El código es el siguiente:
programa Proyecto1;
usos
ventanas;
procedimiento EliminarSelf;
var
módulo: HMODULO;
buf: matriz [0 .. MAX_PATH - 1] de char;
p:ULONGO;
hKrnl32: HMÓDULO;
pExitProcess, pDeleteFile, pFreeLibrary: puntero;
comenzar
módulo: = GetModuleHandle (nulo);
GetModuleFileName (módulo, buf, tamaño de (buf));
CloseHandle ( THandle ( 4 ) );
p := ULONG (módulo) + 1;
//¿Qué significa la frase anterior?
hKrnl32: = GetModuleHandle ('kernel32');
pExitProcess:= GetProcAddress (hKrnl32, 'ExitProcess');
pDeleteFile: = GetProcAddress (hKrnl32, 'DeleteFileA');
pFreeLibrary := GetProcAddress ( hKrnl32, 'FreeLibrary' );
ENSAMBLE
lea eax, buf
empujar 0
empujar 0
empujar eax
empujar pExitProcess
empujar p
empujar pDeleteFile
empujar pFreeLibrary
retirado
fin;
fin;