用遠執行緒實現檔案自刪除

2021-09-05 18:11:23 字數 2166 閱讀 2466

實現檔案自刪除不是乙個特別新的話題了,不過貌似一直沒有特別完美的解決方式。從早先gary nebbett的堆疊溢位版本到後來的批處理、臨時檔案等方式,無不存在著各樣瑕疵:如堆疊溢位不支援xp,臨時檔案(批處理)不夠優雅等等。

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

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

言歸正傳。首先,我們假定這個執行緒函式是這樣的:

dword winapi delproc(lpvoid lpparam)

解釋一下,先用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  deletestruct, *pdeletestruct;

#pragma pack(pop)

最後的szfile域,就是用來放置檔名的。其餘的就不解釋了,因為下面就要填充它了。遠執行緒函式還是很模式化的**,改造自兩年前我的remoteloadlibrary:

bool remotedel(dword dwprocessid, lpcstr lpszfilename, dword dwtime)

// 修正近呼叫

pdel->dwsleep       -= (dword)lpbuf + offsetof(deletestruct, dwmov);

pdel->dwdeletefilea -= (dword)lpbuf + offsetof(deletestruct, byret);

dword dwwritten;

writeprocessmemory(hprocess, lpbuf, (lpvoid)pdel, dwsize, &dwwritten);

// 建立執行緒,遠端刪除!

dword dwid;

handle hthread = createremotethread(hprocess, null, 0,

(lpthread_start_routine)lpbuf,

(lpvoid)((dword)lpbuf + offsetof(deletestruct, szfile)), 0, &dwid);

globalfree((hglobal)pdel);

closehandle(hthread);

closehandle(hprocess);

return true;

}

至於為什麼最後不用virtualfreeex釋放資源,那是因為注入的遠端**在執行的時候目標exe就已經消失了,所以這裡的寄主程式肯定存在著記憶體洩露,真是造孽啊。

最後說三點。第一,remotedel是要挑選乙個寄主程式的,這個程式應該始終執行並存在於當前的系統中,我在示例中挑選的是explorer.exe;並且,開啟這個程序是需要除錯許可權的,提權的**也一併加入在示例**中,算是彌補了2023年的缺失。第二,為了方便定位,我修改了遠端**中的呼叫,也就是call ds:***(ff 15 ***)改為了call near ***(e8 ***)。第三,自己手寫機器碼的做法的確不如純彙編**重定位來的優雅,但是我認為這裡填充並定位sleep和deletefile的片斷也是純彙編的辦法無法比擬的。

遠端執行緒注入實現自刪除

核心函式 include include pragma comment lib,kernel32.lib pragma comment lib,user32.lib bool enabledebugpriv lpctstr szprivilege if lookupprivilegevalue nu...

遠執行緒刪除自身 來自SWAN

include include ifndef delete self swan define delete self swan typedef hinstance stdcall rfdeleteloadlibraryw lpctstr typedef farproc stdcall rfdelet...

用django的runserver實現遠端訪問

本來是想用apache來實現的,但按照教程配了一下,不知道卡在什麼地方了,沒有配成功,後來問了同學才知道原來runserver就支援遠端的,由於我們只是乙個展示,不涉及多大的併發量,所以乾脆就用django的runserver了。allowed hosts 127.0.0.1 localhost x...