用MFC写通过修改导入段的IAT来达到API拦截程序时,写了一个函数列举了所有导入函数的函数名。、
看代码:
HMODULE hModule=GetModuleHandle(NULL);
ULONG size;
PIMAGE_IMPORT_DESCRIPTOR pImport=(PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData
(hModule,true,IMAGE_DIRECTORY_ENTRY_IMPORT,&size);
CString name;
while(pImport->FirstThunk)
{
char *ModuleName=(char*)((BYTE*)hModule+pImport->Name);
name.Format("模块名为:%s\r\n ",ModuleName);
m_output+=name;
PIMAGE_THUNK_DATA pThunk=(PIMAGE_THUNK_DATA)((BYTE*)hModule+pImport->OriginalFirstThunk);
//char Func[150];
while(pThunk->u1.Function)
{
char*Func=(char*)((BYTE*)hModule+pThunk->u1.AddressOfData+2);
m_output+=Func;
m_output+="\r\n";
pThunk++;
}
pImport++;
}
UpdateData(false);
试了很多次都是在运行的时候,由于非法访问导致程序终止。而在使用控制台下输出地时候却没有任何问题。肯定是在输出函数名称的时候由于内存违规访问引起的。
后来使用PEdiy查看下,发现程序中有一个mfc100d.dll的dll。它内部的所有函数都是以序数的形式引用的。终于发现了错误的罪魁祸首。原来是我在输出导入函数名称时,没有判断该导入函数是否是按序数来引出的,只有当不是的话才能输出它的函数名称。由于在控制台下不需要此dll,当然不会引起错误。
改正过后程序运行正常:
HMODULE hModule=GetModuleHandle(NULL);
ULONG size;
PIMAGE_IMPORT_DESCRIPTOR pImport=(PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData
(hModule,true,IMAGE_DIRECTORY_ENTRY_IMPORT,&size);
CString name;
while(pImport->FirstThunk)
{
char *ModuleName=(char*)((BYTE*)hModule+pImport->Name);
name.Format("模块名为:%s\r\n ",ModuleName);
m_output+=name;
PIMAGE_THUNK_DATA pThunk=(PIMAGE_THUNK_DATA)((BYTE*)hModule+pImport->OriginalFirstThunk);
//char Func[150];
while(pThunk->u1.Function)
{
if(IMAGE_ORDINAL_FLAG32&(pThunk->u1.Ordinal))//判断最高位是否为1,是的话按序数引出。
{
WORD hint=(WORD)((BYTE*)hModule+pThunk->u1.AddressOfData);
CString len;
len.Format("hint为:%x\r\n ",hint);
m_output+=len;
}
else//按函数名引出。
{
char*Func=(char*)((BYTE*)hModule+pThunk->u1.AddressOfData+2);
m_output+=Func;
m_output+="\r\n";
}
pThunk++;
}
pImport++;
}
UpdateData(false);
这只是其中的一种方法。另外还可以在工程属性设置中,设置成使用静态链接MFC库。这样也会因为导入段中不存在此库,不会出现错误。
分享到:
相关推荐
MFC实现输出sin函数图象 MFC实现输出sin函数图象 MFC实现输出sin函数图象 MFC实现输出sin函数图象 MFC实现输出sin函数图象
用mfc实现的三角函数绘制,包括参数配置等,很详细
程序实现了在mfc下如何定义一个回调函数,如何使用回调函数,以及如何把类指针传递递给用户回调函数的例程。
基于MFC编写一个单文档程序,在客户区用图形来展现各种数学函数曲线。 具体要求: 1)可绘制常见的数学函数曲线,如三角函数、指数函数、幂函数等。 2)通过菜单选择不同的函数曲线类型,可以通过对话框指定该函数的...
mfc函数大全及函数用法 东西不错拿出来分享,O(∩_∩)O哈哈~
MFC的消息处理函数 解释了各个MFC消息的应用 解释详尽
MFCDLL回掉函数小例子,vs2008
MFC 利用对话框画函数曲线,经典,通过此法可以绘制各种函数曲线。
mfc中一个函数是如何调用的?
计算机图形学第二章课后题第三题,使用MFC中的SetPixel函数和MoveTo函数、LineTo函数绘制直线(根据坐标)
这是关于MFC 的API函数的介绍,对于MFC开发非常有帮助!
本文章是关于MFC对话框-DoDataExchange()函数使用。
MFC的API函数大全,一个文档几乎包含了所有的函数啦。word2007版本。
MFC经典教材+MFC函数库手册 学习MFC的好资料。并且附带了MFC所有的函数库手册。方便学习。
MFC中文帮助函数使用大全,详细介绍各函数的使用方法。
基于MFC写的数据库导入,导入过程采用多线程编写
利用VS建立MFC基于对话框的工程,其他默认。之后添加两个文本输入控件,两个按钮控件,并为文本控件建立两个Csting型的变量。打开文件名+Dlg.cpp。找到:OnPaint() 函数,在该函数最后的 }前添加实现代码。本资源以上...
MFC函数速查大全,MFC函数全集,函数总结全集
我想在MFC中也能把函数中的计算结果随时输出到文档的窗口本文档可以在任何函数中随意(顺序)输出到屏幕,可以在屏幕的任何位置然后时候输出文字,当然输出后如果被刷新就消失了,在MFC中也能把函数中的计算结果随时...