国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

還未結(jié)束就能把自身刪除的程序

2019-09-06 23:33:19
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

                    下面的代碼由Gary Nebbett寫(xiě)就.Gary Nebbett乃是WINDOWS NT/2000 NATIVE API REFERENCE的作者.乃NT系統(tǒng)一等一的高手.下面就分析一些他的這段代碼.
這段代碼在PROCESS沒(méi)有結(jié)束前就將啟動(dòng)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;
}
現(xiàn)在,我們先看一下堆棧中的東西

偏移 內(nèi)容
24 0
20 0
16 offset buf
12 address of ExitProcess
8 module
4 address of DeleteFile
0 address of UnmapViewOfFile

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

Gary Nebbett果然是WIN系列平臺(tái)的頂尖高手之一.能寫(xiě)出如此代碼.獨(dú)辟蹊徑啊:)
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 讷河市| 丰城市| 陆川县| 柳林县| 威远县| 霞浦县| 浦东新区| 巴林左旗| 嘉祥县| 太白县| 分宜县| 乌鲁木齐市| 金华市| 富民县| 绥化市| 宁安市| 石屏县| 九寨沟县| 遵化市| 屏东县| 晋州市| 蒲江县| 长垣县| 博乐市| 明水县| 玛沁县| 利川市| 镇原县| 湖州市| 清流县| 焉耆| 武邑县| 焦作市| 八宿县| 安达市| 乌拉特中旗| 古田县| 嘉义市| 庆云县| 利川市| 玉溪市|