通通透透分析远程启动计算机灵鸠剑客
文章导读:以前木马和病毒都只能在启动计算机后才能执行,我一直再想,他有没有可能让计算机远程开机呢?于是,我在 网上找资料,查找了很多的资料,终于找到了可以远程开启计算机的方法,当然,有优势也会有弊端,还望读者们能多多的为我指正.
如果想远程启动计算机,那么必须要获取BOOTROM芯片中的启动代码(下文的BOOTCODE),从而在计算机启动过程中执行BOOTCODE而不要BOOTROM芯片。BOOTROM芯片有很多种的,例如:EPROM,BOOTCODE烧录在其中,当网卡插上该芯片后BOOTCODE被装载到上位内存的c800h ~ f000h段中。在BOOTCODE的头部一般有NETWARE等字样,我们可以用DEBUG找到BOOTCODE并以文件形式存放到磁盘上。如果大家觉得不知道该怎么去做,那就要先好好的学学汇编语言和如何使用DEBUG了 :)
接下来我们来分析分析硬件实现远程启动的工作原理。
计算机开机自检后,BIOS要搜索扩展槽中的插件,当插件有效即可用时,就开始执行他上面的扩充ROM块中的代码并使他容入系统。BOOTROM就是作为扩充ROM而容入到系统里面。.BOOTROM中的代码,首先要修改int 19h中断,使int 19h中断指向BOOTROM自身启动代码段,然后将控制权限返回给BIOS。
当BIOS发出int 19h中断引导盘上的操作系统时BOOOTRM又会获得控制的权限.接着在屏幕上就显示了一个远程启动的菜单,当我们选择了远程启动后,便向服务端发出了一个”远程启动的请求”,服务端就会根据该工作站的配置情况将相关的操作系统文件送到工作站的内存当中,于是BOOTROM便将控制交给了内存中的操作系统来完成远程启动系统的引导.(BOOTROM是在int 9h中断引导操作系统时取得控制权限并实现远程启动的)
我们都知道int 9h中断会读出硬盘(如果不是从软盘启动的话)的0柱1头1扇区(简称001扇区)上的主引导记录,这就给我们提供了机会。我们可以写一段代码替换001扇区上的主引导记录,将原来的主引导扇存放到其他的地方,这样我们写的那段代码将会在操作系统引导以前执行。而这段代码需要完成以下任务:首先将保存在C盘尾柱头上的BOOTCODE读到内存空闲处(比如7000H段),用call far远调用执行BOOTCODE,BOOTCODE在修改int 19h中断返回后,然后我们写的那段代码会发int 19h中断再次进入BOOTCODE。BOOTCODE会显示远程启动菜单,用户可选择远程启动方式。
如果选择远程启动很顺利的话,那么我们当然就要去选择本地启动,BOOTCODE就先恢复int 19h中断然后要调用int 19h中断引导操作系统.这样我们写的那段代码就再次被执行从而进入死循环.为了避免这样的事情出现,我们可以在代码执行一次后设置一个标志,再次进入循环,直到遇到标志就不在执行BOOTCODE而直接读入原001扇区引导操作系统。
下面看看我在网上找到后有加以修改的一段代码,阅读时请大家仔细的看看注释,然后将汇编代码连接成.COM文件再改名为BOOTREC.
BOOTREC.ASM
;written by 1jjk
; email:lingjiujianke@163.com
code segment
assume cs: code,ds:code
org 7c00h ;BOOTREC装入0000:7c00h
start:cli
xor ax, ax
mov ss, ax
mov sp,7c00h
mov si, sp
mov ds, ax
mov es, ax
sti
mov di, 0e00h
mov cx, 0100h
repnz movsw ;本代码移到0:e00h处
db 0eah,1dh,0eh,0,0 ;jmp 0000:0e1ch
cmp byte ptr ds:[0c0h],0ffh ;是否再次进入
jz exit ;如果是,转到本地硬盘启动
mov bx, 7000h ;如果不是就将C:盘尾柱0dh头处的BOOTCODE读到7000:0000处
mov es, bx
xor bx, bx
mov cx, bs:[1bah + 0e00h] ;1bah字节存放着C:盘的尾柱扇号
mov dx, 0d80h
mov ax, 023fh
int 13h
jc exit
add bx, 7e00h
inc dh
mov ax, 023fh
int 13h
jc exit
add bx,7e00h
inc dh
mov ax,0202h ;工读入了128扇=64K字节
int 13h
jc exit
mov byte ptr ds[0c0h],0ffh ;第一次执行mov word ptr ds[4f2h],0后设置此标志
db 9ah,3,0,0,70h ;call7000:0003执行BOOTCODE
xor ax, ax ;寄存器清0准备int 19h中断调用
mov dx, ax
mov cx, ax
mov bx, ax
int 19h ;再次进入BOOTCODE
exit:
mov bx,7c00h ;读入原001扇到0:7c00h mov ax, 0
mov ds, ax
mov es,ax
mov cx, 003fh
mov dx,0080h
mov ax,0201h
int 13h
boot:
db 0eah,0,7ch,0,0 ;跳转到0:7c00h
patitab:
org 7dbeh
db 64 dup(0) ;予置分区表64字节,实际数
org 7dfeh ;据由原001扇传过来
db 55h,0aah ;主引导扇有效标志
code ends
end
前面提到BOOTCODE从C:盘尾柱到0dh头处读入BOOTCODE并从003fh扇读入引导记录,这就要求我们设计一个安装程序,事先将BOOTCODE和原引导记录存放在该处。
首先要读出001扇上的主引导扇并将他保存在003fh扇上,将分区表中C:盘的尾柱号(1c4h ~ 1c5h字节)减1使尾柱前移,空出尾柱装BOOTCODE,新的尾柱扇号保存在1bah字节中供我们写的那段程序(既BOOTREC)使用。读入BOOTREC文件,将主引导扇中的1bah字节开始的68字节传送到BOOTREC的同一位置,再将BOOTCODE写入001扇.读入BOOTCODE文件,将它写入C:盘尾柱0dh头1扇区开始的128扇区中,这表明BOOTCODE的长度不能超过64K.011扇区上的分区引导并将他保存在003E扇区上,该扇区第18h字节为每磁头扇区数,第1ah为每柱磁头数,二者的乘积就是每柱扇区的总数.第20h字节处的4字节是C:盘扇区总数,从C:盘扇区总数中减去1个柱的扇区数,然后重写分于引导扇。只有这样,C盘尾柱才真正不属于C盘,它上面保存的BOOTCODE安全可靠,这一点非常的重要!为了避免重复安装,在BOOTCODE的第1bdh字节上设置一个标志ffh,安装程序读入001扇区检测到此标志时就不再安装了.
关于安装一类的代码在网上就可以找到,大家可以好好的找一找,或者去罗云彬的主页好好的学学然后自己写一个安装程序。 (以上涉及到的源代码在光盘中可以找到)