本文介紹了Unix系統病毒機制、具體實現以及ELF文件格式。簡述了Unix系統病毒檢測和反檢測技術,提供了Linux/i386架構下的一些例子。需要一些初步的Unix系統編程經驗,能夠理解Linux/i386下匯編語言,如果理解ELF本身更好。
本文沒有任何實際意義上的病毒編程技術,僅僅是把病毒原理應用到Unix系統環境下。這裡也不打算從頭介紹ELF規范,感興趣的讀者請自行閱讀ELF規范。
Unix系統感染 ELF 格式文件
進程映象包含"文本段"和"數據段",文本段的內存保護屬性是r-x,因此一般自修改代碼不能用於文本段。數據段的內存保護屬性是rw-。
段並不要求是頁尺寸的整數倍,這裡用到了填充。
關鍵字:
[...] 一個完整的頁
M 已經使用了的內存
P 填充
頁號
#1 [PPPPMMMMMMMMMMMM] \
#2 [MMMMMMMMMMMMMMMM] |-- 一個段
#3 [MMMMMMMMMMMMPPPP] /
段並沒有限制一定使用多個頁,因此單頁的段是允許的。
頁號
#1 [PPPPMMMMMMMMPPPP] <-- 一個段
Unix系統典型的,數據段不需要從頁邊界開始,而文本段要求起始頁邊界對齊,一個進程映象的內存布局可能如下:
關鍵字:
[...] 一個完整的頁
T 文本段內容
D 數據段內容
P 填充
頁號
#1 [TTTTTTTTTTTTTTTT] <-- 文本段內容
#2 [TTTTTTTTTTTTTTTT] <-- 文本段內容
#3 [TTTTTTTTTTTTPPPP] <-- 文本段內容(部分)
#4 [PPPPDDDDDDDDDDDD] <-- 數據段內容(部分)
#5 [DDDDDDDDDDDDDDDD] <-- 數據段內容
#6 [DDDDDDDDDDDDPPPP] <-- 數據段內容(部分)
頁1、2、3組成了文本段
頁4、5、6組成了數據段
從現在開始,為簡便起見,段描述圖表用單頁,如下:
頁號
#1 [TTTTTTTTTTTTPPPP] <-- 文本段
#2 [PPPPDDDDDDDDPPPP] <-- 數據段
在i386下,堆棧段總是在數據段被給予足夠空間之後才定位的,一般堆棧位於內存高端,它是向低端增長的。
在ELF文件中,可裝載段都是物理映象:
- ELF Header
- .
- .
- Segment 1 <-- 文本段
- Segment 2 <-- 數據段
- .
- .
Unix系統每個段都有一個定位自身起始位置的虛擬地址。可以在代碼中使用這個地址。