首页
社区
课程
招聘
[旧帖] 修改游戏中呼唤出的外挂窗体名称的疑问!!! 0.00雪花
发表于: 2011-5-21 12:29 5872

[旧帖] 修改游戏中呼唤出的外挂窗体名称的疑问!!! 0.00雪花

2011-5-21 12:29
5872
修改游戏中呼唤出的外挂窗体名称的疑问!!!
做了个游戏外挂多开功能, 但是感觉多开的时候, 按HOME键呼唤出外挂窗体,如果外挂窗体名不和游戏窗口名相对应, 可能会搞混淆, 于是想改变外挂窗体名字

现在修改游戏窗体名字成功, 但是修改外挂窗体的名字的时候字符串就变成了空串, 百思不得其解.

char g_szBuf[MAX_PATH] = "";         //利用这个全局缓冲区来修改外挂窗体的名字

LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
     
    BOOL bKeyUp = lParam & (1<<31);
     
    if ((VK_HOME == wParam) && bKeyUp && code == HC_ACTION)         
    {
        if (NULL == g_wgDllDlg)
        {
            g_wgDllDlg = new CWgDllDlg;
            g_wgDllDlg->Create(IDD_WG_DLL_DLG, NULL);
            AfxMessageBox(g_szBuf);                                                               //这里g_szBuf又变成了"";
            g_wgDllDlg->SetWindowText(g_szBuf);
            g_wgDllDlg->ShowWindow(SW_SHOWNORMAL);
        }
        else
        {
            if (g_wgDllDlg->IsWindowVisible())
                g_wgDllDlg->ShowWindow(SW_HIDE);
            else
                g_wgDllDlg->ShowWindow(SW_SHOW);
        }
    }
     
    return CallNextHookEx(g_hHook, code, wParam, lParam);
}

BOOL SetHook(char szBuf[MAX_PATH])
{
    if (NULL != g_hHook)
        return FALSE;

    strcpy(g_szBuf, szBuf);                                                          //这里赋值给g_szBuf, g_szBuf的值变成想要的串, 比如说123
    AfxMessageBox(g_szBuf);
     
    g_hGameWnd = FindWindow(NULL, __T("Element Client"));
    if (NULL == g_hGameWnd)
        return FALSE;

    DWORD dwGamePid = 0;
    DWORD dwGameTid = 0;
    dwGameTid = GetWindowThreadProcessId(g_hGameWnd, &dwGamePid);
     
    //如果传递的是null, 那么这里获得的是exe的句柄, 可以用GetModuleFileName来验证
    HMODULE hModule = GetModuleHandle(__T("WgDll.dll"));
     
    //注意最后一个参数是thread id而不是process id
    g_hHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hModule, dwGameTid);         
    if (NULL == g_hHook)
    {
        return FALSE;
    }
    else
    {
        SetWindowText(g_hGameWnd, szBuf);
        return TRUE;
    }

还请大家多多指教, 不胜感激.

我是用MessageBox来调试, 看这个串的值的, 大家还有没有别的方法可以看看这个串的值???

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
大牛,写的什么挂啊?
2011-5-21 17:10
0
雪    币: 85
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
全部源文件传上来看看?
2011-5-21 18:36
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
char g_szBuf[MAX_PATH] = ""; //利用这个全局缓冲区来修改外挂窗体的名字 

LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam) 
{ 
AFX_MANAGE_STATE(AfxGetStaticModuleState()); 

BOOL bKeyUp = lParam & (1<<31); 

if ((VK_HOME == wParam) && bKeyUp && code == HC_ACTION) 
{ 
if (NULL == g_wgDllDlg) 
{ 
g_wgDllDlg = new CWgDllDlg; 
g_wgDllDlg->Create(IDD_WG_DLL_DLG, NULL); 
AfxMessageBox(g_szBuf); //这里g_szBuf又变成了""; 
g_wgDllDlg->SetWindowText(g_szBuf); 
g_wgDllDlg->ShowWindow(SW_SHOWNORMAL); 
} 
else 
{ 
if (g_wgDllDlg->IsWindowVisible()) 
g_wgDllDlg->ShowWindow(SW_HIDE); 
else 
g_wgDllDlg->ShowWindow(SW_SHOW); 
} 
} 

return CallNextHookEx(g_hHook, code, wParam, lParam); 
} 

BOOL SetHook(char szBuf[MAX_PATH]) 
{ 
if (NULL != g_hHook) 
return FALSE; 

strcpy(g_szBuf, szBuf); //这里赋值给g_szBuf, g_szBuf的值变成想要的串, 比如说123 
AfxMessageBox(g_szBuf); 

g_hGameWnd = FindWindow(NULL, __T("Element Client")); 
if (NULL == g_hGameWnd) 
return FALSE; 

DWORD dwGamePid = 0; 
DWORD dwGameTid = 0; 
dwGameTid = GetWindowThreadProcessId(g_hGameWnd, &dwGamePid); 

//如果传递的是null, 那么这里获得的是exe的句柄, 可以用GetModuleFileName来验证 
HMODULE hModule = GetModuleHandle(__T("WgDll.dll")); 

//注意最后一个参数是thread id而不是process id 
g_hHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hModule, dwGameTid); 
if (NULL == g_hHook) 
{ 
return FALSE; 
} 
else 
{ 
SetWindowText(g_hGameWnd, szBuf); 
return TRUE; 
} 
看不出哪里有问题
2011-5-21 20:32
0
雪    币: 534
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我也看不出哪里有问题, 但是就是有问题, 出了鬼了.
2011-5-22 11:40
0
雪    币: 78
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
是你在dll中的szBuf指针指向不同进程内存区域
在dll用指针时,一定要注意
1.你这szBuf个指针赋值时是在游戏进程内调用sethook赋值,所以是szBuf指向游戏进程地址空间,所以,游戏中怎么用都可以
2.外挂中回调函数用的时候,是在dll当前所在进程找szBuf指向的地址,但是dll是所有进程公用的,调用时不一定在哪个进程作用域内,所以为null

解决方法
#pragma   data_seg( "mydata ")
char g_szBuf[MAX_PATH] = "";     //全局的数据
#pragma   data_seg()
#pragma   comment   (linker, "/SECTION:mydata,RWS ")
说明g_szBuf是分配在dll的数据共享段
这样就不会出错了
2011-5-22 18:14
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
帮顶!!!!
2011-5-22 18:20
0
雪    币: 534
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
本来我也以为你这样可以, 但是很遗憾, 还是解决不了问题.
2011-6-3 18:07
0
游客
登录 | 注册 方可回帖
返回
//