• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    進程退出前刪除自身EXE

    發布: 2007-7-14 21:11 | 作者: 佚名    | 來源: 網絡轉載     | 查看: 28次 | 進入軟件測試論壇討論

    領測軟件測試網 下面的代碼由Gary Nebbett寫就.Gary Nebbett乃是WINDOWS NT/2000 NATIVE API REFERENCE的作者.乃NT系統一等一的高手.下面就分析一些他的這段代碼.
    這段代碼在PROCESS沒有結束前就將啟動PROCESS的EXE文件刪除了.
    int main(int argc, char *argv[])
    {
       HMODULE module = GetModuleHandle(0);
       CHAR buf[MAX_PATH];
       GetModuleFileName(module, buf, sizeof buf);
       CloseHandle(HANDLE(4));
       __asm {
           lea     eax, buf
           push    0
           push    0
           push    eax
           push    ExitProcess
           push    module
           push    DeleteFile
           push    UnmapViewOfFile
           ret
       }
       return 0;
    }
    現在,我們先看一下堆棧中的東西

    偏移 內容
    24   0
    20   0
    16   offset buf
    12   address of ExitProcess
    8    module
    4    address of DeleteFile
    0    address of UnmapViewOfFile

    調用RET返回到了UnmapViewOfFile,也就是棧里的偏移0所指的地方.當進入UnmapViewOfFile的流程時,棧里見到的是返回地址DeleteFile和HMODUL module.也就是說調用完畢后返回到了DeleteFile的入口地址.當返回到DeleteFile時,看到了ExitProcess的地址,也就是返回地址.和參數EAX,而EAX則是buffer.buffer存的是EXE的文件名.由GetModuleFileName(module, buf, sizeof buf)返回得到.執行了DeleteFile后,就返回到了ExitProcess的函數入口.并且參數為0而返回地址也是0.0是個非法地址.如果返回到地址0則會出錯.而調用ExitProcess則應該不會返回.
    這段代碼的精妙之處在于:
    1.如果有文件的HANDLE打開,文件刪除就會失敗,所以,CloseHandle(HANDLE(4));是十分巧妙的一手.HANDLE4是OS的硬編碼,對應于EXE的IMAGE.在缺省情況下,OS假定沒有任何調用會關閉IMAGE SECTION的HANDLE,而現在,該HANDLE被關閉了.刪除文件就解除了文件對應的一個句柄.
    2.由于UnmapViewOfFile解除了另外一個對應IMAGE的HANDLE,而且解除了IMAGE在內存的映射.所以,后面的任何代碼都不可以引用IMAGE映射地址內的任何代碼.否則就OS會報錯.而現在的代碼在UnmapViewOfFile后則剛好沒有引用到任何IMAGE內的代碼.
    3.在ExitProcess之前,EXE文件就被刪除了.也就是說,進程尚在,而主線程所在的EXE文件已經沒了.(WINNT/9X都保護這些被映射到內存的WIN32 IMAGE不被刪除.)

    Gary Nebbett果然是WIN系列平臺的頂尖高手之一.能寫出如此代碼.獨辟蹊徑啊:) 

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>