|
回复 #4058 hpy7332 的帖子
老先生光临,不胜荣幸。
老先生过谦了,您不断学习深入钻研,是后辈楷模。
0PE获取服务器端ip的过程大致是:
1、menu.0pe(即grldr内置菜单):
- write 0x60064 0
- checkrange 0x21 read 0x8280 && write 0x60064 1
复制代码
检测到pxe网启时往内存地址0x60064处写入1,作为是否网启的标志。
早期g4d不支持变量,只能通过特定内存地址保存数据。
以下引自sratlf版主的grub4dos帮助文档:
在固定位置访问一些内部变量也可以参见 命令索引 read 命令 部分
地址 长度 说明
========= ============== ==============================================
0000:8208 4字节(即双字) 启动分区号 install_partition (the boot partition)
0000:8278 4字节(即双字) GRUB4DOS编译的日期十进制数.
0000:8280 4字节(即双字) 启动驱动器号(boot_drive)
0000:8284 4字节(即双字) pxe 客户端 ip (即本地ip)
0000:8288 4字节(即双字) pxe 服务器 ip
0000:828C 4字节(即双字) pxe 网关 ip
2、M.lst:
- read 0x60064 && dd if=(md) of=(hd-1,0)/BIN/PXE_XIP.COM bs=1 count=12 skip=0x8284 seek=0x166
复制代码
读0x60064处数据,若非0(包括1),则为pxe网启。这时把内存从0x8284开始的12个字节数据写入文件PXE_XIP.COM的特定位置。
这12个字节涵盖了0x8288开始的4个字节,即包括pxe服务器ip。这样,ip数据就存入文件了。理论上以后总有办法从中取出相关数据加以利用。
0pe启动时会先进入DOS,在DOS环境下整合多个组件,动态形成pe核心,然后用grub.exe来启动setupldr.bin正式引导pe(之后跟其它pe类似)。
所以把数据写入一个DOS可执行文件PXE_XIP.COM。
这个文件我用16位汇编语言写成,其数据区位置事先定位好,在文件尾部12字节,grub4dos正好把数据往那里填。PXE_XIP.COM集程序代码、数据于一体。
3、setip.bat:
- pxe_xip>pxe_xip.bat
- call pxe_xip.bat
- set Tftp_Server=%pxe_sip%
复制代码
运行PXE_XIP.COM时,它负责解释尾部的ip数据,将(原来整数形式的)ip数据转化为诸如192.168.0.100形式的ip地址,并向屏幕输出诸如
set pxe_sip=192.168.0.100
的文字。把输出重定向到文件pxe_xip.bat并执行pxe_xip.bat,ip地址就到环境变量pxe_sip里了。
4、auto_exe.bat:
call setip.bat
>C:\WXPE\setTFTPD.cmd echo set Tftp_Server=%Tftp_Server%
最后,生成一个setTFTPD.cmd文件,其内容类似于
set Tftp_Server=192.168.0.100
这个.cmd批处理,就是进入pe后在MapY.cmd里调用的。
以上过程,把网启时grub4dos获取的服务器ip,辗转传递给pe供其利用。
值得注意的是,0pe获取ip的方法,是在几年前grub4dos功能还很弱时实现的。
那时g4d没变量,没批处理,没外部命令,玩g4d的人也很少。当时算是比较好的方案。
后来chenall大把g4d功能发展到堪比dos批处理的程度。于是,不经DOS,完全由g4d批处理也可轻易完成ip获取、格式转换、保存到文件等一系列处理。
我记得zhaohj大就提供过这方面的g4d批处理。sratlf版主的grub4dos帮助文档里估计也有现成的获取ip方面的资料。
时至今日,0pe上述方法已然落后。但0pe在这方面早已成型,现在还管用,就得过且过,懒得改变了。 |
|