易语言资源网 - 做最全的易语言资源下载社区
精易论坛授权登录

【半教程类】加载64位Dll,底层执行64位命令   [复制链接]

    2023-01-16 08:53:12
    模块控件源码
    易语言资源网
    2378 次浏览
    来源链接


前文:

正文:

  • 先浅讲一下这是怎么做到了吧。

    • 首先必须明确概念: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位进程。



点我下载 (已有 118 次下载)

引用模块





引用支持库


源码文件名 支持库文件名 支持库标识
x64syscall.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0


[错误报告]   上一篇:任务栏半透明/全透效果...     下一篇:封装微软线程池,队列计时器...