作 者: 水中雁 时 间: 2008-06-26,19:52 链 接: http://bbs.pediy.com/showthread.php?t=67321 由于对磁盘结构不是很熟,仅仅从逆向分析的角度,通过对这个驱动的分析过程,学习了向SCSI端口向扇区写数据的方法。如有错误或纰漏之处,请大家指出。 附件: 1、机器狗0625技术剖析.pdf 2、obj2(Macdog).idb 摘要 这是一个6月23号捕获的机器狗变种。跟之前不同的地方,主要是将以前ring3下写磁盘替换文件的操作使用驱动实现了,本文的主要部分也是对该部分的解析。可以看出,机器狗的作者对内核驱动以及磁盘结构都很熟悉。 三、驱动分析 1、基本信息 文件名:%windir%/system32/drivers/obj2.sys DeviceName://Device//DogBaby SymbolicLinkName://DosDevices//DogBaby 2、摘除ntfs的AttachedDevice 3、恢复disk的Hook 1)、摘除disk的AttachedDevice 2)、根据_DRIVER_OBJECT.DriverSection获得_LDR_DATA_TABLE_ENTRY的链表,枚举该链表查找名为CLASSPNP.SYS的模块,找到则获取该模块的基址Base和EntryPoint,如果EntryPoint - Base等于0AE8Fh(入口的RVA),则取g_pClassInternalIoControl = Base + 4FC3h。然后注册驱动disk的派遣例程为_DRIVER_OBJECT.IrpInternalDeviceControlDispatch = pClassInternalIoControl。 4、摘除FtDisk的AttachedDevice 5、摘除Atapi的AttachedDevice 6、恢复Atapi的Hook 1)、读取atapi.sys文件,并定位pe头、及块表。 2)、定位到init块,从init块中使用模糊匹配特征C7 ?? 30 ?? ?? ?? ?? C7 ?? 34。 3)、找到的地址为24968h,记为Atapi_24968h。 4)、取Atapi_24968h + 11h的位置,并换算成RVA,得到fnRVA_IdePortDispatch。 5)、取Atapi_24968h + 18h的位置,并换算成RVA,得到fnRVA_IdePortDispatchDeviceControl。 6)、如果上面的方法获取失败,则强制转换: fnRVA_IdePortDispatch = 67B4h, fnRVA_IdePortDispatchDeviceControl = 0A592h。 7)、获取这两个函数的SVA fnIdePortDispatch = fnRVA_IdePortDispatch + DriverStart, fnIdePortDispatchDeviceControl = fnRVA_IdePortDispatchDeviceControl + DriverStart。 8)、注册Atapi的派遣例程 _DRIVER_OBJECT.IrpDeviceControlDispatch = fnIdePortDispatchDeviceControl, _DRIVER_OBJECT.IrpInternalDeviceControlDispatch = fnIdePortDispatch。 7、定位被覆盖文件的逻辑簇号 1)、打开文件conime.exe,失败则打开userinit.bat;并获取FileObject。 2)、根据FileObject获取_FILE_OBJECT.Vpb,再获取_VPB.DeviceObject。 3)、创建一个IRP。设MainFunction为IRP_MJ_FILE_SYSTEM_CONTROL。 4)、设定_IO_STACK_LOCATION.FsControlCode = FSCTL_GET_RETRIEVAL_POINTERS //其它IRP初始化略过,详细请看idb文件。 5)、调用自己实现的IOCallDriver,获取指定文件的RETRIEVAL_POINTERS_BUFFER信息。 结构查阅msdn如下: 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; 要注意的是按8个字节对齐的,所以DWORD ExtentCount后、LARGE_INTEGER StartingVcn前有4个字节的空间。 ExtentCount记录了该文件分成了n块存储。 StartingVcn记录了起始虚拟簇号。 Extents[i].NextVcn记录了下一个块的起始虚拟簇号,所以Extents[i].NextVcn - Extents[i -
机器狗0625技术剖析(驱动读写磁盘扇区
最新推荐文章于 2022-03-14 16:45:22 发布