这个DLL为什么有错误?

rongewu2006 2009-05-31 10:42:30
// Hook1.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "Hook1.h"
//#include "HookApp.h"

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}


LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
LRESULT RetVal= CallNextHookEx(hhk,nCode,wParam,lParam);
return RetVal;
}

// 添加鼠标钩子的安装和卸载函数:
BOOL InstallHook()
{

hhk=::SetWindowsHookEx(WH_MOUSE,MouseProc,hinst,0);

// ….
return true;
}

void UninstallHook()
{
::UnhookWindowsHookEx(hhk);
}

// 再实例化中获得一些参数
BOOL CHookApp::InitInstance() //CHookApp::
{
// 获得dll 实例,进程句柄
hinst=::AfxGetInstanceHandle();
DWORD dwPid=::GetCurrentProcessId();
hProcess=OpenProcess(PROCESS_ALL_ACCESS,0,dwPid);
//调用注射函数
Inject();
return CWinApp::InitInstance();
}

// 好,最重要的注射函数:
void Inject()
{
if (m_bInjected==false)
{ //保证只调用1次
m_bInjected=true;

//获取add.dll中的add()函数
HMODULE hmod=::LoadLibrary("add.dll");
add=(AddProc)::GetProcAddress(hmod,"add");
pfadd=(FARPROC)add;

if (pfadd==NULL)
{
AfxMessageBox("cannot locate add()");
}

// 将add()中的入口代码保存入OldCode[]
_asm
{
lea edi,OldCode
mov esi,pfadd
cld
movsd
movsb
}

NewCode[0]=0xe9;//实际上0xe9就相当于jmp指令
//获取Myadd()的相对地址
_asm
{
lea eax,Myadd
mov ebx,pfadd
sub eax,ebx
sub eax,5
mov dword ptr [NewCode+1],eax
}
//填充完毕,现在NewCode[]里的指令相当于Jmp Myadd
HookOn(); //可以开启钩子了
}
}

// 开启钩子的函数
void HookOn()
{
ASSERT(hProcess!=NULL);

DWORD dwTemp=0;
DWORD dwOldProtect;

//将内存保护模式改为可写,老模式保存入dwOldProtect
VirtualProtectEx(hProcess,pfadd,5,PAGE_READWRITE,&dwOldProtect);
//将所属进程中add()的前5个字节改为Jmp Myadd
WriteProcessMemory(hProcess,pfadd,NewCode,5,0);
//将内存保护模式改回为dwOldProtect
VirtualProtectEx(hProcess,pfadd,5,dwOldProtect,&dwTemp);

bHook=true;
}

// 关闭钩子的函数
void HookOff()//将所属进程中add()的入口代码恢复
{
ASSERT(hProcess!=NULL);

DWORD dwTemp=0;
DWORD dwOldProtect;

VirtualProtectEx(hProcess,pfadd,5,PAGE_READWRITE,&dwOldProtect);
WriteProcessMemory(hProcess,pfadd,OldCode,5,0);
VirtualProtectEx(hProcess,pfadd,5,dwOldProtect,&dwTemp);
bHook=false;
}

// 然后,写我们自己的Myadd()函数
int WINAPI Myadd(int a,int b)
{
//截获了对add()的调用,我们给a,b都加1
a=a+1;
b=b+1;

HookOff();//关掉Myadd()钩子防止死循环

int ret;
ret=add(a,b);

HookOn();//开启Myadd()钩子

return ret;
}

我在网上抄的鼠标钩子DLL,但为什么会有错误。
错误提示
error C2065: 'hhk' : undeclared identifier
error C2065: 'hinst' : undeclared identifier
error C2653: 'CHookApp' : is not a class or namespace name
等等等。。。

我又在Hook1.h文件里面添加了
HHOOK hhk;
HINSTANCE hinst;
但还是有下面一些错误 等等。。。
error C2653: 'CHookApp' : is not a class or namespace name
error C2039: 'AfxGetInstanceHandle' : is not a member of '`global namespace''
error C2065: 'AfxGetInstanceHandle' : undeclared identifier
error C2440: '=' : cannot convert from 'int' to 'struct HINSTANCE__ *'
麻烦哪位先知帮我解决一下啊???
...全文
197 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunrl1985 2009-06-02
  • 打赏
  • 举报
回复
这段汇编代码明显是用来HOOK API做跳转用的
sunrl1985 2009-06-02
  • 打赏
  • 举报
回复
这段汇编代码明显是用来HOOK API做跳转用的
sunrl1985 2009-06-02
  • 打赏
  • 举报
回复
这段汇编代码明显是用来HOOK API做跳转用的
sunlin7 2009-06-01
  • 打赏
  • 举报
回复
汇编不是一句两句就可以懂的,有人学了整个学期都还不懂呢。

_asm
{
lea edi,OldCode
mov esi,pfadd
cld
movsd ; 移动DWORD一次,前面三句都是为了这句准备的,
movsb ; 移动BYTE一次
}

NewCode[0]=0xe9;// 0xe9是jmp xxxx的首字节,为什么用0xE9, 请发邮件询问intel@intel.com
_asm
{
lea eax,Myadd
mov ebx,pfadd
sub eax,ebx ;计算代码偏移
sub eax,5 ; 加上本代码(jmp xxxx) 长度
mov dword ptr [NewCode+1],eax
}
rongewu2006 2009-06-01
  • 打赏
  • 举报
回复
谢谢上面的朋友
问题解决了。
但只是现在搞不明白的就是这些汇编代码:
_asm
{
lea edi,OldCode
mov esi,pfadd
cld
movsd
movsb
}
NewCode[0]=0xe9;//实际上0xe9就相当于jmp指令
//获取Myadd()的相对地址
_asm
{
lea eax,Myadd
mov ebx,pfadd
sub eax,ebx
sub eax,5
mov dword ptr [NewCode+1],eax
}
pfadd是另一个Dll文件里add函数的地址
Myadd是该工程的一个函数地址
搞不懂为什么还有 sub eax,5 这句,多减了一个5
还有NewCode[0]为什么要等于0xe9,而不是其他的?
LiuYinChina 2009-05-31
  • 打赏
  • 举报
回复
同意楼上,
zzultc 2009-05-31
  • 打赏
  • 举报
回复
错误提示已经很明显了,如果你连那个也看不懂,建议先补课!
因为,你的这段代码,知识含量很高,或者说,需要很多知识才能理解。而这些错误,却很基础,有的甚至是很基本的东西。
一两句话,谁也说不清楚。
LiuYinChina 2009-05-31
  • 打赏
  • 举报
回复
Detours
oyljerry 2009-05-31
  • 打赏
  • 举报
回复
用到了CHookApp,你要建立MFC 的DLL工程等
oyljerry 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 rongewu2006 的回复:]
我现在建了一个MFC的Dll,有了一个类,所以错误少了很多,我又自己在.h文件里声明了一些变量也少了好多错误
但是那个打开进程那个就弄不明白了如:hProcess=OpenProcess(PROCESS_ALL_ACCESS,0,dwPid);
它打开的是哪个进程啊,还有hProcess怎么声明啊。我对进程编程知道的少。

还有几个变量也不明白如:bHook。这个好像是布尔型的 我不知道它在哪里用到了。如果自己声明一个bHook会有用吗?
[/Quote]

DWORD dwPid=::GetCurrentProcessId();
hProcess=OpenProcess(PROCESS_ALL_ACCESS,0,dwPid);

这里传了一个参数dwPid,通过这个进程ID,打开对应的进程,也就是当前进程

可以自己定一个bool bHook;
rongewu2006 2009-05-31
  • 打赏
  • 举报
回复
我现在建了一个MFC的Dll,有了一个类,所以错误少了很多,我又自己在.h文件里声明了一些变量也少了好多错误
但是那个打开进程那个就弄不明白了如:hProcess=OpenProcess(PROCESS_ALL_ACCESS,0,dwPid);
它打开的是哪个进程啊,还有hProcess怎么声明啊。我对进程编程知道的少。

还有几个变量也不明白如:bHook。这个好像是布尔型的 我不知道它在哪里用到了。如果自己声明一个bHook会有用吗?
wangcom 2009-05-31
  • 打赏
  • 举报
回复
你把CHookApp这个类引进去
可能你的错误就要少很多

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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