关于BIOS的那些事----不要老整三岁的脑筋急转弯,咱们来整点五岁的(下)

  ISA模块之所以能运行,是因为system bios文件在某个地方把控制权教给了ISA模块,在什么地方呢?一般的代码工人首先想到把system bios文件反汇编了读,读完就知道在什么地方调用了isa模块了。可这样做工作量太大了,黑客和一般代码工人的一个主要区别就是黑客知道哪些代码该读,哪些代码可以不读。我们来重写一个ISA模块的代码:

 

use16

 

db 55h,0Ah

db 01h

 

push ax
push bx
push ds
xor ax,ax
mov ds,ax
mov bx,sp
mov ax,[bx+6]
mov [01e0h],ax

mov ax,[bx+8]

mov [01e2h],ax
pop ds
pop bx
pop ax

retf

 

  因为ISA模块最后是通过retf返回的,retf指令的执行过程是先ip出栈,再cs出栈,再返回。因此这段代码的意思就是将sp里存放的ip和cs的地址放到0000:01e0这个内存位置,这个位置是dos操作系统中断向量表的空闲空间,病毒程序的最爱。重新编译烧录后,重启pc机并运行DOS操作系统(搞bios的机子都是多系统的),运行debug,查看0000:01e0,发现对应的cs,ip是E000:C6F1,这就是ISA模块的返回地址。

  现在用IDA把system bios文件6a61cpad.bin的这段代码反汇编出来:

 

seg000:C6BB sub_C6BB        proc near               ; CODE XREF: seg000:C9FEp
seg000:C6BB                 push    ds
seg000:C6BC                 push    es
seg000:C6BD                 pushad
seg000:C6BF                 mov     ah, [bp+265h]
seg000:C6C3                 mov     al, ch
seg000:C6C5                 mov     word ptr ds:dword_0, (offset dword_0+3)
seg000:C6CB                 mov     word ptr ds:dword_0+2, es
seg000:C6CF                 movzx   ebx, byte ptr es:dword_0+2
seg000:C6D6                 shl     ebx, 9
seg000:C6DA                 push    ebx
seg000:C6DC                 push    es
seg000:C6DD                 push    es
seg000:C6DE                 pushad
seg000:C6E0                 pushf
seg000:C6E1                 xor     edx, edx
seg000:C6E4                 mov     di, 0F000h
seg000:C6E7                 mov     es, di
seg000:C6E9                 assume es:nothing
seg000:C6E9                 mov     di, 0C8E0h
seg000:C6EC                 sti
seg000:C6ED                 call    ds:dword_0
seg000:C6F1                 popf
seg000:C6F2                 popad
seg000:C6F4                 pop     es
seg000:C6F5                 assume es:nothing
seg000:C6F5                 pop     es
seg000:C6F6                 pop     ebx
seg000:C6F8                 popad
seg000:C6FA                 pop     es
seg000:C6FB                 pop     ds
seg000:C6FC                 retn
seg000:C6FC sub_C6BB        endp

 

  这段代码在C6ED的地方调用了ISA模块,可这段代码本身也是一段函数,这段函数又是由哪段代码调用的呢?要搞清楚这个问题,需要对system bios文件进行修改了(终于说到主题上了)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值