vc注入并调用DLL里方法的教程

1 新建一个mfc extension dll 这个我想用VC的人都会做的事情吧--!名字叫做mydll

2 点击 文件---新建 选择文件 建立一个Header File文件 我们就暂定他的名字叫做Hook吧

3 在刚才建立的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();                //停止钩子

4 在mydll.CPP的#include "stdafx.h"下面添加

  #include "Hook.h" 
  #pragma data_seg("publicdata") 
  HHOOK hhook=NULL; 
  HINSTANCE pinstance=NULL;
  #pragma data_seg()

5 找到DllMain.......在里面初始化

  pinstance = hInstance;

6 同时 在mydll.CPP中找到空白的地方 复制下面的代码进去

extern "C" bool WINAPI starthook(DWORD threadID)//打开钩子函数
{
    hhook=SetWindowsHookEx(WH_GETMESSAGE,keybordproc,pinstance,threadID);
    if(hhook!=NULL)
        return true;
    else 
        return false;
}
extern "C" bool WINAPI stophook() //关闭钩子函数
{ 
    UnhookWindowsHookEx(hhook); 
    if(hhook==NULL)
       return true;
    else
        return false;
}

7 同样复制下面的代码进去 注意 下面的AfxMessageBox("hhhhh");就可以代替你所写的汇编就比如

DWORD addr = 0x0056FC80;
__asm
{
    pushad
    call addr 
    popad
}

前面的If语句就是指按下H键会发生后面的事件 我这里就是弹出一个对话框而已

extern "C" LRESULT CALLBACK keybordproc(int code,WPARAM wparam,LPARAM lparam)
{
    if (code == HC_ACTION) 
    {
        MSG *msg = (MSG *)lparam;
        if (msg->message == WM_CHAR) 
        {
            if (msg->wParam == 'h') AfxMessageBox("hhhhh");//如果收到键盘消息 为按键h 则弹出对话框
        }
    }
    return CallNextHookEx(hhook,code,wparam,lparam);
}

8 在mydll.def文件中的EXPORTS下加入

starthook @1
stophook @2

开始编译 在Debug 里面会看到一个mydll.dll和mydll.lib

9 工程--增加到工程--新建 建立一个纯Dialog EXE 编译一下... 然后把上面Debug里面的mydll.dll和mydll.lib复制到新建的EXE

文件夹和EXE的Debug里 然后工程--设置 找到 连接 在对象/库模块 里添加mydll.lib

10 为自己的Dialog增加两个按钮 用来测试是否注入成功 里面的函数如下

void CWULINtestDlg::OnButton1() 
{
  HWND mhwnd = ::FindWindow(NULL,"春秋Q传Online(版本0.6.17)");
  if(hwnd==0){
        AfxMessageBox("error");
              }
  else{
     DWORD threadid = GetWindowThreadProcessId(mhwnd,NULL);
          starthook(threadid);//打开钩子
    }    
}

void CWULINtestDlg::OnButton2() 
{
  HWND    hwnd=::FindWindow(NULL,"春秋Q传Online(版本0.6.17)");
    if(hwnd==0)
        AfxMessageBox("error");
    else{
        ::PostMessage(hwnd,WM_KEYDOWN,72,0);//72是h的键值
    }    
}

11 先按下注入的按键 然后按下令一个 看看是不是弹出了一个对话框 同时 你也可以把 dll里的函数 改成你想要得CALL 从而达到我们注入的目的

------By LeeHowNash

2007.9.19

感谢crruirui所写的http://www.ghoffice.com/bbs/htm_data/74/0704/35033.html注入方法 这里我所用的是WH_GETMESSAGE来通讯的调用DLL里面的函数