核心编程上一个关于API拦截的例子,出了点问题,求解

sjjwind 2012-05-20 03:34:12
首先上代码

#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <cstdlib>
#include <Dbghelp.h>
#pragma comment(lib,"Dbghelp.lib")

using namespace std;

VOID ReplaceATEntryInOneMod(LPSTR pszCalleeModName,PROC pfnCurrent,PROC pfnNew,HMODULE hModCaller)
{
ULONG ulSize;
PIMAGE_IMPORT_DESCRIPTOR pImportDesc = NULL;
__try
{
pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToDataEx(hModCaller,TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT,&ulSize);
}
__finally
{
}
if(pImportDesc == NULL)
{
return ;
}
for(; pImportDesc->Name ; pImportDesc++ )
{
PSTR pszModName = (PSTR)((PBYTE)hModCaller + pImportDesc->Name);
if(lstrcmpiA(pszModName,pszCalleeModName) == 0)
{
PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)((PBYTE)hModCaller + pImportDesc->FirstThunk);
for(; pThunk->u1.Function ; pThunk ++ )
{
PROC* ppfn = (PROC*)&pThunk->u1.Function;
BOOL bFound = (*ppfn == pfnCurrent);
if(bFound)
{
if(!WriteProcessMemory(GetCurrentProcess(),ppfn,&pfnNew,sizeof(pfnNew),NULL) && (ERROR_NOACCESS == GetLastError()))
{
DWORD dwOldProter;
if(!VirtualProtect(ppfn,sizeof(pfnNew),PAGE_WRITECOPY,&dwOldProter))
{
WriteProcessMemory(GetCurrentProcess(),ppfn,&pfnNew,sizeof(pfnNew),NULL);
VirtualProtect(ppfn,sizeof(pfnNew),dwOldProter,&dwOldProter);
}
}
return ;
}
}
}
}
}

int MyMessageBox(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType)
{
MessageBeep(0);
return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
PROC pfnOrig = GetProcAddress(GetModuleHandle(_T("User32")),"MessageBoxA");
cout << GetLastError() << endl;
HMODULE hModCaller = GetModuleHandle(_T("Test.exe"));
ReplaceATEntryInOneMod("user32.dll",pfnOrig,(PROC)MyMessageBox,hModCaller);
system("pause");
return 0;
}



代码问题出现在了GetModuleHandle(_T("Test.exe"));上,GetLastError一直返回的是找不到指定的模块,我以前也没有在里面用过exe的,Test.exe也是放在当前目录下的,求指点这个问题怎么解决,感激不尽。
...全文
121 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sjjwind 2012-05-22
  • 打赏
  • 举报
回复
的确是GetDoduleHandle的问题,不能传非本进程的,所以错误,谢谢各位。
nanjun520 2012-05-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

会不会是这个问题?
前提是:只有欲获取的模块已映射到调用该函数的进程内,才会正确得到模块句柄。常用模块映射函数:LoadLibrary(..)。
参见 百度百科 。http://baike.baidu.com/view/1286954.htm
[/Quote]


所有 要不你就把你的 dll注入到你的目标进程中去。
sumos 2012-05-20
  • 打赏
  • 举报
回复
会不会是这个问题?
前提是:只有欲获取的模块已映射到调用该函数的进程内,才会正确得到模块句柄。常用模块映射函数:LoadLibrary(..)。
参见 百度百科 。http://baike.baidu.com/view/1286954.htm
sjjwind 2012-05-20
  • 打赏
  • 举报
回复
自己顶一下,求指点
sjjwind 2012-05-20
  • 打赏
  • 举报
回复
非常感谢
jackyjkchen 2012-05-20
  • 打赏
  • 举报
回复
那就不知道了
sjjwind 2012-05-20
  • 打赏
  • 举报
回复
HMODULE hModCaller = GetModuleHandle(_T("C:\\Test.exe"));
这个应该不会错,我这么写的。
jackyjkchen 2012-05-20
  • 打赏
  • 举报
回复
那你确定字符串里路径没写错,比如C:\应该写成C:\\或C:/才行?
sjjwind 2012-05-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
调试模式下的工作目录不是exe所在目录,而是工程目录,你在工程选项里调一下,调试这一栏,把工作目录改成test.exe的目录就行了
[/Quote]
不行啊,我把exe放到了C盘,然后用了绝对路径还是提示找不到指定模块。
jackyjkchen 2012-05-20
  • 打赏
  • 举报
回复
调试模式下的工作目录不是exe所在目录,而是工程目录,你在工程选项里调一下,调试这一栏,把工作目录改成test.exe的目录就行了

64,641

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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