call寻找与调用



现在大家谈论最多的话题应该就是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老师对我们的关怀和教导~~~~

最后,感谢我们群的所有朋友对我们群的支持~~~~

我们群欢迎广海的所有朋友~~~~

再引用我们群的一句话:大家多看书、多学习、多讨论、多动手。没有绝对的高手,也没有绝对的菜鸟,大家鼓掌