论坛: 编程破解 标题: 关于硬盘分区表的问题. 复制本贴地址    
作者: 山鸡 [duck_chen]    论坛用户   登录
有谁知道硬盘分区表是什么啊?
怎么对它进行修改啊?(比如说怎么用它使硬盘锁住啊?)我是说不要用DEBUG.
比如用TC怎么实现啊?有原代码吗?谢谢了。

地主 发表时间: 06/16 15:23

回复: cimsxiyang [cimsxiyang]   版主   登录
# include < stdio.h > 
# include < conio.h > 
# include < dos.h > 
# include < bios.h > 
# include< string.h > 
void windows
(int x1,int y1,int x2,int y2,int cor,int co);
union REGS r;
FILE *file;
unsigned char ch;
int i,num,j;
unsigned char buff[512],buff1[512];
void main(void)
{wait1:
 windows(1,1,80,25,3,11);
 clrscr(); gotoxy(28,1);
 printf("微机硬盘主引导扇区管理程序\r\n\r\n");
 windows(5,5,75,23,1,15);
 cprintf("\n\r1.备份硬盘主引导扇区");
 cprintf("\n\r2.查看硬盘主引导扇区");
 cprintf("\n\r3.比较硬盘主引导扇区");
 cprintf("\n\r4.更新硬盘主引导程序");
 cprintf("\n\r5.更新硬盘分区表");
 cprintf("\n\r6.显示分区表数据");
 cprintf("\n\r7.清除扇区有效标志");
 cprintf("\n\r8.恢复扇区有效标志");
 cprintf("\n\r9.返回DOS 系统");
 cprintf("\n\r请选择(1-9) (ESC键退出.)");
 r.h.ah=0; int86(0x16,&r,&r);
 if(r.h.al=='1'){
biosdisk(2,0x80,0,0,1,1,buff);
if((file=fopen("boot.dat","rb"))!=NULL){
gotoxy(15,18);
cprintf("主引导扇区文件BOOT.DAT存在!
是否覆盖(Y/N)?");
r.h.ah=0;int86(0x16,&r,&r);
if(r.h.ah==0x15){fclose(file);
goto jlfile;}else goto wait1; }
  //文件是否存在
 jlfile:
file=fopen("boot.dat","wb");
fwrite(buff,1,512,file);
fclose(file); gotoxy(15,18);
cprintf("硬盘(C:)
主引导扇区写入BOOT.DAT,任意键返回.");
r.h.ah=0;int86(0x16,&r,&r);goto wait1; }
 if(r.h.al=='2'){ clrscr();
biosdisk(2,0x80,0,0,1,1,buff);
windows(1,1,80,25,4,14);
gotoxy(20,1);cprintf("16进制码");
gotoxy(61,1);cprintf("字符编码");
window(3,3,50,25);
for(i=0;i<  512;i++){cprintf
("%02X",buff[i]);}
window(55,3,78,25);for(i=0;i<  512;i++){
if(buff[i]<  0x20)buff[i]='.';
cprintf("%c",buff[i]);}
printf("\n按任意键返回.");
r.h.ah=0;int86(0x16,&r,&r);
goto wait1; }
 if(r.h.al=='3'){
biosdisk(2,0x80,0,0,1,1,buff);
if((file=fopen("boot.dat","rb"))
==NULL){
gotoxy(15,18);
cprintf("主引导扇区文件BOOT.DAT
不存在!任意键返回.");
r.h.ah=0;int86(0x16,&r,&r);
goto wait1;}else
fread(buff1,1,512,file); fclose(file);
for(i=0;i< 512;i++){
if(buff[i]!=buff1[i]){gotoxy(15,18);
cprintf("\7主引导扇区异常(%02XH),
 请检查或更新.",i);
r.h.ah=0;int86(0x16,&r,&r);
goto wait1; } }
gotoxy(15,18);
cprintf("硬盘主引导扇区正常.");
delay(1000);goto wait1;  }
 if(r.h.al=='4'){
if((file=fopen("boot.dat","rb"))==NULL){
gotoxy(15,18);
cprintf("主引导扇区文件BOOT.DAT不存在!
任意键返回.");
delay(1000);goto wait1;}else
fread(buff,1,512,file); fclose(file);
biosdisk(2,0x80,0,0,1,1,buff1);
for(i=0;i< 0x1be;i++) buff1[i]=buff[i];
biosdisk(3,0x80,0,0,1,1,buff1);
gotoxy(15,18);
cprintf("主引导扇区更换完毕!");
delay(1000);goto wait1;  }
 if(r.h.al=='5'){
if((file=fopen("boot.dat","rb"))==NULL){
gotoxy(15,18);
cprintf("主引导扇区文件BOOT.DAT不存在!.");
delay(1000);goto wait1;}else
fread(buff,1,512,file);
fclose(file);biosdisk(2,0x80,0,0,1,1,buff1);
for(i=0x1be;i< 512;i++)
buff1[i]=buff[i]; gotoxy(15,18);
cprintf("是否真的更换(Y/N)?");
r.h.ah=0;int86(0x16,&r,&r);
if(r.h.ah!=0x15)goto wait1;
biosdisk(3,0x80,0,0,1,1,buff1);
cprintf("分区表更换完毕!.");
delay(1000);goto wait1;  }
 if(r.h.al=='6'){
  windows(10,17,70,24,4,14);
  biosdisk(2,0x80,0,0,1,1,buff1);
  for(i=0;i< 64;i++){
  if((i%16)==0)cprintf("\n\r分区[%c]:
",i/16+0x31);
  cprintf("%02X ",buff1[0x1be+i]);}
  cprintf("\n\r按任意键返回.");
  r.h.ah=0;int86(0x16,&r,&r); }
 if(r.h.al=='7'){
biosdisk(2,0x80,0,0,1,1,buff1);
buff1[510]=00; buff1[511]=00;
biosdisk(3,0x80,0,0,1,1,buff1);
cprintf("有效标志清除!.");
delay(1000);goto wait1;  }
 if(r.h.al=='8'){
biosdisk(2,0x80,0,0,1,1,buff1);
buff1[510]=0x55; buff1[511]=0xaa;
biosdisk(3,0x80,0,0,1,1,buff1);
cprintf("有效标志恢复!.");
delay(1000);goto wait1;  }
  if((r.h.al==0x1b)||(r.h.al=='9'))
exit(0);else
  goto wait1;}
 void windows(int x1,int y1,int x2,
int y2,int cor,int co)
 {struct text_info winfo; 
  //窗口函数
 char i,j;
 window(x1,y1,x2,y2); normvideo();
 textbackground(cor); textcolor(co);
 gettextinfo(&winfo);
 window(winfo.winleft,winfo.wintop,
winfo.winright,winfo.winbottom+1);
 textbackground(cor);
 for(i=1;i< (winfo.
winbottom-winfo.wintop+1);i++)
 for(j=1;j< (winfo.
winright-winfo.winleft+1);j++)
 putch(' ');
 window(winfo.winleft,winfo.
wintop,winfo.winright,winfo.winbottom);
 gotoxy(1,1);putch(0xda);
 for (i=0;i< x2-x1-1;i++) putch(0xc4);
 putch(0xbf);
 for(i=0;i< y2-y1-1;i++)
 {gotoxy(1,i+2);putch(0xb3);
 gotoxy(x2-x1+1,i+2);putch(0xb3);}
 gotoxy(1,y2-y1);  putch(0xc0);
 for(i=0;i< x2-x1-1;i++)
 putch(0xc4);putch(0xd9);
 window(x1+1,y1+1,x2-2,y2-2);
 textbackground(cor); return;}

****************该程序不是我写的,我没有空调试,涉及mbr,小心使用,最好先读懂。应该没有问题。****************************


[此贴被 夕阳(cimsxiyang) 在 6月16日23时13分 编辑过]

B1层 发表时间: 6/16 23:20

回复: ricky [ricky]   版主   登录
mov ax,201
mov bx,200
mov cx,01
mov dx,80
int 13
int 20
;以上是读出c盘主引导,很简单,用int 13,你好好查一下,年代久远,不是记得太清楚了


B2层 发表时间: 06/27 09:11

回复: jacker [jacker]   论坛用户   登录
    主引导扇区(MBR)的主引导程序是在计算机加电自检是由主板上的BIOS芯片中的中断程序执行的,该中断程序指定执行硬盘的物理参数的第一个逻辑扇区程序就是主引导扇区程序.
   主引导记录扇区按其结构和功能分为三个部分:主引导扇区,分区表和硬盘有效标志.主引导程序共有446B,位于0面0道1扇区的偏移000H~1BDH处.它负责检查硬盘的合法性,而且与其他软件和硬件无关;负责检验分区表的有效性,并将活动区读入内存执行."引导型"病毒一般都占据该扇区.

B3层 发表时间: 07/05 08:57

回复: god_father [god_father]   论坛用户   登录
#include <stdio.h>
#include <bios.h>
#include <fcntl.h>
#include <sys\types.h>
#include <sys\stat.h>
void helpmsg(void);
int main(int argc,char *argv[])
{
  int result;
  char buffer[512];
  FILE *fp;
  if(argc==1)helpmsg();
  if(*argv[1]=='d'||*argv[1]=='D')
  {
      result=biosdisk(2,0x80,0,0,1,1,buffer);
      if(!result)
      {
        printf("读硬盘分区表成功^^^^^GOD_Father\n");
        if((fp=fopen("D:\1.txt","wb+"))==NULL)
            {
                fprintf(stderr,"不能创建文件:D:\1.txt\n");
                exit(1);
            }
        fprintf(buffer,1,512,fp);
        /*strcpy(fp,buffer);*/
        fclose(fp);
        printf("硬盘分区表保存成功^^^^^GOD_Father\n");
        return 0;
      }
      else
      {
        fprintf(stderr,"读硬盘分区表失败");
        exit(1);
      }
    }
    if(*argv[1]=='c'||*argv[1]=='C')
    {
      if((fp=fopen("D:\1.txt","rb+"))==NULL)
      {
        fprintf(stderr,"文件打开失败^^^^^GOD_Father\n");
        exit(1);
      }
      fread(buffer,1,512,fp);
      result=biosdisk(3,0x80,0,0,1,1,buffer);
      if(!result){
          printf("硬盘分区表恢复成功^^^^^^GOD_Father\n");
          fclose(fp);
          return 0;
          }
      else{
          fprintf(stderr,"硬盘分区表恢复失败^^^^^^GOD_Father\n");
          fclose(fp);
          exit(1);
          }
    }
  return 0;
}
void helpmsg(void)
{
  puts("程序使用的格式为:SAVEPART[D]或SAVEPART[C]\n");
  puts("参数:D---保存硬盘分区表到D盘\n");
  puts("参数:C---从D盘恢复硬盘分区表\n");
  printf("CopyRight@2004  by **** GOD_Father!");
  exit(0);
}




分区表.c:
警告 分区表.c 24: 指针转换后指向其它类型在 main 函数中
警告 分区表.c 24: 不可移动的指针(地址常数)转换在 main 函数中
参数中有错误字符



出现上述错误
请高手指正
谢谢


B4层 发表时间: 04-04-01 15:09

回复: kailangq [kailangq]   版主   登录


B5层 发表时间: 04-04-02 04:08

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号