-
-
[原创]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;
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!