//Reposter: 예전에 Lu Lin 씨가 번역한 기사를 본 적이 있습니다. C 버전인데, 성공하지 못해서 오늘 Tsinghua BBS에 가서 이 Delphi 버전을 보았습니다.
보낸 사람: Litoad(Rick), 지역: Delphi
제목: 델파이 버전의 자체 삭제 프로그램이 드디어 완성되었습니다. (재판)
송신역: BBS 슈이무 칭화역(2001년 6월 4일 월요일 20:51:55)
[다음 텍스트는 프로그래밍 토론 영역에서 재현되었습니다.]
보낸 사람: Litoad(Rick), 섹션: 프로그래밍
제목: 델파이 버전의 자체 삭제 프로그램이 드디어 완성되었습니다.
송신역: BBS 슈이무 칭화역(2001년 6월 4일 월요일 20:50:42)
볼랜드 포럼에 가서 물어보니 실제로 라오두안님이 말씀하신 것과 똑같습니다.
GetProcAddress를 직접 입력하세요. 코드는 다음과 같습니다:
프로그램 프로젝트1;
용도
윈도우;
프로시저 DeleteSelf;
var
h모듈: THandle;
buff: Char 배열[0..255];
hKernel32: THandle;
pExitProcess, pDeleteFileA, pUnmapViewOfFile: 포인터;
시작하다
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, 버프
푸시 0
푸시 0
푸시 EAX
푸시 pExit프로세스
푸시 h모듈
pDeleteFileA 푸시
pUnmapViewOfFile 푸시
RET
끝;
끝;
시작하다
자기 삭제;
끝.
이제 한 가지 이상한 점이 있습니다. 즉, 코드를 프로시저에 배치해야 한다는 것입니다.
시작...끝 중간에 직접 넣으면 작동하지 않습니다. 전역 변수를 사용할 수 없을 수도 있습니다.
, 그러나 왜 사용할 수 없는지는 아직 명확하지 않습니다.
또한 GetProcAddress 대신 다음과 같이 직접 작성합니다.
푸시 오프셋 UnmapViewOfFile
추적 결과는 실행이 KERNEL32.UnmapViewOfFile로 들어가지만 그 이후에만 가능하다는 것입니다.
RET $4 함수가 나왔을 때 에러가 발생하여 설명할 수 없는 곳으로 점프하였습니다. 왜
그래서? 델파이 컴파일러에 문제가 있나요?
게다가 볼랜드 포럼에 올라온 RE 코드는 위와는 다르지만 제가 쓴 것과 효과는 같습니다.
. 그러나 FreeLibrary(p)는 UnmapViewOfFile(hModule)과 동일한 효과를 가집니까?
코드는 다음과 같습니다:
프로그램 프로젝트1;
용도
창문;
프로시저 DeleteSelf;
var
모듈: HMODULE;
buf : char의 배열 [0 .. MAX_PATH - 1];
p:울롱;
hKrnl32: HMODULE;
pExitProcess, pDeleteFile, pFreeLibrary : 포인터;
시작하다
module := GetModuleHandle ( nil );
GetModuleFileName( 모듈, buf, sizeof( buf ) );
CloseHandle( THandle( 4 ) );
p := ULONG(모듈) + 1;
//위 문장은 무슨 뜻인가요?
hKrnl32 := GetModuleHandle( 'kernel32' );
pExitProcess := GetProcAddress ( hKrnl32, 'ExitProcess' );
pDeleteFile := GetProcAddress ( hKrnl32, 'DeleteFileA' );
pFreeLibrary := GetProcAddress ( hKrnl32, 'FreeLibrary' );
asm
lea eax, 버프
0을 누르세요
0을 누르세요
푸시 eax
pExitProcess 푸시
p를 밀어
pDelete파일 푸시
pFreeLibrary 푸시
리트
끝;
끝;