x64syscall 加载64位Dll底层执行64位命令易语言源码先浅讲一下这是怎么做到了吧。

首先必须明确概念:x64系统下不能直接运行x86进程!64位CPU下不是运行的x86汇编!
AMD64架构是在IA32指令集上进行了拓展,主要包括新增寄存器,地址阔度加长等等,CPU兼容x86指令的根本原因是在AMD64架构下原x86的硬编码可以完全对于IA32构架下的x86的汇编指令!
所以在现在的AMD64架构下的64位计算机兼容在x86程序时,根本没有运行任何x86汇编,而是继续在运行x64汇编的硬编码!(所以说什么x86程序相同指令运算效率不如x64程序的指令运算效率纯粹是鬼扯)
x86程序在64位系统上受到的限制主要是受到CS段寄存器影响,32位模式和64位模式的CS段寄存器相比,主要是关闭了强制平坦,启用了CPU x86指令解析和操作位数限制。
因此可以修改CS段寄存器实现指令解析模式的互相转换。
所以不要认为易语言程序在64位系统上还是x86程序,64位系统下不存在严格意义的x86程序,是Wow64子系统让你感觉不出来这个问题。
再说我拓展了了什么内容,新增加了获取x64的ntdll的基质和导出表的命令,顺便封装了一下LdrLoadDll和LdrGetProcedureAddress,这样程序就可以实现随意加载x64Dll,然后只需加载kernelbase.dll(x64)和kernel32.dll,即可正常调用大部分的x64API。

注意:不要想着去加载x64版本的user32.dll,跑不起来,绘制层的依赖过于复杂(不过有水平可以搞搞64位的win32u.dll,那个随便玩)

测试了一下,确实能正常跑一些x64的库,具体更多内容自己去研究吧,这份代码的还是有很多内容可以拓展的。

多提一句:切换到x64时为什么要保存fs寄存器?因为段寄存器不是你想象的那么简单,在AMD处理器上,syscall之后,段描述符会被放在CPU缓存中,在回到正常R3的代码后,你以为CS段寄存器已经恢复到x86正常了,实际上CPU还在用缓存中的段描述符,根本没法正常执行代码,一执行就会导致内存错误,所以需要讲fs寄存器保存下来,到时候用fs寄存器来恢复正常的DS和CS段寄存器。(注意:有调试器附加根本不会发现这个问题,因为有调试器运行的情况下,段寄存器会随调试器行为刷新,根本发现不了问题)

代码中导出的x64的DebugActiveProcess就不用折腾了,用IDA看了NtDebugActiveProcess,这个命令被内核卡了,Wow64进程调试不了64位进程。

发表回复

后才能评论