
挡截API的问题?
原理:远程注入DLL,通过替换目标进程的API函数地址挡截目标进程的API函数(MessageBoxA)调用。测试发现:若目标进程调用CWnd:MessageBox无法被...
原理:远程注入DLL,通过替换目标进程的API函数地址挡截目标进程的API函数(MessageBoxA)调用。测试发现:若目标进程调用CWnd:MessageBox无法被挡截(::MessageBox才可以被挡截)?why??????
详细请看这里:
http://hi.baidu.com/ysees/blog/item/80cd5d45adc7c63786947342.html 展开
详细请看这里:
http://hi.baidu.com/ysees/blog/item/80cd5d45adc7c63786947342.html 展开
展开全部
挡截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键。
不知道这些原理可不可以教给玩家?不可以你们早说啊..别搞人来抓我
鼠标移动原理
模拟鼠标动作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键。

2024-10-27 广告
CATIA是法国达索公司推出的一款综合性CAD/CAM/CAE软件,广泛应用于机械设计、航空航天、汽车工业等领域。它具备强大的三维建模能力,支持基于实体、曲面和网格的建模。同时,CATIA也支持大型装配体的设计和管理,提供装配约束、碰撞检测...
点击进入详情页
本回答由VSH艾羽提供
展开全部
我来解释一下,这种现象是正常的
你的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
网上有许多资料你去查查吧
你的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
网上有许多资料你去查查吧
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询