外挂之路_游戏钩子注入_调用窗口

跟MFC的dll基本一样,只不过是在dll中创建一个窗体

 

 

BOOL CmfcdllApp::InitInstance()
{
    CWinApp::InitInstance();
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    AfxMessageBox(L"我是动态链接库入口点");
    return TRUE;
}


BOOL CmfcdllApp::ExitInstance()
{
    CWinApp::ExitInstance();
    AFX_MANAGE_STATE(AfxGetStaticModuleState());/*
    AfxMessageBox(L"我是动态链接库出口点");

*/
    //释放资源
    if(mydlg1){
        delete mydlg1;
        mydlg1 = NULL;
    }
    return TRUE;
}

extern "C" __declspec(dllexport) int add(int a,int b)//我是导出函数
{
    return a+b;
}

int sub(int a,int b)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    AfxMessageBox(L"我是sub方法");
    return a-b;
}
LRESULT CALLBACK Gameproc(int nCode,WPARAM wParam, LPARAM lParam)
{ 
    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    PMSG pMsg = (PMSG)lParam;

    if(pMsg->message == WM_KEYUP)
    {
        if(pMsg->wParam == VK_HOME)//如果是HOME键
        {
            if(mydlg1 == NULL)
            {
                mydlg1 = new myDlg();
                mydlg1->Create(IDD_DIALOG1);
                mydlg1->ShowWindow(TRUE);
            }
            else
            {
                if(mydlg1->IsWindowVisible())
                    mydlg1->ShowWindow(FALSE);
                else
                    mydlg1->ShowWindow(TRUE);
            }
        }
    }
    return CallNextHookEx(0,nCode,wParam,lParam);
}


void setHook()
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    HWND gameh=FindWindow(NULL,L"145sdf");
    if (gameh==0) 
    { 
        AfxMessageBox(L"未找到游戏");
        return;
    }
    DWORD tid=::GetWindowThreadProcessId(gameh,NULL);
    ::SetWindowsHookEx(WH_GETMESSAGE,Gameproc,::GetModuleHandle(L"mfcdll.dll"),tid);
}

 

 

 

窗体代码:

 

void myDlg::OnBnClickedButton1()
{
    
    int abc = 120354;
        _asm{
            mov eax,abc
            mov ebx,0x00486150
            mov [ebx],eax
    }
}

把dll注入到游戏进程的好处就是,可以直接用内联汇编访问游戏中的数据,

 

测试dll代码:

 

BOOL CmydllTestDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // 将“关于...”菜单项添加到系统菜单中。

    // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        CString strAboutMenu;
        strAboutMenu.LoadString(IDS_ABOUTBOX);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE);            // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标

    // TODO: 在此添加额外的初始化代码

    HMODULE hdd=LoadLibrary(L"mfcdll.dll");//加载动态链接库
    sub=(xxxx*)GetProcAddress(hdd,"setHook");//获得动态链接库里面的函数指针
    if (sub)
    {
        ::AfxMessageBox(L"加载成功");
    }


    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CmydllTestDlg::OnBnClickedButton1()
{
    sub();
}

 

 

 

游戏代码:

 

.版本 2

.程序集 窗口程序集1
.程序集变量 zz, 整数型

.子程序 _按钮1_被单击

zz = zz + 125
编辑框1.内容 = 到文本 (zz)

 

 

 

posted @ 2013-08-31 17:48  宝贝,我永远都在  阅读(430)  评论(0)    收藏  举报