精妙程式碼 (轉)
下面的程式碼由Gary Nebbett寫就.Gary Nebbett乃是 NT/2000 NATIVE 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都保護這些被對映到記憶體的 IMAGE不被刪除.)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-989464/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 精妙SQL語句 (轉)SQL
- Oracle SQL精妙SQL語句講解(轉)OracleSQL
- 10個精妙的Java編碼最佳實踐Java
- 精妙Sql語句SQL
- SQL精妙語句SQL
- 精妙SQL語句介紹SQL
- 精妙無比 8款HTML5動畫例項及原始碼HTML動畫原始碼
- Oracle SQL精妙SQL語句講解OracleSQL
- java 程式碼格式(轉)Java
- 程式碼的味道 (轉)
- 禁止百度轉碼程式碼
- SQL高手篇:精妙SQL語句介紹SQL
- 轉_如何閱讀程式碼
- [轉]BDB例項程式碼
- 程式碼大全介紹 (轉)
- 程式碼的風格 (轉)
- JavaScript 程式碼的加入(轉)JavaScript
- 快速程式碼展示之快速的例子程式碼片段(轉)
- 如何閱讀他人的程式程式碼[轉]
- 人工智慧——一場精妙的商業炒作人工智慧
- 動網論壇密碼暴力破解程式程式碼 (轉)密碼
- JavaScript頁面跳轉程式碼JavaScript
- curl轉python requests程式碼Python
- JSON轉EXCEL程式碼( java)JSONExcelJava
- [轉]OpenLiveWriter 程式碼外掛
- 旋轉文字的CSS程式碼CSS
- 何謂“好的程式碼”? (轉)
- qmail-local程式碼分析(轉)AI
- MySQL出錯程式碼列表(轉)MySql
- 程式碼工人真的必要嗎? (轉)
- FileSystemObject(FSO) 示例程式碼 (轉)Object
- 高亮你的PHP程式碼 (轉)PHP
- 程式碼格式化指令碼CodeFormat (轉)指令碼ORM
- pyc位元組碼文字轉python程式碼Python
- 將ES6程式碼轉換為ES5程式碼
- 程式碼維護:改進程式碼的一些方法 (轉)
- 微軟SQL Server 2008的精妙之處微軟SQLServer
- 解析 SQL Server 2008 的精妙之處SQLServer