您的位置:首页 > 移动开发 > IOS开发

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

2008-11-07 11:13 387 查看
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文件进行修改了(终于说到主题上了)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: