分享

delphi 调用Call 的例子

 独孤求财 2012-03-21

delphi 调用Call 的例子

时间:2011-5-24来源:yang 作者: peng点击: 100次

 
现在大家谈论最多的话题应该就是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 "全路进\\Hook.h" //路径根据自己钩子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中去。

也许说得也不是很清楚,呵呵,毕竟不是当老师的,很多东西无法全部表述清楚。希望大家多多理解。

  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多