如何从PIMAGE_IMPORT_DESCRIPTOR节,得到某个API函数(导入函数)代码地址
2008-04-24 00:02
357 查看
//功能:得到某个API函数(导入函数)代码地址
//参数:
//pImport: PIMAGE_IMPORT_DESCRIPTOR
//pProcName: 函数名或序号
const FARPROC GetFunctionFARPROC(
PIMAGE_IMPORT_DESCRIPTOR pImport, LPCSTR pProcName)
{
PIMAGE_THUNK_DATA pThunk;
pThunk = (PIMAGE_THUNK_DATA) RVA2Ptr(pImport->
OriginalFirstThunk);
for (int i=0; pThunk->u1.Function; i++)
{
bool match;
if ( pThunk->u1.Ordinal & 0x80000000 ) // by ordinal
match = (pThunk->u1.Ordinal & 0xFFFF) ==
((DWORD) pProcName);
else
match = stricmp(pProcName, RVA2Ptr((unsigned)
pThunk->u1.AddressOfData)+2) == 0;
if ( match )
return (FARPROC)*((unsigned *) RVA2Ptr(pImport->FirstThunk)+i);
//pImport->FirstThunk:
//该字段是指向一32位以00结束的RVA偏移地址串,此地址串中每个地址描述一个输入函数(函数在内存中的地址的地址),
//它在输入表中的顺序是可变的。
pThunk ++;
}
return NULL;
}
//参数:
//pImport: PIMAGE_IMPORT_DESCRIPTOR
//pProcName: 函数名或序号
const FARPROC GetFunctionFARPROC(
PIMAGE_IMPORT_DESCRIPTOR pImport, LPCSTR pProcName)
{
PIMAGE_THUNK_DATA pThunk;
pThunk = (PIMAGE_THUNK_DATA) RVA2Ptr(pImport->
OriginalFirstThunk);
for (int i=0; pThunk->u1.Function; i++)
{
bool match;
if ( pThunk->u1.Ordinal & 0x80000000 ) // by ordinal
match = (pThunk->u1.Ordinal & 0xFFFF) ==
((DWORD) pProcName);
else
match = stricmp(pProcName, RVA2Ptr((unsigned)
pThunk->u1.AddressOfData)+2) == 0;
if ( match )
return (FARPROC)*((unsigned *) RVA2Ptr(pImport->FirstThunk)+i);
//pImport->FirstThunk:
//该字段是指向一32位以00结束的RVA偏移地址串,此地址串中每个地址描述一个输入函数(函数在内存中的地址的地址),
//它在输入表中的顺序是可变的。
pThunk ++;
}
return NULL;
}
相关文章推荐
- 如何从PIMAGE_EXPORT_DIRECTORY节,得到某个API函数代码地址
- 用GetprocAddress得到地址后该如何调用这个函数
- unhook——如何得到原始派遣函数的地址
- x86代码移植到x64下,如何访问虚表和虚函数指针,使用地址调用虚函数
- 如何获取C++类成员虚函数地址的示例代码
- 导入函数: import和from...import...的区别
- 如何写优雅的代码(3)——合理选择函数形参
- 如何"引用"传递参数从一个函数中得到多个返回值
- C# 里怎样得到当前执行的函数名,当前代码行,源代码文件名
- PHP URL地址获取函数代码(端口等) 推荐
- 提高代码质量:如何编写函数
- 如何编写函数才能提高代码质量
- 得到子类反射泛型,以及如何通过注解注入对象(仅供参考,未写实例代码)
- [导入]得到固定字符位置的函数
- 【小技巧】如何得到一个网页的所有a标记 herf 链接代码
- C如何使用固定地址来访问函数
- 得到地址栏地址和简单的截取有效数据示例代码
- C#编码简单性之函数篇(如何编写简短的C#代码,随时更新)
- 如何在eclipse中使用pydev插件导入和测试已有代码
- 如何将一个数组的地址作为函数的返回值!