首页
社区
课程
招聘
[原创]Win7下的GetProcAddress
发表于: 2011-4-21 22:53 22444

[原创]Win7下的GetProcAddress

2011-4-21 22:53
22444

最近在WIN7下跑原来写的一个壳。发现自己写的GetProcAddress出错。分析了ntdll里的LdrGetProcedureAddress函数。查了一些资料发现。Win7引入了ApiSetMap的机制。它把一些系统低级别的一些API分为几个类型并且把kernel32.dll与advapi32.dll的一部分函数放到kernelbase.dll里。而归类的API名由api-ms-xxx字符串的dll库引入。这些DLL在系统上并不存在而只是一个索引类似的东西存在于引出表中。起一个重定向的问题。
在每一个进程的PEB+0x38偏移处就是ApiSetMap字段了。翻阅了一些文档,这个东西是存在于ApiSetMap.dll中的.apimap节中而此节是在WIN7启动时在启动1阶段被加载到系统空间,而0x38是这个的用户空间映射(这些我没有去验证,有时间的朋友可以自行去验证一下)。这个结构是这样的。

// ApiSetMap结构
typedef struct _API_SET_MAP_HEADER {
 __dword dwVersionNumber;
 __dword dwNumberOfApiSetModules;
} API_SET_MAP_HEADER, *PAPI_SET_MAP_HEADER;
 
typedef struct _API_SET_MAP_ENTRY {
 __dword dwNameOfApiSetModuleRVA;
 __dword dwSizeOfName;
 __dword dwHostModulesRVA;
} API_SET_MAP_ENTRY, *PAPI_SET_MAP_ENTRY;
 
typedef struct _API_SET_MAP_HOST_HEADER {
 __dword dwNumberOfHosts;
} API_SET_MAP_HOST_HEADER, *PAPI_SET_MAP_HOST_HEADER;
 
typedef struct _API_SET_MAP_HOST_ENTRY {
 __dword dwNameOfImportModuleRVA;
 __dword dwSizeOfImportModuleName;
 __dword dwNameOfHostRVA;
 __dword dwSizeOfHostName;
} API_SET_MAP_HOST_ENTRY, *PAPI_SET_MAP_HOST_ENTRY;

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

收藏
免费 7
支持
分享
最新回复 (3)
雪    币: 112
活跃值: (48)
能力值: ( LV9,RANK:320 )
在线值:
发帖
回帖
粉丝
2
太邪恶了,,,不敢看,,不敢看 只能膜拜
2011-4-21 23:06
0
雪    币: 656
活跃值: (448)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
3
这么多代码...吓..
2011-4-21 23:19
0
雪    币: 367
活跃值: (20)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
4
强大,从壳的函数定位研究到了系统的API重定向.
对于壳获取模块基址,从kernel32.dll 到 kernelbase.dll的转变的问题,论坛上已经有一些帖子了.
2011-4-25 13:38
0
游客
登录 | 注册 方可回帖
返回
//