挡截API的问题?

原理:远程注入DLL,通过替换目标进程的API函数地址挡截目标进程的API函数(MessageBoxA)调用。测试发现:若目标进程调用CWnd:MessageBox无法被... 原理:远程注入DLL,通过替换目标进程的API函数地址挡截目标进程的API函数(MessageBoxA)调用。测试发现:若目标进程调用CWnd:MessageBox无法被挡截(::MessageBox才可以被挡截)?why??????
详细请看这里:
http://hi.baidu.com/ysees/blog/item/80cd5d45adc7c63786947342.html
展开
 我来答
269125251jiahu
2009-03-07
知道答主
回答量:16
采纳率:0%
帮助的人:0
展开全部
挡截sock技术和挡截api技术
不知道这些原理可不可以教给玩家?不可以你们早说啊..别搞人来抓我
鼠标移动原理
模拟鼠标动作api函数mouse_event,它可以实现模拟鼠标按下和放开等动作。

void mouse_event(
dword dwflags, // 鼠标动作标识。
dword dx, // 鼠标水平方向位置。
dword dy, // 鼠标垂直方向位置。
dword dwdata, // 鼠标轮子转动的数量。
dword dwextrainfo // 一个关联鼠标动作辅加信息。
);

其中,dwflags表示了各种各样的鼠标动作和点击活动,它的常用取值如下:

mouseeventf_move 表示模拟鼠标移动事件。

mouseeventf_leftdown 表示模拟按下鼠标左键。

mouseeventf_leftup 表示模拟放开鼠标左键。

mouseeventf_rightdown 表示模拟按下鼠标右键。

mouseeventf_rightup 表示模拟放开鼠标右键。

mouseeventf_middledown 表示模拟按下鼠标中键。

mouseeventf_middleup 表示模拟放开鼠标中键。

(2)、设置和获取当前鼠标位置的api函数。获取当前鼠标位置使用getcursorpos()
函数,设置当前鼠标位置使用

setcursorpos()函数。

bool getcursorpos(
lppoint lppoint // 返回鼠标的当前位置。
);
bool setcursorpos(
int x, // 鼠标的水平方向位置。
int y //鼠标的垂直方向位置。
);

通常游戏角色的行走都是通过鼠标移动至目的地,然后按一下鼠标的按钮就搞定
了。**我们使用上面介绍的api

函数来模拟角色行走过程。

cpoint oldpoint,newpoint;
getcursorpos(&oldpoint); //保存当前鼠标位置。
newpoint.x = oldpoint.x+40;
newpoint.y = oldpoint.y+10;
setcursorpos(newpoint.x,newpoint.y); //设置目的地位置。
mouse_event(mouseeventf_rightdown,0,0,0,0);//模拟按下鼠标右键。
mouse_event(mouseeventf_rightup,0,0,0,0);//模拟放开鼠标右键。

键盘原理
一系列api函数来完成对键盘动作的模拟。

模拟键盘动作api函数keydb_event,它可以模拟对键盘上的某个或某些键进行按下
或放开的动作。

void keybd_event(
byte bvk, // 虚拟键值。
byte bscan, // 硬件扫描码。
dword dwflags, // 动作标识。
dword dwextrainfo // 与键盘动作关联的辅加信息。
);

其中,bvk表示虚拟键值,其实它是一个byte类型值的宏,其取值范围为1-254。有
关虚拟键值表请在msdn上使用

关键字“virtual-key codes”查找相关资料。bscan表示当键盘上某键被按下和放开
时,键盘**硬件产生的扫描码

,我们可以mapvirtualkey()函数在虚拟键值与扫描码之间进行转换。dwflags表示各种
各样的键盘动作,它有两种取

值:keyeventf_extendedkey和keyeventf_keyup。

**我们使用一段代码实现在游戏中按下shift+r快捷键对攻击对象进行攻击。

keybd_event(vk_control,mapvirtualkey(vk_control,0),0,0); //按下ctrl
键。
keybd_event(0x52,mapvirtualkey(0x52,0),0,0);//键下r键。
keybd_event(0x52,mapvirtualkey(0x52,0), keyeventf_keyup,0);//放开r键。
keybd_event(vk_control,mapvirtualkey(vk_control,0),
keyeventf_keyup,0);//放开ctrl键。
VSH艾羽
2024-10-27 广告
CATIA是法国达索公司推出的一款综合性CAD/CAM/CAE软件,广泛应用于机械设计、航空航天、汽车工业等领域。它具备强大的三维建模能力,支持基于实体、曲面和网格的建模。同时,CATIA也支持大型装配体的设计和管理,提供装配约束、碰撞检测... 点击进入详情页
本回答由VSH艾羽提供
天下有敌的店铺
2009-03-08 · TA获得超过504个赞
知道小有建树答主
回答量:223
采纳率:0%
帮助的人:293万
展开全部
我来解释一下,这种现象是正常的

你的hook是导入表hook

说白了只能hook到程序静态引入的函数

如果你在程序中使用::MessageBox则最终程序中确实引入了user32.dll中的MessageBoxA函数,这样可以hook到

如果你用CWnd::MessageBox来调用就不行了

或许你也知道CWnd::MessageBox最终也是调用了::MessageBox

但是你的程序没有直接导入::MessageBox

因为CWnd::MessageBox也是一个导出函数,具体名字大约是msvc60.dll之类的

是一个MFC的支持库

因此你hook导入表的时候根本找不到::MessageBox的引入

而只能找到CWnd::MessageBox的引入(这个引入的名字很复杂,是变形过的)

所以你的hook无法成功

///////////////////////////////////////////////////////////////
你所提到的问题恰恰是导入表式hook的局限性

只有改变hook的形式才能根本上解决这个问题

新的hook方式就是inline hook

网上有许多资料你去查查吧
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式