现在大家谈论最多的话题应该就是call了吧。总结下来就是2点:
1、怎么找call
2、找到call之后如何调用。
其中第2点需要视开发语言而定。
之前说过了使用远程注入的方式调用call,这种方式比较麻烦,而且不容易掌握。这里,说一下另外一种方法,采用线程钩子调用call的方法。
其实这种方法分开来看,大家应该都会吧:
1、钩子
这种大家都知道吧,最简单的键盘钩子总该知道这么做吧。
2、调用call
就是把汇编代码写到_asm{}中,注意一下参数就行了。
3、如果最终实现功能。
就像搭积木一样把所有东西凑合到一起就行了。
很简单吧。好了,也许懂的还是懂的,不懂的还是一头雾水。现在就从实际例子出发吧。呵呵,发现广海的很多朋友都习惯这种实际例子的教学方式。
使用VC调用 武林 中的选怪Call的方法
一、钩子Dll。
1、新建一个mfc extension dll 取名WULIN。
2、在项目中新建一个Hook.h头文件:
extern "C" LRESULT CALLBACK keybordproc(int code,WPARAM wparam,LPARAM lparam); //钩子处理函数 extern "C" bool WINAPI starthook(DWORD threadID); //启动钩子 extern "C" bool WINAPI stophook(); //停止钩子
3、在WULIN.CPP文件中引入Hook.h:
#include "Hook.h"
4、在WULIN.CPP中添加公共数据
#pragma data_seg("publicdata") HHOOK hhook=NULL; HINSTANCE pinstance=NULL; #pragma data_seg()
5、在WULIN.Cpp的DllMain中初始化pinstance
pinstance = hInstance;
6、在WULIN.Cpp中完成钩子启动函数
extern "C" bool WINAPI starthook(DWORD threadID) { hhook=SetWindowsHookEx(WH_KEYBOARD,keybordproc,pinstance,threadID); if(hhook!=NULL) return true; else return false; }
7、在WULIN.Cpp中完成钩子停止函数
extern "C" bool WINAPI stophook() { return UnhookWindowsHookEx(hhook); }
8、在WULIN.Cpp完成钩子处理函数
extern "C" LRESULT CALLBACK keybordproc(int code, WPARAM wparam,LPARAM lparam) { if (code<0) return CallNextHookEx(hhook, code, wparam, lparam); if(lparam & 0xC0000000)//键盘按下 { if(wparam == 123)//F12 { DWORD addr = 0x0056A8B0; __asm//选怪的call { pushad mov eax,dword ptr ds:[0x8d29a4] mov esi, id//id为怪的id,至于如何传进来或是得到,嘿嘿,好好考虑下 push esi mov ecx,dword ptr ds:[eax+0x20] add ecx,0xd4 call addr popad }//_asm }//if }//if }
9、在WULIN.def文件中的EXPORTS下加入
starthook @1 stophook @2
10、编译生成WULIN.dll文件和WULIN.lib文件
二、主程序
1、在项目中添加WULIN.lib文件
2、在主窗口的cpp文件头,添加Hook.h引用
#include "全路进[url=file://\\Hook.h]\\Hook.h" //[/url]路径根据自己钩子Dll的路径
3、将WULIN.dll复制到Debug中
4、装载钩子
HWND mhwnd = ::FindWindow("ClassName","TEST"); DWORD threadid = GetWindowThreadProcessId(mhwnd,NULL); starthook(threadid);
5、卸载钩子
stophook();
6、运行程序完成钩子装载后,按F12可以完成选怪操作。
三、其他
该方法不能使用sendmessage或是postmessage发送F12。呵呵,其实可以通过另外一个钩子来实现,就是WH_GETMESSAGE。对,我们可以把所有的call全部封装到这个钩子dll中,通过消息来进行分别调用,而不用把所有的程序都封装到dll中去。
也许说得也不是很清楚,呵呵,毕竟不是当老师的,很多东西无法全部表述清楚。希望大家多多理解。
在此,由衷的感谢广海给了我们一个交流的平台,感谢ccb老师对我们的关怀和教导~~~~
最后,感谢我们群的所有朋友对我们群的支持~~~~
我们群欢迎广海的所有朋友~~~~
再引用我们群的一句话:大家多看书、多学习、多讨论、多动手。没有绝对的高手,也没有绝对的菜鸟,大家鼓掌