首页
社区
课程
招聘
[求助][求助]Windows10 64位系统后去kernel32.dll内函数失败
发表于: 2016-8-5 17:56 9586

[求助][求助]Windows10 64位系统后去kernel32.dll内函数失败

2016-8-5 17:56
9586
写了一段获取kernel32.dll输出函数的代码,但是在Win10 64位系统下内存溢出,在Win7和Win8 64位系统下正常,不晓得哪里出了问题!求大神们指点...

HMODULE a;
int error;
error = GetLastError();

a = GetModuleHandle(L"kernel32.dll");
error = GetLastError();
PIMAGE_DOS_HEADER  pimDH = (PIMAGE_DOS_HEADER)a;
PIMAGE_NT_HEADERS  pimNH = (PIMAGE_NT_HEADERS)((char*)a+pimDH->e_lfanew);
PIMAGE_EXPORT_DIRECTORY pimED  =  (PIMAGE_EXPORT_DIRECTORY)
((DWORD)a+pimNH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);

DWORD pExportSize = pimNH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
DWORD NumFun = 0;
NumFun = pimED->NumberOfFunctions;

NumFun = pimED->NumberOfFunctions;在Win10 上内存溢出了...

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 230
活跃值: (101)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
2
问题原因大致已经搞清楚了!分一下几点说一下:
1.在Win1064位操作系统上这段代码会溢出的原因是pimED获取的这个地址是错误的,pimED得到的地址是实际地址的后8位
2.(DWROD)a,这是个错误的使用方式,它获得到的地址只有后八位,也就造成了错误的pimED地址的错误
3.有一点值得注意,我曾经试过直接使用ImageRVAToVA()这个函数去取输出表的地址,但是很可惜,结果也是错的,和实际结果差了0x1000,个人感觉这个绝不是巧合,但是原因不查,因为汇编不好,也就没继续追踪,如果有大神去研究,不妨把原因分享一下,嘿嘿!
4.之所以Win7 64位系统这段代码没问题是因为,Win7操作系统加载Kernel32的地址就是在后八位的地址中,而Win10 64位系统加载Kernel32的地址为0x00007ffaXXXX0000,已经超过DWROD的长度了
2016-8-8 16:12
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
在64位编程中使用64位类型来存储地址变量是基本的常识
2016-8-8 20:32
0
雪    币: 230
活跃值: (101)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
4
恩,但是还有两个问题没解决:
1.为何ImageRVAToVA()获取到的输出表地址比实际地址少了0x1000?
2.为何Win10 64位系统加载Kernel32.dll的地址跟Win7 64位系统加载Kernel32.dll的地址差别如此之大?居然还动用了前8位的地址段?
2016-8-9 10:23
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
WIN10内核改动得厉害,等补丁。
2016-8-12 19:57
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
6
ImageRVAtoVA 这个函数里的RVA是指文件偏移!!!!!!!!!!!!!!!
2016-8-17 06:07
0
游客
登录 | 注册 方可回帖
返回
//