#include <windows.h>
#include <stdio.h>
#pragma comment(lib,"user32.lib")
BOOL SetHook(HMODULE);
typedef int(WINAPI* PFNMESSAGEBOX)(HWND,LPCSTR,LPCSTR,UINT uType); //在什么情况下,怎么用? 谢谢!
PROC g_orgProc = (PROC)MessageBoxA;
void main()
{
::MessageBox(NULL,"original function.", "testDemo",0);
SetHook(::GetModuleHandle(NULL));
::MessageBox(NULL, "original function.", "testDemo",0);
getchar();
}
int WINAPI MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
return ((PFNMESSAGEBOX)g_orgProc)(hWnd,"new function","testDemo",uType);
}
BOOL SetHook(HMODULE hMod)
{
IMAGE_DOS_HEADER* pDosHeader = (IMAGE_DOS_HEADER*)hMod;
IMAGE_OPTIONAL_HEADER * pOptHeader = (IMAGE_OPTIONAL_HEADER*)((BYTE*)hMod + pDosHeader->e_lfanew + 24);
IMAGE_IMPORT_DESCRIPTOR * pImportDesc = (IMAGE_IMPORT_DESCRIPTOR*)((BYTE*)hMod+pOptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
while ( pImportDesc->FirstThunk )
{
char* pszDllName = (char*)((BYTE*)hMod + pImportDesc->Name);
if ( lstrcmpiA(pszDllName,"user32.dll") == 0 )
{
break;
}
pImportDesc++;
}
if ( pImportDesc->FirstThunk )
{
IMAGE_THUNK_DATA* pThunk = (IMAGE_THUNK_DATA*)((BYTE*)hMod + pImportDesc->FirstThunk);
while ( pThunk->u1.Function )
{
DWORD* lpAddr = (DWORD*)&(pThunk->u1.Function);
if ( *lpAddr == (DWORD)g_orgProc )
{
DWORD* lpNewProc = (DWORD*)MyMessageBoxA;
::WriteProcessMemory(GetCurrentProcess(), lpAddr, &lpNewProc, sizeof(DWORD), NULL);
return TRUE;
}
pThunk++;
}
}
return FALSE;
}
typedef int(WINAPI* PFNMESSAGEBOX)(HWND,LPCSTR,LPCSTR,UINT uType);这是一个什么玩艺?
答案:3 悬赏:20
解决时间 2021-03-12 12:08
- 提问者网友:恋你成殇
- 2021-03-12 05:40
最佳答案
- 二级知识专家网友:我们只是兮以城空
- 2021-03-12 06:27
申明了一个函数指针,(HWND,LPCSTR,LPCSTR,UINT uType)是参数类型,前面部分是返回类型,PFNMESSAGEBOX是类型符号
可以这样使用:
PFNMESSAGEBOX pMsgBox=MyMessageBox;
pMsgBox(hWnd,"asdf","asdf",0);就相当与执行MyMessageBox(hWnd,"asdf","asdf",0);
指向的函数返回类型和参数相同
int WINAPI MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
return 0;
}
可以这样使用:
PFNMESSAGEBOX pMsgBox=MyMessageBox;
pMsgBox(hWnd,"asdf","asdf",0);就相当与执行MyMessageBox(hWnd,"asdf","asdf",0);
指向的函数返回类型和参数相同
int WINAPI MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
return 0;
}
全部回答
- 1楼网友:两不相欠
- 2021-03-12 08:51
typedef 是类型重定义的关键词
typedef int(WINAPI* PFNMESSAGEBOX ....
表示定义一个函数指针类型
- 2楼网友:随心随缘不随便
- 2021-03-12 07:47
声名函数指针
定义 PFNMESSAGEBOX是一个函数指针,指向
返回 int,类型是WINAPI,参数4个,HWND,LPCSTR,LPCSTR,UINT
用处就是指向函数地址...
可以详细百度一下函数指针..
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯
• 手机登qq时,显示手机磁盘不足,清理后重新登 |
• 刺客的套装怎么选啊? |