//Reposter: Já vi um artigo como este traduzido pelo Sr. Lu Lin antes. É uma versão C. Reescrevi-o em Delphi sem sucesso. Fui ao Tsinghua BBS hoje e vi esta versão em Delphi.
Remetente: Litoad (Rick), Área: Delphi
Título: A versão Delphi do programa Self-Delete está finalmente concluída. (reimprimir)
Estação de envio: Estação BBS Shuimu Tsinghua (segunda-feira, 4 de junho, 20:51:55 2001)
[O texto a seguir foi reproduzido da área de discussão sobre programação]
Remetente: Litoad (Rick), Seção: Programação
Título: A versão Delphi do programa Self-Delete está finalmente concluída.
Estação de envio: Estação BBS Shuimu Tsinghua (segunda-feira, 4 de junho 20:50:42 2001)
Fui ao fórum da Borland e perguntei, e é realmente o mesmo que laoduan disse.
ObtenhaProcAddress você mesmo. O código é o seguinte:
programa Projeto1;
usa
Windows;
procedimento DeleteSelf;
var
hMódulo: THandle;
buff: array[0..255] de Char;
hKernel32: THandle;
pExitProcess, pDeleteFileA, pUnmapViewOfFile: Ponteiro;
começar
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, lustre
PRESSIONE 0
PRESSIONE 0
PRESSIONE EAX
PUSH pExitProcess
Módulo PUSH h
PUSH pDeleteFileA
PUSH pUnmapViewOfFile
RET
fim;
fim;
começar
ExcluirSelf;
fim.
Agora tem uma coisa estranha, ou seja, o código deve ser colocado em uma Procedure.
Colocá-lo diretamente no meio do início...fim não funcionará. Talvez variáveis globais não possam ser usadas
, mas por que não pode ser usado ainda não está claro.
Além disso, em vez de GetProcAddress, escreva diretamente da seguinte forma:
PUSH OFFSET UnmapViewOfFile
O resultado do rastreamento é que a execução entra em KERNEL32.UnmapViewOfFile, mas somente após
Ocorreu um erro quando RET $4 saiu da função e saltou para um lugar inexplicável. por que
então? É um problema com o compilador do Delphi?
Além disso, o código RE no fórum da Borland não é o acima, mas o efeito é o mesmo que escrevi.
. Mas FreeLibrary(p) tem o mesmo efeito que UnmapViewOfFile(hModule)?
O código é o seguinte:
programa Projeto1;
usa
Windows;
procedimento DeleteSelf;
var
módulo: HMÓDULO;
buf: array [0.. MAX_PATH - 1] de char;
p:ULONG;
hKrnl32: HMÓDULO;
pExitProcess, pDeleteFile, pFreeLibrary: ponteiro;
começar
módulo: = GetModuleHandle (nil);
GetModuleFileName (módulo, buf, sizeof (buf));
CloseHandle(THandle(4));
p := ULONG (módulo) + 1;
//O que significa a frase acima?
hKrnl32 := GetModuleHandle( 'kernel32' );
pExitProcess := GetProcAddress ( hKrnl32, 'ExitProcess' );
pDeleteFile := GetProcAddress ( hKrnl32, 'DeleteFileA' );
pFreeLibrary := GetProcAddress ( hKrnl32, 'FreeLibrary' );
asm
lea eax, buf
pressione 0
pressione 0
empurrar eax
empurrar pExitProcess
empurre p
empurrar pDeleteFile
empurrar pFreeLibrary
ret
fim;
fim;