程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 用遠線程實現文件自刪除

用遠線程實現文件自刪除

編輯:.NET實例教程

http://www.titilima.cn/readblog.PHP?id=138

點這裡下載示例代碼

實現文件自刪除不是一個特別新的話題了,不過貌似一直沒有特別完美的解決方式。從早先Gary Nebbett的堆棧溢出版本到後來的批處理、臨時文件等方式,無不存在著各樣瑕疵:如堆棧溢出不支持XP,臨時文件(批處理)不夠優雅等等。

當然,還有用驅動發IRP的方式,不過這只是一個自刪除,殺雞焉用牛刀?於是這個方案在我這兒亦不討論。

李馬討論的,只是一個2005年的老調重提:遠線程注入。2005年李馬提到的DLL遠程注入技術只是遠線程的最簡單應用,局限很多,能做的事情很少;下面的自刪除示例,則是如何讓遠線程能夠做更多的事,也可以說是一個補充材料,不必記入原創文檔了吧就。

言歸正傳。首先,我們假定這個線程函數是這樣的:

DWord WINAPI DelProc(LPVOID lpParam)
{
    Sleep(50);
    DeleteFileA((LPCSTR)lpParam);
    return 0;
}

解釋一下,先用Sleep等待要刪除的程序結束,之後調用DeleteFile刪除目標文件。

現在,你可以在VC的Project Settings->C/C++->Category: Listing Files->Listing file type中,設置輸出文件的類型為“Assembly, Machine Code, and Source”或“Assembly with Machine Code”,這樣就會在編譯完成後生成帶有匯編代碼和指令機器碼的附屬文件供你下一步對照。——當然,如果你極熟悉匯編,這一步可以跳過。

在查看附屬文件後,我們可以提取出對我們有用的匯編代碼:

push 50
call Sleep

mov  eax, [esp + 4]
push eax
call DeleteFileA
ret  4

之後,對照著對應的機器碼,構造下面的結構:

#pragma pack(push, 1)
typedef struct _tagDeleteStruct {
    BYTE  byPush;
    DWord dwTime;
    BYTE  wCall1;
    DWord dwSleep;
    DWord dwMov;
    BYTE  byPushEax;

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved