在 pe 系统里装完系统系统不运行系统是装在移动硬盘里的请专家指点迷津
系统要装在本地硬盘,而且需要配置下 bcd 引导。
将演示程序加载入十六进制编辑工具,选择一个空白区段,我这里选的是第一个区块和第二个区块之间的空白区段
我们若想插入MessageBox函数必须用PUSH指令先传递所需参数,CALL指令调用,JMP指令再回到原本程序正常执行处,即AddrressOfEntryPoint处。
查阅WIN32API 可知MessageBox的四个参数都可为0
CALL 指令调用,因此我们需要计算下CALL指令的步长,有两种方法
步长=要跳转的目的地址-当前指令地址-指令长度
步长=要跳转的目的地址-当前指令的下一条指令地址
我们采用第一个公式
在上面我们已经得到了MessageBoxW的地址即要跳转的目的地址为76AB1E50
当前指令的地址即CALL指令E8的地址为40A8
但要注意的是76AB1E50为VA即虚拟地址,40A8为文件偏移地址Fileoffset,因此需要将40A8转化为虚拟地址。
这里可以手算,因为插入硬编码的地址在区块中,所以计算公式为
VA=Fileoffset-ImageBase-(所在区块.VirtualAddress-所在区块.PointerToRawData)
也可以借助带有地址转换工具的PE结构查看器,如LordPE,我这里用我自己写的PE结构查看工具,感兴趣的话可以移步至【逆向工程】QT编写PE结构分析工具
查看到其VA地址为1004AA8
E8 00 00 00 00指令长度为五字节
则步长=76AB1E50-1004AA8-5=75AA D3A3
因为PE文件是小端存储所以 应该插入A3 D3 AA 75
我们调用完MessageBoxW后还需要让程序正常执行,因此还要JMP指令跳转到程序入口处,通过PE查询工具可以看到程序入口,这里还是使用我自己编写的PE结构查询工具查看。
则JMP指令步长=1003E21-1004AAD-5=FFFF F36F
同样的小端存储格式 E9 6D F3 FF FF