鱼C论坛

 找回密码
 立即注册
查看: 11220|回复: 7

求助windows使用VirtualAlloc申请内存失败的原因

[复制链接]
发表于 2017-1-6 18:53:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
操作系统:Win10 64位
测试程序:Winows 32位程序


第一段代码:这是我申请一段内存,直接从ntdll.dll的ImageBase处申请空间,加载ntdll.dll到内存中
        code = (unsigned char *)VirtualAlloc((LPVOID)(ntdllHeader->OptionalHeader.ImageBase),
                        old_header->OptionalHeader.SizeOfImage,
                        MEM_RESERVE,
                PAGE_READWRITE);

第二段代码:因为ntdll.dll的Imagebase可能已经被占用,无法再度申请该内存地址的空间,所以使用如下代码,让系统分配位置,加载ntdll.dll到内存中
code = (unsigned char *)VirtualAlloc(NULL, old_header->OptionalHeader.SizeOfImage, MEM_RESERVE, PAGE_READWRITE);

现在出现的问题有:
1.只有按照ntdll的imagebase位置,加载到内存中的ntdll.dll才是正确的
2.执行第二段代码,让系统分配配置的话,会出现两种情况,一个GetlastError返回487,一个是GetLastError返回0,但是再调用ntdll里的函数时,GetLastError依然返回487;两种情况都会到值程序崩溃
3.我曾经把第二段代码的第一个参数改为0x7de70000,这个是win7加载ntdll.dll的地址,虽然getlasterror没错,但是调用它的内部函数ZWQueryInformationProcess时,程序崩溃


我想求助各位大神,这个VirtualAlloc是我哪里用错了么?还是操作系统上有什么特殊情况?还请给位大神解惑,小弟万分感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-1-7 17:57:42 | 显示全部楼层
好像VirtualAlloc没有用错(看第一眼觉得没错)
还有就是你究竟要干什么,加载ntdll到进程的地址空间?系统已经帮你加载好了,还想再来一次的话用LoadLibrary就行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-9 10:19:46 | 显示全部楼层
本帖最后由 FlyCode 于 2017-1-9 15:45 编辑
无符号整形 发表于 2017-1-7 17:57
好像VirtualAlloc没有用错(看第一眼觉得没错)
还有就是你究竟要干什么,加载ntdll到进程的地址空间?系 ...


这是壳里的代码,用来模拟操作系统的运行,我需要自己加载ntdll.dll,最终在里面结合一些反调试的操作。
我需要把ntdll从内存中载入到我的进程空间里来,求版主解惑

注:这段代码我再Win7 64位系统下运行没问题,但是在Win10 64位系统下就不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-11 11:04:12 | 显示全部楼层
无符号整形 发表于 2017-1-7 17:57
好像VirtualAlloc没有用错(看第一眼觉得没错)
还有就是你究竟要干什么,加载ntdll到进程的地址空间?系 ...

大神,在否,能否出来指点一下,到底Win10 上什么原因导致的这种结果发生啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-11 12:10:25 | 显示全部楼层
FlyCode 发表于 2017-1-11 11:04
大神,在否,能否出来指点一下,到底Win10 上什么原因导致的这种结果发生啊

这个嘛,我也不太清楚,win10加多了很多其他的函数
我以前的自己做的一个调试器在win10上也有点问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-11 12:29:09 | 显示全部楼层
无符号整形 发表于 2017-1-11 12:10
这个嘛,我也不太清楚,win10加多了很多其他的函数
我以前的自己做的一个调试器在win10上也有点问题

好吧,如果您需要源码的话,想研究的话,我可以贴出来,我这边也研究了好久,一直无果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-17 21:56:04 | 显示全部楼层
VirtualAlloc用的是对的,第一个参数传NULL,只是ntdll加载后要修复偏移,重定位之类的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-28 14:28:48 | 显示全部楼层
flac 发表于 2017-3-17 21:56
VirtualAlloc用的是对的,第一个参数传NULL,只是ntdll加载后要修复偏移,重定位之类的

哦?您的意思说,在Win10系统上,这个dll需要重新进行修复偏移?可是为什么win7不需要呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 02:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表