鱼C论坛

 找回密码
 立即注册
楼主: 小甲鱼

[技术交流] 读取硬盘的MBR引导扇区(Windows各系统通用)

  [复制链接]
发表于 2012-6-4 18:54:28 | 显示全部楼层
还是连续剧
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-4 19:07:29 | 显示全部楼层
小鱼鱼               
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-4 19:20:49 | 显示全部楼层
好贵呀,楼主不缺钱吧
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-4 19:34:26 | 显示全部楼层
了解一下                   ~
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-4 20:31:45 | 显示全部楼层
我想看看这部分内容
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-4 21:12:18 | 显示全部楼层
                    
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-4 21:47:35 | 显示全部楼层
下来看看
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-5 08:44:58 From FishC Mobile | 显示全部楼层
我看这个是免费的吗?
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-5 09:11:27 | 显示全部楼层
竟然收费
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-5 09:15:06 | 显示全部楼层
本帖最后由 憔悴心只为你 于 2012-6-5 09:16 编辑

前段时间网上有个感染mbr的病毒,听说很厉害,那么什么是mbr呢,这个可能大家已经有所了解了,我在说具体点:
MBR(Master Boot Record)就是我们经常说的“硬盘主引导记录”,它是由FDISK等磁盘分区命令写在硬盘绝对0扇区的一段数据,它由主引导程序、硬盘分区表及扇区结束标志字(55AA)这3个部分组成。
简单一点说就是你打开电源 先有主板上BIOS程序引导硬件初始化 然后交由系统(如XP/2000/LINUX等)引导 而系统的这块引导程序就在MBR—硬盘的第一分区第一扇区上的前512字节   这个可以用我生成的dat文件来证实,大家常见的命令就是FDISK/MBR 可以修复WIN引导,装完Linux的如果想卸载重装windows的同学可能就要用这个命令来修复引导区。
最近找了些资料,结合简单的编程,实现了读mbr,不涉及ring0和内核,只为了让大家看懂和了解些知识。
有人在谈rootkit,这里就大略的说一下mbr rootkit,MBR的rootkit又叫做Mebroot,最早产生于07年底,而不是某杀毒软件所谓的最新病毒,大家可以去搜索Trojan.Anserin,出于GMER之手,它利用了微软当时的内核漏洞,安装驱动到计算机,算是成功完成了一次攻击。 当然这不是我们菜鸟一天所能学会的,我下面就来介绍一下访问mbr的2种方式:
1). 最简单的方式是我这次所重要介绍的,大家都能理解的,利用CreatFile()函数访问,在ring3下,用户是可以以用户态的方式访问mbr的,但在Vista和windows7下要使用管理员权限,这点大家在UAC机制中理解 ,我这里简单的实现了读mbr功能,程序在visual stdio 2008 调试,之前遇到了些问题,但也解决了,建议大家以后用stdio 2008,2010 来编译程序,不是因为美观,而是为了代码的安全。

  1. #include "stdafx.h"
  2. #include"windows.h"
  3. #include"stdlib.h"
  4. #include"TCHAR.h"


  5. //头文件,在编译时别忘了审查代码


  6. LPTSTR ReadMBR(BYTE* pMBR,UINT nLen,int Num)


  7. {


  8. LPTSTR errMSG="";
  9. HANDLE hDevice;

  10. TCHAR szDevicename[64];

  11. LPTSTR szBuff;

  12. DISK_GEOMETRY Geometry;

  13. BOOL bRet;

  14. DWORD bytes,bread,count;

  15. char drive;
  16. itoa(Num,&drive,10); //获得硬盘名
  17. wsprintf(szDevicename,"\\\\.\\PHYSICALDRIVE%c",drive); //获得设备句柄,共享读写
  18. hDevice = CreateFile(szDevicename,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);

  19. /************************解释下createfile这个函数**********************

  20. HANDLE CreateFile(
  21.    LPCTSTR lpFileName, //指向文件名的指针
  22.    DWORD dwDesiredAccess, //访问模式(写/读)
  23.    DWORD dwShareMode, //共享模式
  24.    LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针
  25.    DWORD dwCreationDisposition, //如何创建
  26.    DWORD dwFlagsAndAttributes, //文件属性
  27.    HANDLE hTemplateFile //用于复制文件句柄
  28.   );

  29. 具体参数大家百度吧:http://baike.baidu.com/view/1288759.htm?fr=ala0_1_1

  30. *******************************************************************/

  31. if(hDevice==INVALID_HANDLE_VALUE)


  32. {



  33. errMSG="the device open error";
  34. exit(1);
  35. }

  36. /****************************下面简单说明下deviceiocontrol这个函数******************************

  37. BOOL DeviceIoControl( HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped );

  38. 参数表
  39.   参数 类型及说明
  40.   hDevice Long,设备句柄
  41.   dwIoControlCode Long,带有 FSCTL_ 前缀的常数。参考设备控制选项的部分列表
  42.   lpInBuffer Any,具体取决于dwIoControlCode参数。参考设备控制选项的部分列表
  43.   nInBufferSize Long,输入缓冲区的长度
  44.   lpOutBuffer Any,具体取决于dwIoControlCode参数。参考设备控制选项的部分列表
  45.   nOutBufferSize Long,输出缓冲区的长度
  46.   lpBytesReturned Long,实际装载到输出缓冲区的字节数量
  47.   lpOverlapped OVERLAPPED,这个结构用于重叠操作。针对同步操作,请用ByVal As Long传递零值

  48. *****************************************************************************/

  49. DeviceIoControl(hDevice,FSCTL_LOCK_VOLUME,NULL,0,NULL,0,&count,NULL); //锁定硬盘

  50. DeviceIoControl(hDevice,IOCTL_DISK_GET_DRIVE_GEOMETRY,NULL,0,&Geometry,sizeof(DISK_GEOMETRY),&count,NULL);


  51. szBuff = (LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,Geometry.BytesPerSector);


  52. if(szBuff==NULL)


  53. {

  54. errMSG="Allocate memory errors";


  55. exit(1);


  56. } //读取硬盘数据控制码

  57. bytes=512; //读硬盘头512字节,mbr所在位置

  58. bRet = ReadFile(hDevice,szBuff,bytes,&bread,NULL);

  59. if(bRet==FALSE||bread<512)

  60. {

  61. errMSG="Reading mbr error";

  62. exit(1);


  63. }

  64. for(int n=0;n<512;n++)


  65. {

  66. pMBR[n]=szBuff[n];


  67. }

  68. //解锁硬盘,释放句柄


  69. DeviceIoControl(hDevice,FSCTL_UNLOCK_VOLUME,NULL,0,NULL,0,&count,NULL);

  70. CloseHandle(hDevice);

  71. return errMSG;

  72. }


  73. //以上完成了读mbr,通过对代码的分析,相信大家明白了读取mbr有多简单了吧。


  74. void WriteMBR(BYTE *pMBR,UINT nLen,int Num)

  75. {

  76. HANDLE hDevice;

  77. char drive;

  78. DWORD bread,count;

  79. TCHAR szDeviceName[64];

  80. DISK_GEOMETRY Geometry;

  81. itoa(Num,&drive,10);

  82. wsprintf(szDeviceName,"\\\\.\\PHYSICALDRIVE%c",drive);

  83. hDevice = CreateFile(szDeviceName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);

  84. if(hDevice==INVALID_HANDLE_VALUE)


  85. {

  86. printf("the device open error\n");
  87. exit(1);
  88. }


  89. DeviceIoControl(hDevice,FSCTL_LOCK_VOLUME,NULL,0,NULL,0,&count,NULL);

  90. DeviceIoControl(hDevice,IOCTL_DISK_GET_DRIVE_GEOMETRY,NULL,0,&Geometry,sizeof(DISK_GEOMETRY),&count,NULL);


  91. if(WriteFile(hDevice,pMBR,512,&bread,NULL)==TRUE)


  92. {
  93. printf("write ok\n");

  94. }
  95. else

  96. {

  97. printf("write error\n");

  98. }


  99. DeviceIoControl(hDevice,FSCTL_UNLOCK_VOLUME,NULL,0,NULL,0,&count,NULL);

  100. CloseHandle(hDevice);

  101. }


  102. //这是写mbr,和读mbr差不多,理解起来也不是那么难吧!

  103. //我们就来测试一下:

  104. void main( )

  105. {

  106. BYTE MBR[512];

  107. ReadMBR(MBR,512,0);

  108. LPTSTR path="d:\\mbr.dat";

  109. FILE *fp;

  110. if((fp=fopen(path,"wb+"))!=NULL)

  111. {

  112. fwrite(MBR,1,512,fp);

  113. fclose(fp);

  114. printf(" 读取成功在mbr.dat\n");
  115. }

  116. else

  117. {

  118. printf("creat file false!\n");

  119. }

  120. } //主函数完成读mbr
复制代码

第二种方法,也是最头疼,这次病毒用到的方法,个人在研究中,但貌似屁都不懂,还是拿出来随便说说吧:
Disk.sys驱动封装和setwinEventhook()技术,它完全取代了刚才所使用的上层api createfile()函数,它们直接操纵了用户底层,可以随意穿透hips,它发送irp来执行读写操作

首先ld.exe 在系统重启后完场自删除,将可执行文件1.tmp文件放入我们熟悉的%temp%中然后运行,第二个程序在用户层下感染mbr组件,创建\readharddisk不存在设备,当安装1.Tmp时,文件ld.exe以参数cp 2.tmp运行,文件ld.exe 复制到2.tmp中,user32.dll 是被ld.exe 所读取的,并执行。同时检测setwineventHook()的前5个字节是否与磁盘相匹配,过滤api (在一些安全软件中,SetWinEventHook函数会被hips和安全程序hook掉),这个特殊的过滤API函数将DLL文件注入到explorer进程的文件中,此安装文件将会调用SetWinEventHook所需的3个重要传递参数:explorer.EXE id,2.mp,dll文件路径和导出例程wep()指针。这样rootkit就完全运行在explorer.exe中了。
剩下的注册表和开启服务功能,然后感染mbr ,删除自身所有文件和服务。但这部分我还没搞懂,大家能理解过程就行了,和一般的内核病毒差不多。  

评分

参与人数 1荣誉 +20 鱼币 +10 贡献 +5 收起 理由
小甲鱼 + 20 + 10 + 5 赞一个!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-5 09:46:46 | 显示全部楼层
谢谢分享,学习了!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-5 10:26:05 | 显示全部楼层
谢谢楼主分享!!!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-5 12:36:27 | 显示全部楼层
为什么都要钱
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-5 12:40:18 | 显示全部楼层
我在鱼C被欺骗了,还是被boss欺骗了,为什么你这篇东西和http://bbs.fishc.com/forum.php?mod=viewthread&tid=18304基本一模一样,还要收两份鱼币才能观看,这是什么原因啊,鱼C到达今天这地步,看来也慢慢的天朝化了!有理没处讲啊!失望!!!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-5 12:49:31 | 显示全部楼层
呵呵,看看学习以下
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-6-5 15:25:54 | 显示全部楼层

码字辛苦,调试辛苦,分享辛苦,给分辛苦钱而已。。。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-6-5 15:27:41 | 显示全部楼层
拉登o睡觉 发表于 2012-6-5 12:40
我在鱼C被欺骗了,还是被boss欺骗了,为什么你这篇东西和http://bbs.fishc.com/forum.php?mod=viewthread&t ...

并且小甲鱼也不忘记给大家提供100鱼币奖励机会,破解那个也是相当容易,破解器甚至已经在密码学中做好分享给大家了,但挺失望,到现在还是没有人来领取,这是一个互动的游戏,如果只有我自己一个人在那里傻X的自顾自玩,我可能需要做下自我检讨。
朋友不如耐心点学习,朋友您在鱼C待了有一段时间也知道,鱼币并不难获得,并不需要您为此花上半分钱人民币,只不过是促进大家相互学习和互助的措施。



小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-5 16:05:15 | 显示全部楼层
看看牛B不:lol
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-5 16:32:05 | 显示全部楼层
卖的这么贵啊:L
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-5 18:27:56 | 显示全部楼层
看看~~~~~~
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-19 10:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表