|
分享源码
界面截图: |
|
是否带模块: |
纯源码 |
备注说明: |
- |
前文:
正文:
-
先浅讲一下这是怎么做到了吧。
- 首先必须明确概念: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位进程。
附件:
x64syscall.e
(67.73 KB, 下载次数: 316)
|
评分
-
查看全部评分
本帖被以下淘专辑推荐:
- · 精易精录【好源码】|主题: 1116, 订阅: 479
- · 鱼木|主题: 1562, 订阅: 152
- · 好帖|主题: 1239, 订阅: 44
- · 好贴精选|主题: 469, 订阅: 21
- · 实用~~|主题: 95, 订阅: 2
|