关于PE结构!Eat导出表,求大神指点下

人情恶飞 2014-09-15 04:40:06


第一张图:用CE OD 等工具 定位很准,属于NtDll.dll 的导出表

对应函数:_itoa_s





第二张图:自己写的Eat 遍历

发现很多像_itoa_s函数一样的,定位不准,找了一天相关的资料,都看了写的没错,但是还这样!

下方 源代码




PIMAGE_DOS_HEADER Pdos = (PIMAGE_DOS_HEADER)GetModuleHandle("ntdll.dll");//获得模块句柄
//错误返回

PIMAGE_NT_HEADERS Pnt = (PIMAGE_NT_HEADERS)((int)Pdos->e_lfanew + (int)Pdos);

IMAGE_OPTIONAL_HEADER32 Popt = Pnt->OptionalHeader;

IMAGE_EXPORT_DIRECTORY * Export;
Export = (IMAGE_EXPORT_DIRECTORY*)(Popt.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress + (ULONG_PTR)Pdos);
//关于索引
/*IMAGE_DIRECTORY_ENTRY_EXPORT
导出表
IMAGE_DIRECTORY_ENTRY_IMPORT
导入表
IMAGE_DIRECTORY_ENTRY_RESOURCE
资源
IMAGE_DIRECTORY_ENTRY_EXCEPTION
异常(具体资料不详)
IMAGE_DIRECTORY_ENTRY_SECURITY
安全(具体资料不详)
IMAGE_DIRECTORY_ENTRY_BASERELOC
重定位表
IMAGE_DIRECTORY_ENTRY_DEBUG
调试信息
IMAGE_DIRECTORY_ENTRY_ARCHITECTURE
版权信息
IMAGE_DIRECTORY_ENTRY_GLOBALPTR
具体资料不详
IMAGE_DIRECTORY_ENTRY_TLS
Thread Local Storage
IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG
具体资料不详
IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT
具体资料不详
IMAGE_DIRECTORY_ENTRY_IAT
导入函数地址表
IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT
具体资料不详
IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR
具体资料不详*/

DWORD * AllAddress;
DWORD * AllName;
USHORT * AllOrg;

AllAddress = (DWORD*)((int)Export->AddressOfFunctions + (int)Pdos);//函数地址数组
AllName = (DWORD*)((int)Export->AddressOfNames + (int)Pdos);//函数名称数组
AllOrg = (USHORT *)((int)Export->AddressOfNameOrdinals + (int)Pdos);//序号数组

//////////////////////////////////////////////////////////////////////////
int OneAddress;
char * OneName;
USHORT OneOrg;
char * Buf = new char[500];
int ListId = NULL;

for (int i = 0; i < (int)Export->NumberOfNames; i++){

OneName = (char*)((BYTE*)Pdos + AllName[i]);
OneOrg = (USHORT)AllOrg[i];
OneAddress = (int)((int)Pdos + AllAddress[OneOrg]);

if (NULL == _stricmp(OneName, "_itoa_s")){
ZeroMemory(Buf, 500 * sizeof(char));
wsprintfA(Buf, "_itoa_s -> 0x%08X | %d | %d\n\0", OneAddress, OneOrg, AllAddress[OneOrg]);
OutputDebugStringA(Buf);
}
}
delete Buf;
}













...全文
330 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-09-16
  • 打赏
  • 举报
回复
《Windows PE权威指南》
人情恶飞 2014-09-15
  • 打赏
  • 举报
回复
引用 1 楼 xiaohuh421 的回复:
多半是你自己计算错误 AllAddress = (DWORD*)((int)Export->AddressOfFunctions + (int)Pdos); OneAddress = (int)((int)Pdos + AllAddress[OneOrg]); 你确定这样计算没错?
刚刚 发现一个问题,就是 OD 定位后 已经不属于 NtDll.dll 文件了,已经跑到别的地方了 CE 定位最准确 而自己写的这个 起事实上定位也不算全错, 只不过他定位的不是_itoa_s 而是itoa_s
人情恶飞 2014-09-15
  • 打赏
  • 举报
回复
引用 1 楼 xiaohuh421 的回复:
多半是你自己计算错误 AllAddress = (DWORD*)((int)Export->AddressOfFunctions + (int)Pdos); OneAddress = (int)((int)Pdos + AllAddress[OneOrg]); 你确定这样计算没错?
开始 我也认为 我写错了,但是 对比了一下 只有少部分 不准确 大部分还是很准的 如果说 计算错误的话,至少要差不多全错吧 ? 或者说 有一些数据需要特殊的计算方式?
xiaohuh421 2014-09-15
  • 打赏
  • 举报
回复
多半是你自己计算错误 AllAddress = (DWORD*)((int)Export->AddressOfFunctions + (int)Pdos); OneAddress = (int)((int)Pdos + AllAddress[OneOrg]); 你确定这样计算没错?

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧