內(nèi)容參考于:易道云信息技術(shù)研究院VIP課
上一個(gè)內(nèi)容:游戲底層功能對(duì)接類GameProc的實(shí)現(xiàn)
碼云地址(master 分支):https://gitee.com/dye_your_fingers/titan
碼云版本號(hào):44c54d30370d3621c1e9ec3d7fa1e2a028e773e9
代碼下載地址,在 titan 目錄下,文件名為:titan-接管游戲連接服務(wù)器的操作.zip
鏈接:https://pan.baidu.com/s/1W-JpUcGOWbSJmMdmtMzYZg
提取碼:q9n5
--來自百度網(wǎng)盤超級(jí)會(huì)員V4的分享
HOOK引擎,文件名為:黑兔sdk升級(jí)版.zip
鏈接:https://pan.baidu.com/s/1IB-Zs6hi3yU8LC2f-8hIEw
提取碼:78h8
--來自百度網(wǎng)盤超級(jí)會(huì)員V4的分享
以?游戲底層功能對(duì)接類GameProc的實(shí)現(xiàn) 它的代碼為基礎(chǔ)進(jìn)行修改
HOOK下圖紅框位置:0x10617046(通過之前分析找到的)
?
然后在注入的時(shí)候做HOOK發(fā)現(xiàn),會(huì)崩潰,然后發(fā)現(xiàn)hook的點(diǎn)沒有被游戲加載,解決辦法我們?cè)贖OOK之前手動(dòng)的把模塊加載進(jìn)入,不等游戲加載了
?
黑兔sdk升級(jí):首先點(diǎn)擊屬性
?
找到下圖紅框位置,主要時(shí)看$(htd)\indude,如果下圖紅框位置不顯示?$(htd)\indude
?
而顯示不同選項(xiàng),如下圖紅框
?
這時(shí)把配置這一行設(shè)置成跟下圖一樣,就好了
?
下載完升級(jí)版的黑兔std頭文件可能無法正常加載到項(xiàng)目中,所以要手動(dòng)加,首先檢查它的目錄對(duì)不對(duì),如下圖紅框,我這里是對(duì)的,我的頭文件就放在了那里
?
如果不對(duì),首先點(diǎn)擊下圖紅框位置
?
選擇頭文件所在目錄,這樣就把頭文件設(shè)置好了
?
然后設(shè)置dll庫,庫目錄是下圖紅框位置,手動(dòng)設(shè)置方法與上方設(shè)置頭文件一樣
?
全部搞完之后,選擇下圖重新掃描解決方案,就不會(huì)報(bào)紅了(就算報(bào)紅也能編譯通過)
?
這里補(bǔ)充一個(gè)東西:就是當(dāng)執(zhí)行了黑兔SDK,但是在創(chuàng)建項(xiàng)目的時(shí)候下圖紅框里的東西不存在
?
首先不打開項(xiàng)目啟動(dòng) Visual Studio 然后選擇選項(xiàng):
?
然后看下圖紅框里的目錄
?
查看目錄中是否有下圖紅框里的兩個(gè)文件,如果沒有就復(fù)制到上圖紅框目錄下
?
如下圖
?
GameProc.cpp文件的修改:新加?_OnConnect函數(shù),修改了?InitInterface函數(shù)、LoadBase函數(shù)
#include "pch.h"
#include "GameProc.h"
#include "extern_all.h"
// typedef bool(GameWinSock::* U)(char*, unsigned);
bool _OnConnect(HOOKREFS2) {
/*
根據(jù)虛函數(shù)表做HOOK的操作
截取 ecx 獲取 winsock 的值(指針)
*/
unsigned* vtable = (unsigned*)_EDX;
//WinSock = (GameWinSock *)_ECX;
/*
聯(lián)合體的特點(diǎn)是共用一個(gè)內(nèi)存
由于 GameWinSock::OnConnect 的 OnConnect函數(shù)是 GameWinSock類的成員函數(shù)
直接 vtable[0x34 / 4] = (unsigned)&GameWinSock::OnConnect; 這樣寫語法不通過
所以使用聯(lián)合體,讓語法通過
*/
union {
unsigned value;
bool(GameWinSock::* _proc)(char*, unsigned);
} vproc;
/*
vproc._proc = &GameWinSock::OnConnect; 這一句是把我們自己寫的調(diào)用connect函數(shù)的地址的出來
*/
vproc._proc = &GameWinSock::OnConnect;
/*
InitClassProc函數(shù)里做的是給指針賦值的操作
InitClassProc(&GameWinSock::_OnConnect, vtable[0x34/4]);這一句的意思是把
GameWinSock類里的_OnConnect變量的值賦值成vtable[0x34/4],這個(gè) vtable[0x34/4] 是虛表里的函數(shù)
vtable[0x34/4]是游戲中調(diào)用connect函數(shù)的函數(shù)地址,經(jīng)過之前的分析調(diào)用connect是先調(diào)用了虛表中的
一個(gè)函數(shù),然后從這個(gè)函數(shù)中調(diào)用了connect函數(shù)
*/
InitClassProc(&GameWinSock::_OnConnect, vtable[0x34/4]);
CString str;
str.Format(L"===vtable:%X", vtable[0x34 / 4]);
AfxMessageBox(str);
DWORD oldPro,backProc;
VirtualProtect(vtable, 0x100, PAGE_EXECUTE_READWRITE, &oldPro);
vtable[0x34 / 4] = vproc.value;
VirtualProtect(vtable, 0x100, oldPro, &backProc);
return true;
}
GameProc::GameProc()
{
hooker = new htd::hook::htdHook2();
Init();
InitInterface();
}
void GameProc::LoadBase()
{
LoadLibraryA("fxnet2.dll");
}
void GameProc::Init()
{
}
void GameProc::InitInterface()
{
LoadBase();
MessageBoxA(0, "1", "1", MB_OK);
hooker->SetHook((LPVOID)0x10617046, 0x1, _OnConnect, 0, true);
}
新加GameWinSock.h文件:
#pragma once
class GameWinSock
{
typedef bool(GameWinSock::* PROC)(char*, unsigned);
public:
static PROC _OnConnect;
bool OnConnect(char* ip, unsigned port);
};
新加GameWinSock.cpp文件:
#include "pch.h"
#include "GameWinSock.h"
#include "extern_all.h"
GameWinSock::PROC GameWinSock::_OnConnect{};
// 這個(gè)函數(shù)攔截了游戲的連接
bool GameWinSock::OnConnect(char* ip, unsigned port)
{
// this是ecx,HOOK的點(diǎn)已經(jīng)有ecx了
WinSock = this;
MessageBoxA(0, ip, ip, MB_OK);
bool b = (this->*_OnConnect)(ip, port);
// 下方注釋的代碼時(shí)為了防止多次注入,導(dǎo)致虛函數(shù)地址不恢復(fù)問題導(dǎo)致死循環(huán),通過一次性HOOK也能解決
/*unsigned* vtable = (unsigned*)this;
vtable = (unsigned*)vtable[0];
union {
unsigned value;
bool(GameWinSock::* _proc)(char*, unsigned);
} vproc;
vproc._proc = _OnConnect;
DWORD oldPro, backProc;
VirtualProtect(vtable, 0x100, PAGE_EXECUTE_READWRITE, &oldPro);
vtable[0x34 / 4] = vproc.value;
VirtualProtect(vtable, 0x100, oldPro, &backProc);*/
return b;
}
htdMfcDll.cpp文件的修改:修改了 InitInstance函數(shù)
// htdMfcDll.cpp: 定義 DLL 的初始化例程。這是一個(gè)MFC的dll
//
#include "pch.h"
#include "framework.h"
#include "htdMfcDll.h"
#include "extern_all.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 注釋掉下方宏,以入口點(diǎn)注入的方式注入
// #define WNDHOOK
#ifdef WNDHOOK
typedef struct htdDll
{
HHOOK keyHook;
unsigned KbdProc;
unsigned SetDll;
}*PHtdDll;
void htdSetDll(htdDll hDll);
htdDll mDll;
#endif
BEGIN_MESSAGE_MAP(ChtdMfcDllApp, CWinApp)
END_MESSAGE_MAP()
// ChtdMfcDllApp 構(gòu)造
ChtdMfcDllApp::ChtdMfcDllApp()
{
}
ChtdMfcDllApp theApp;
ChtdMfcDllApp* PtheApp;
HHOOK keyHook;
LRESULT CALLBACK KeyCallBack(int nCode, WPARAM w, LPARAM l);
BOOL ChtdMfcDllApp::InitInstance()
{
CWinApp::InitInstance();
PtheApp = this;
#ifdef WNDHOOK
mDll.KbdProc = (DWORD)(KeyCallBack);
mDll.SetDll = 0;
#else
keyHook = SetWindowsHook(WH_KEYBOARD, KeyCallBack);// 代碼一開始,在這注冊(cè)一個(gè)鍵盤事件的鉤子
#endif
PGameProc = new GameProc();
return TRUE;
}
// 鉤子處理事件
LRESULT CALLBACK KeyCallBack(int nCode, WPARAM w, LPARAM l)
{
if (nCode == 0)
{
if ((l & (1 << 31)) == 0)
{
switch (w)
{
case VK_HOME:
if (PtheApp->wndMain == NULL)
{
PtheApp->wndMain = new CUI();
PtheApp->wndMain->Create(IDD_MAIN);
}
PtheApp->wndMain->ShowWindow(TRUE);
break;
}
}
}
return CallNextHookEx(keyHook, nCode, w, l);
}
#ifdef WNDHOOK
void htdInit(htdDll* hDll)
{
hDll->KbdProc = mDll.KbdProc;
hDll->keyHook = mDll.keyHook;
hDll->SetDll = mDll.SetDll;
}
void htdSetDll(htdDll hDll)
{
mDll = hDll;
}
#else
void htdInit()
{
}
#endif
新加extern_all.h文件:
/*
此文件是用來存放全局變量、全局函數(shù)(通用函數(shù))
*/
#pragma once
#include "GameWinSock.h"
#include "GameProc.h"
extern GameWinSock* WinSock;
extern GameProc* PGameProc;
extern void InitClassProc(LPVOID proc_addr, unsigned value);
新加extern_all.cpp文件文章來源:http://www.zghlxwxcb.cn/news/detail-837246.html
/*
此文件是用來存放全局變量、全局函數(shù)(通用函數(shù))
*/
#include "pch.h"
#include "extern_all.h"
GameWinSock* WinSock = nullptr;
GameProc* PGameProc = nullptr;
void InitClassProc(LPVOID proc_addr, unsigned value)
{
unsigned* writer = (unsigned*)proc_addr;
writer[0] = value;
}
?文章來源地址http://www.zghlxwxcb.cn/news/detail-837246.html
到了這里,關(guān)于9.網(wǎng)絡(luò)游戲逆向分析與漏洞攻防-游戲網(wǎng)絡(luò)架構(gòu)逆向分析-接管游戲連接服務(wù)器的操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!