//再投稿者: 以前、Lu Lin 氏が翻訳したこのような記事を見たことがあります。C バージョンですが、うまくいきませんでした。今日清華 BBS に行ったので、ここに投稿しました。
送信者: リトード (リック)、エリア: デルフィ
タイトル: Delphi バージョンの自己削除プログラムがついに完成しました。 (再版)
送信局: BBS 水木清華局 (2001 年 6 月 4 日月曜日 20:51:55)
[以下のテキストはプログラミング ディスカッション エリアからの転載です]
送信者: Litoad (Rick)、セクション: プログラミング
タイトル: Delphi バージョンの自己削除プログラムがついに完成しました。
送信局: BBS 水木清華局 (2001 年 6 月 4 日月曜日 20:50:42)
私は Borland のフォーラムに行って尋ねましたが、確かに laoduan が言ったことと同じです。
ProcAddress を自分で取得します。コードは次のとおりです。
プログラムプロジェクト1;
用途
ウィンドウズ。
プロシージャ DeleteSelf;
変数
hModule: THandle;
buff: Char の array[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');
アズム
LEA EAX、バフ
プッシュ0
プッシュ0
プッシュEAX
PUSH p終了プロセス
PUSH hモジュール
PUSH pDeleteFileA
PUSH pUnmapViewOfFile
RET
終わり;
終わり;
始める
自分自身を削除します。
終わり。
ここで、奇妙な点が 1 つあります。それは、コードをプロシージャ内に配置する必要があるということです。
begin...end の途中に直接置くと機能しません。グローバル変数が使えないのかもしれない
が、なぜ使えないのかはまだ不明です。
また、GetProcAddress の代わりに、次のように直接記述します。
PUSH OFFSET UnmapViewOfFile
トレースの結果は、実行が KERNEL32.UnmapViewOfFile に入った後であるということです。
RET $4 が関数から出てきたところでエラーが発生し、意味不明なところに飛んでしまいました。なぜ
それで? Delphiのコンパイラに問題があるのでしょうか?
なお、Borland フォーラムにある RE コードは上記ではありませんが、効果は私が書いたものと同じです。
。しかし、FreeLibrary(p) には UnmapViewOfFile(hModule) と同じ効果がありますか?
コードは次のとおりです。
プログラムプロジェクト1;
用途
窓。
プロシージャ DeleteSelf;
変数
モジュール: HMODULE;
buf : char の配列 [ 0 .. MAX_PATH - 1 ];
p:ULONG;
hKrnl32: Hモジュール;
pExitProcess、pDeleteFile、pFreeLibrary : ポインタ;
始める
モジュール := GetModuleHandle ( nil );
GetModuleFileName ( module, buf, sizeof ( buf ) );
CloseHandle ( THandle (4) );
p := ULONG (モジュール) + 1;
//上の文はどういう意味ですか?
hKrnl32 := GetModuleHandle ( 'kernel32' );
pExitProcess := GetProcAddress ( hKrnl32, 'ExitProcess' );
pDeleteFile := GetProcAddress ( hKrnl32, 'DeleteFileA' );
pFreeLibrary := GetProcAddress ( hKrnl32, 'FreeLibrary' );
アズム
リー・イーアックス、バフ
0を押してください
0を押してください
押します
pExitProcess をプッシュ
pを押してください
pDeleteFile をプッシュする
pFreeLibraryをプッシュ
レット
終わり;
終わり;