硬盘保护锁
作者: 来源: 发布日期:2007-9-4 15:09:27 点击次数:
[原创]硬盘保护锁 我在前一段时间写了一个硬盘锁,拿出来和大家交流交流,同时有个问题,希望大 家能帮我想想。 首先,大略介绍一下我的程序,我是用汇编写成,程序有2个文件:hdlock.exe hdlock.dat ,其中hdlock.dat是我写的用于装入硬盘0柱0道1扇的硬盘锁,hdlock.exe实现 (1)把hdlock.dat装入硬盘0柱0道1扇并设置硬盘锁的密码,(2)修改密码,(3)卸载 硬盘锁 在此,先介绍一下 hdlock.dat,因为硬盘锁本身受空间限制,必须严格控制在1bdH 字节内,(知道为什么吗?)所以是不能用masm先写原程序,再编译,我基本上是用debug 的A命令一次性写出来的,我把这些反汇编了出来,加上一些注释,给大家看看,互相学习 吗。
;这一段是将整个硬盘锁从0000:7c00移至0000:0600,以免被后来读入的代码覆盖 0F6D:0100 1E PUSHDS 0F6D:0101 06 PUSHES 0F6D:0102 B90001 MOVCX,0100 0F6D:0105 BF0006 MOVDI,0600 0F6D:0108 B80000 MOVAX,0000 0F6D:010B 8ED8 MOVDS,AX 0F6D:010D 8EC0 MOVES,AX 0F6D:010F BE007C MOVSI,7C00 0F6D:0112 F2 REPNZ 0F6D:0113 A5 MOVSW 0F6D:0114 EA1A060000 JMP0000:061A ;长跳转至移动后的代码,也就是从011a处开始执行 0F6D:0119 90 NOP 0F6D:011A EB09 JMP0125 ;这一段是对屏幕进行初始化,显示字符串"PASSWORD" 0F6D:0125 B80006 MOVAX,0600 0F6D:0128 B7F0 MOVBH,F0 0F6D:012A B90000 MOVCX,0000 0F6D:012D BA4F18 MOVDX,184F 0F6D:0130 CD10 INT10 ;初始化屏幕(前景为黑色,背景为灰白,字符闪烁) 0F6D:0132 B21A MOVDL,1A 0F6D:0134 BE1C06 MOVSI,061C ;从061cH处显示字符(因为程序将被读入了0000:0600处, ;实际显示的也就是现在的11cH处开始的字符串) 0F6D:0137 B402 MOVAH,02 0F6D:0139 B610 MOVDH,10 0F6D:013B B700 MOVBH,00 0F6D:013D CD10 INT10 ;设光标位置(10H行1aH列) 0F6D:013F 8A04 MOVAL,[SI] 0F6D:0141 3C00 CMPAL,00 0F6D:0143 741B JZ0160 ;是否已显示完字符串,是则跳至从键盘读取密码处 0F6D:0145 B409 MOVAH,09 0F6D:0147 B90100 MOVCX,0001 0F6D:014A B700 MOVBH,00 0F6D:014C B370 MOVBL,70 0F6D:014E CD10 INT10 ;显示一个字符 0F6D:0150 FEC2 INCDL ;光标后移一位 0F6D:0152 46 INCSI ;字符指针后移一位 0F6D:0153 EBE2 JMP0137 ;继续显示下一字符 0f6d:011c db 'PASSWARD'00 ;用于显示的字符串 ; 从键盘读取密码 0F6D:0160 B90400 MOVCX,0004 0F6D:0163 B80000 MOVAX,0000 0F6D:0166 8EC0 MOVES,AX 0F6D:0168 BF0108 MOVDI,0801 0F6D:016B F3 REPZ 0F6D:016C AB STOSW ;在0000:0801开始处开一片长度为8个字节的缓冲区 ;(用00H来标记),用于存放从键盘读入的密码,(密码 ;最多为8个字符,最少为0个字符) 0F6D:016D B90900 MOVCX,0009 ;最多读9次键盘(当然第9次是重头读过) 0F6D:0170 BF0108 MOVDI,0801 ;从801H处开始写密码 0F6D:0173 B223 MOVDL,23 0F6D:0175 B400 MOVAH,00 0F6D:0177 CD16 INT16 ;读键盘 0F6D:0179 3C0D CMPAL,0D 0F6D:017B 7479 JZ01F6 ;是回车则跳至密码比较处 0F6D:017D B402 MOVAH,02 0F6D:017F 90 NOP 0F6D:0180 90 NOP 0F6D:0181 B610 MOVDH,10 0F6D:0183 B700 MOVBH,00 0F6D:0185 CD10 INT10 ;设置光标位置(当然是"PASSWARD"字符串后面了) 0F6D:0187 3C08 CMPAL,08 0F6D:0189 7437 JZ01C2 ;是退格键则跳至退格处理 0F6D:018B 50 PUSHAX 0F6D:018C B40E MOVAH,0E 0F6D:018E B02A MOVAL,2A 0F6D:0190 B307 MOVBL,07 0F6D:0192 CD10 INT10 ;显示一个"*"(没有回显的密码输入是不是很恐怖) 0F6D:0194 58 POPAX 0F6D:0195 0423 ADDAL,23 ;密码字符加23H(受空间限制,加上该程序在系统启 ;动前执行,在此,我只是简单的将密字加上23H, ;如果谁有好而小巧的算法,别忘了告诉我)
|