获取API函数入口处前后5字节数据,这在HOOK API时,经常用到,因为要了解API的入口特征嘛,这样才好对症下药。
//程序截图如下(后面附有源码下载地址,成品也在源码里面了)
---------------------------------------------------------------------------------------------------------------------------------------------------
主要代码如下:
void CGetApi5ByteDlg::GetApi5Byte(CString dllName,CString funcName)
{
CString s;
//加载dll文件
HINSTANCE hInst=LoadLibrary(dllName);
if(hInst==NULL)
{
s.Format(_T("加载dll文件:%s 失败,请确认文件是否存在!"),dllName);
m_List.InsertItem(m_List.GetItemCount(),s);
return;
}
//CString转为char *
//1.获取CString转为ASCII,所需的字节数
//2.根据得到的字节数分配内存空间和清零该空间
//3.开始将CString转为char *
int nLen=WideCharToMultiByte(CP_ACP,0,funcName,-1,NULL,0,NULL,0);
char *szApi=(char*)calloc(nLen,sizeof(char));
memset(szApi,0,nLen*sizeof(char));
WideCharToMultiByte(CP_ACP,0,funcName,-1,szApi,nLen,NULL,0);
//获取API函数地址
BYTE *pfApi=(BYTE *)::GetProcAddress(hInst,szApi);
if(pfApi==NULL)
{
s.Format(_T("获取API函数:%s 地址失败,GetLastError()=%d"),funcName,GetLastError());
m_List.InsertItem(m_List.GetItemCount(),s);
return;
}
//获取API入口前后5个字节数据
s.Format(_T("%s入口处5个字节为:%X %X %X %X %X 入口前5字节为:%X %X %X %X %X"),
funcName,
pfApi[0],pfApi[1],pfApi[2],pfApi[3],pfApi[4],
(pfApi-1)[0],(pfApi-2)[0],(pfApi-3)[0],(pfApi-4)[0],(pfApi-5)[0]);
m_List.InsertItem(m_List.GetItemCount(),s);
m_List.EnsureVisible(m_List.GetItemCount()-1,FALSE);//确保最后一项始终可见,即有滚动条时,滚动到底
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
源码和成品下载地址(在VS2010+WIN7+MFC测试通过):
获取API函数入口处前后5字节数据
http://download.csdn.net/detail/friendan/6397079
----------------------------------------------------------------------------------------------------------------------------
您的十分满意是我追求的宗旨。
您的一点建议是我后续的动力。