. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->综合研究
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  万分困惑中.......  [待解决] 回复[ 3次 ]   点击[ 517次 ]  
cuttlefish
[帖 主]   [ 发表时间:2009-06-14 08:45 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-04-17 09:51
我编写了一个密码程序,思路是这样的:
安装程序先把原硬盘0道0柱1扇区备份到后一个扇区,然后把密码程序写到原来的0道0柱1扇区,这样启动计算机时就把密码程序先启动了。
我的密码程序实现的功能是:
先显示密码程序,如果密码正确,就把备份过的那个扇区加载到0:7c00h处,再把控制权交给它,从而实现系统的启动。
但是我有这样的问题:
当我自己编写的密码程序(一个扇区)放在0道0柱1扇区时,如果此程序的后面部分,即55AA前,分区表信息没有时,系统显示到starting dos.....后就提示找不到c:\dos\command等问题,然后就当机了。但是如果我把原来的分区表信息放到密码程序后面部分,系统能够正常启动。为什么会这样呢,我想不通,因为我的密码程序确实执行了,而且密码对了也确实把备份扇区加载到0:7c00h处执行了,也就是说那时已和我的密码程序没有关系了,但为何不能启动呢?
我知道文字并不能说清楚,看源码更清楚,希望能解答我的疑惑,万分感谢!源码不在这儿,明天我贴出来我的QQ:348666790
xuejh
[第1楼]   [ 回复时间:2009-06-14 15:49 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-24 22:57
这与WINXP系统的启动机制有关,启动过程如下:
 当计算机自检完成后,并更新过 ESCD (Extended System Configuration Data,扩展系统配置数据)时,如果你的计算机设置是从硬盘启动,这时计算机将首先硬盘0柱面0磁头1扇区(主引导区MBR)中的512个字节读入内存0000:7C00处并跳到0000:7C00处执行;在读取过程中,计算机并不检查该扇区的内容是什么。接着执行读入的内容(硬盘主引导区中的前466个字节,软盘没有分区表,软盘读入的是其引导区的内容,类似于C盘,D盘第一个扇区的内容),首先开始检测该扇区的最后两个字李是不是“55AA”标志,如果“55AA”不存在则打印“Invalid partition table(无效的分区表)”;如果有“55AA”并进一步检测有无硬盘分区表;如有并再进一步分析硬盘分区表中的内容是否正确;如果硬盘分区表正确可用,便接着读取活动分区的第一个扇区的内容即引导区(DBR区)的内容,并把控制权移交。但硬盘分区表的内容驻留内存,供计算机调用。
xuejh
[第2楼]   [ 回复时间:2009-06-14 15:51 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-24 22:57
我给你的建议是研究一下WINDOWS内核编程,在WINDOWS层面去解决这个问题吧,我也是在学习中....
cuttlefish
[第3楼]   [ 回复时间:2009-06-14 19:28 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-04-17 09:51
首先感谢xuejh给我的解答,我下一步的目标也是系统内核,但这样的windows资料太少了,所以可能会看linux内核方面的东东。
我上面的问题是,我的密码程序已经执行了,并且密码对的情况下,把原本的0道0柱1扇区(现在我备份在后一个扇区的)加载到了0:7c00h处,并且把控制权交给了这段程序,那么也就是说,此时开始,和我的密码程序已没有关系了,但为何我的密码程序后面部分必须是分区表正确?如果没有分区表,系统并不能区动。
我原来是这样考虑的,会不会把mbr加载到0:7c00h后,它检查的还是原来的硬盘的0道0柱1扇区,而那时的位置已被我的密码程序替代,所以没法启动?
带着这样的疑问,我理所当然的认为,备份的那个扇区中的分区表并不会被mbr读到,它读的是原来的0道0柱1扇区的备份表,所以我就手动把备份扇区中有关分区表的信息清零,但这时直接就出现找不到分区表,那我就疑惑了,为何两个扇区中的分区表信息必须同时存在,如果其中一个地方没有分区表,系统就不能启动?
我现在的想法就是:密码程序所在的那个扇区只要最后两个字节是55AA,BIOS就会认为它是一个可启动扇区,这样我的密码程序就得到执行,执行后,密码正确,那么我的程序就把备份的引导扇区加载到0:7c00h执行,这时就像计算正常启动一样,mbr检查共区表是否正确可用,然后读取活动分区的第一个扇区的内容加载并执行,而正是这个扇区的引导程序(系统引导程序)运行时,它会检查硬盘0道0柱1扇区的分区表信息,如果没有,则显示找不到c:\dos\command,而那个硬盘0道0柱1扇区现是正是我的密码程序,如果原来分区表信息的位置是无效的,则没法启动?
我想来想去,只有这样的解释是合理的,否则实在不知道怎么办了。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved