15.網絡游戲逆向分析與漏洞攻防-網絡通信數據包分析工具-發送通信數據包至分析工具

上一個內容:14.數據包分析工具界面與通信設計

碼云地址(master 分支):https://gitee.com/dye_your_fingers/titan

碼云版本號:2d6491e3c51a1a7ab4da0ee6dc4cf566a80fd6e1

代碼下載地址,在 titan 目錄下,文件名為:titan-發送通信數據包至分析工具.zip

鏈接:https://pan.baidu.com/s/1W-JpUcGOWbSJmMdmtMzYZg

提取碼:q9n5

--來自百度網盤超級會員V4的分享

HOOK引擎,文件名為:黑兔sdk升級版.zip

鏈接:https://pan.baidu.com/s/1IB-Zs6hi3yU8LC2f-8hIEw

提取碼:78h8

--來自百度網盤超級會員V4的分享

以 14.數據包分析工具界面與通信設計 它的代碼為基礎進行修改

效果圖:

新加 CAnly.h文件:

#define Anly
#ifdef Anly
#pragma once
class CAnly
{
public:LRESULT SendData(int type, void* buff, unsigned len);
};
#endif

?新加 CAnly.cpp文件:

#include "pch.h"
#include "CAnly.h"
#ifdef Anly
LRESULT CAnly::SendData(int type, void* buff, unsigned len)
{HWND hWnd = FindWindow(L"#32770", L"DataAnly");COPYDATASTRUCT copydata{};copydata.dwData = type;copydata.cbData = len;copydata.lpData = buff;if (hWnd) {//MessageBoxA(0, "222222222222", "0", MB_OK);return SendMessage(hWnd, WM_COPYDATA, 0, (LPARAM)&copydata);}return 0;
}
#endif

GameWinSock.cpp文件的修改:修改了 OnConnect函數、OnSend函數、OnRecving函數

#include "pch.h"
#include "GameWinSock.h"
#include "extern_all.h"GameWinSock::PROC GameWinSock::_OnConnect{};
GameWinSock::PROC GameWinSock::_OnSend{};
GameWinSock::PROC GameWinSock::_OnRecv{};
// 這個函數攔截了游戲的連接
bool GameWinSock::OnConnect(char* ip, unsigned port)
{wchar_t buff[]{ L"OnConnect函數連接網絡。。。" };COPYDATASTRUCT copydata{};/*這里的0表示字符串0具體是什么要看 WM_COPYDATA消息處理函數怎樣寫的*/copydata.dwData = 0;copydata.cbData = sizeof(buff);copydata.lpData = buff;HWND hWnd = FindWindow(L"#32770", L"DataAnly");SendMessage(hWnd, WM_COPYDATA, 0, (LPARAM)&copydata);// this是ecx,HOOK的點已經有ecx了WinSock = this;bool b = (this->*_OnConnect)(ip, port);// 下方注釋的代碼時為了防止多次注入,導致虛函數地址不恢復問題導致死循環,通過一次性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, 0x10x00, PAGE_EXECUTE_READWRITE, &oldPro);vtable[0x34 / 4] = vproc.value;VirtualProtect(vtable, 0x10x00, oldPro, &backProc);*/return b;
}bool GameWinSock::OnSend(char* buff, unsigned len)
{/*這里就可以監控游戲發送的數據了*/
#ifdef  Anlyanly->SendData(0, buff, len);
#endifreturn (this->*_OnSend)(buff, len);
}bool GameWinSock::OnRecving(char* buff, unsigned len)
{// MessageBoxA(0, "11111111111111", "0", MB_OK);/*監控游戲接收的數據包*/
#ifdef  Anlyanly->SendData(1, buff, len);
#endifreturn true;
}bool GameWinSock::OnRecv(char* buff, unsigned len)
{
//#ifdef  Anly
//	anly->SendData(1, buff, len);
//#endifreturn (this->*_OnRecv)(buff, len);
}

extern_all.h文件的修改:新加 anly變量

/*此文件是用來存放全局變量、全局函數(通用函數)
*/
#pragma once
#include "GameWinSock.h"
#include "GameProc.h"
#include "CAnly.h"extern 	GameWinSock* WinSock;
extern GameProc* PGameProc;
extern void InitClassProc(LPVOID proc_addr, unsigned value);#ifdef Anly
extern CAnly* anly;
#endif

extern_all.cpp文件的修改:新加 anly變量

/*此文件是用來存放全局變量、全局函數(通用函數)
*/
#include "pch.h"
#include "extern_all.h"
GameWinSock* WinSock = nullptr;
GameProc* PGameProc = nullptr;
#ifdef Anly
CAnly* anly = nullptr;
#endifvoid InitClassProc(LPVOID proc_addr, unsigned value)
{unsigned* writer = (unsigned*)proc_addr;writer[0] = value;
}

GameProc.cpp文件的修改:修改了 _OnRecv函數

#include "pch.h"
#include "GameProc.h"
#include "extern_all.h"// typedef bool(GameWinSock::* U)(char*, unsigned);bool _OnRecv(HOOKREFS2) {unsigned* _esp = (unsigned*)_ESP;_EAX = WinSock->RecvPoint;WinSock->OnRecving((char*)_esp[1], _esp[2]);return true;
}bool _OnConnect(HOOKREFS2) {/*根據虛函數表做HOOK的操作截取 ecx 獲取 winsock 的值(指針)*/unsigned* vtable = (unsigned*)_EDX;//WinSock = (GameWinSock *)_ECX;/*聯合體的特點是共用一個內存由于 GameWinSock::OnConnect 的 OnConnect函數是 GameWinSock類的成員函數直接 vtable[0x34 / 4] = (unsigned)&GameWinSock::OnConnect; 這樣寫語法不通過所以使用聯合體,讓語法通過*/union {unsigned value;bool(GameWinSock::* _proc)(char*, unsigned);} vproc;DWORD oldPro, backProc;VirtualProtect(vtable, 0x100, PAGE_EXECUTE_READWRITE, &oldPro);/*vproc._proc = &GameWinSock::OnConnect;  這一句是把我們自己寫的調用connect函數的地址的出來*/ vproc._proc = &GameWinSock::OnConnect; /*InitClassProc函數里做的是給指針賦值的操作InitClassProc(&GameWinSock::_OnConnect, vtable[0x34/4]);這一句的意思是把GameWinSock類里的_OnConnect變量的值賦值成vtable[0x34/4],這個 vtable[0x34/4] 是虛表里的函數vtable[0x34/4]是游戲中調用connect函數的函數地址,經過之前的分析調用connect是先調用了虛表中的一個函數,然后從這個函數中調用了connect函數*/InitClassProc(&GameWinSock::_OnConnect, vtable[0x34/4]);vtable[0x34 / 4] = vproc.value;vproc._proc = &GameWinSock::OnSend;InitClassProc(&GameWinSock::_OnSend, vtable[0x3C / 4]);vtable[0x3C / 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()
{
#ifdef  anlyanly = new CAnly();
#endif}void GameProc::InitInterface()
{LoadBase();// MessageBoxA(0, "1", "1", MB_OK);// 只會HOOK一次,一次性的HOOKhooker->SetHook((LPVOID)0x10617046, 0x1, _OnConnect, 0, true);/*第一個參數是HOOK的位置第二個參數是HOOK的位置的匯編代碼的長度(用于保證執行的匯編代碼完整)第三個參數是HOOK之后當游戲執行到第一個參數的位置的時候跳轉的位置*/hooker->SetHook((LPVOID)0x10618480, 0x1, _OnRecv);/*在這里綁定游戲處理數據包函數(0x10618480函數)然后0x10618480函數在上面一行代碼已經進行了HOOK所以在調用_OnRecv函數指針時,它就會進入我們HOOK*/InitClassProc(&GameWinSock::_OnRecv, 0x10618480);
}

DataAnlyDlg.cpp文件的修改:修改了 OnCopyData函數

?

// DataAnlyDlg.cpp: 實現文件
//#include "pch.h"
#include "framework.h"
#include "DataAnly.h"
#include "DataAnlyDlg.h"
#include "afxdialogex.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif// 用于應用程序“關于”菜單項的 CAboutDlg 對話框class CAboutDlg : public CDialogEx
{
public:CAboutDlg();// 對話框數據
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_ABOUTBOX };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 實現
protected:DECLARE_MESSAGE_MAP()
};CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()// CDataAnlyDlg 對話框CDataAnlyDlg::CDataAnlyDlg(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_DATAANLY_DIALOG, pParent)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CDataAnlyDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_LIST1, lstView);
}BEGIN_MESSAGE_MAP(CDataAnlyDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDOK, &CDataAnlyDlg::OnBnClickedOk)ON_WM_COPYDATA()
END_MESSAGE_MAP()// CDataAnlyDlg 消息處理程序BOOL CDataAnlyDlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 將“關于...”菜單項添加到系統菜單中。// IDM_ABOUTBOX 必須在系統命令范圍內。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != nullptr){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 設置此對話框的圖標。  當應用程序主窗口不是對話框時,框架將自動//  執行此操作SetIcon(m_hIcon, TRUE);			// 設置大圖標SetIcon(m_hIcon, FALSE);		// 設置小圖標// ShowWindow(SW_MAXIMIZE); // 設置最大號啟動// TODO: 在此添加額外的初始化代碼auto lStyle = GetWindowLongPtr(lstView.m_hWnd, GWL_STYLE); // 獲取窗口樣式lStyle |= LVS_REPORT; // 設置為報表模式SetWindowLongPtr(lstView.m_hWnd, GWL_STYLE, lStyle);// 給窗口設置樣式auto dStyle = lstView.GetExtendedStyle(); // 獲取擴展樣式dStyle |= LVS_EX_FULLROWSELECT; // 設置選擇時選擇一行dStyle |= LVS_EX_GRIDLINES; // 畫網格線lstView.SetExtendedStyle(dStyle); // 設置擴展樣式/*lstView.InsertColumn(0, L"類型", 0, 100);lstView.InsertColumn(1, L"內容", 0, 700);lstView.InsertColumn(2, L"長度", 0, 50);lstView.InsertColumn(3, L"時間", 0, 100);lstView.InsertColumn(4, L"備注", 0, 100);這幾行代碼意思是設置表頭*/lstView.InsertColumn(0, L"類型", 0, 100);lstView.InsertColumn(1, L"內容", 0, 700);lstView.InsertColumn(2, L"長度", 0, 50);lstView.InsertColumn(3, L"時間", 0, 100);lstView.InsertColumn(4, L"備注", 0, 100);return TRUE;  // 除非將焦點設置到控件,否則返回 TRUE
}void CDataAnlyDlg::OnSysCommand(UINT nID, LPARAM lParam)
{if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}
}// 如果向對話框添加最小化按鈕,則需要下面的代碼
//  來繪制該圖標。  對于使用文檔/視圖模型的 MFC 應用程序,
//  這將由框架自動完成。void CDataAnlyDlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // 用于繪制的設備上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使圖標在工作區矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 繪制圖標dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}
}//當用戶拖動最小化窗口時系統調用此函數取得光標
//顯示。
HCURSOR CDataAnlyDlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}void CDataAnlyDlg::OnBnClickedOk()
{wchar_t buff[]{ L"我愛阿民" };COPYDATASTRUCT copydata{};/*這里的0表示字符串0具體是什么要看 WM_COPYDATA消息處理函數怎樣寫的*/copydata.dwData = 0;copydata.cbData = sizeof(buff);copydata.lpData = buff;SendMessage(WM_COPYDATA, 0, (LPARAM)&copydata);
}BOOL CDataAnlyDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* p)
{int type = p->dwData;CString _result;if (MsgType[type]) {// 轉換為buffunsigned char* buff = (unsigned char*)p->lpData;CString _tmp;for (int i = 0; i < p->cbData;i++) {_tmp.Format(L"%.2X", buff[i]);_result = _result + L" " + _tmp;}}else {// 顯示文本_result.Format(L"%s", p->lpData);}CString wlen;wlen.Format(L"%d", p->cbData);lstView.InsertItem(0, MsgName[type]);lstView.SetItemText(0, 1, _result);lstView.SetItemText(0, 2, wlen);lstView.SetItemText(0, 3, wlen);return CDialogEx::OnCopyData(pWnd, p);
}

DataAnlyDlg.h文件的修改:新加 MsgType變量、MsgName變量


// DataAnlyDlg.h: 頭文件
//#pragma once// CDataAnlyDlg 對話框
class CDataAnlyDlg : public CDialogEx
{
// 構造
public:CDataAnlyDlg(CWnd* pParent = nullptr);	// 標準構造函數// 對話框數據
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_DATAANLY_DIALOG };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持// 實現
protected:HICON m_hIcon;// 生成的消息映射函數virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()
public:CListCtrl lstView;afx_msg void OnBnClickedOk();afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);bool MsgType[5]{ // 意思看使用它的代碼true, true, false, false, false};wchar_t MsgName[5][0xFF]{// 意思看使用它的代碼L"發送",L"接收",L"發送解析",L"接收解析",L"日志"};/*0 發送數據1 接收數據2 發送數據解析3 接收數據解析4 日志*/
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717520.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717520.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717520.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

模版進階C++

非類型模版 之前我們寫的模版都是在不知道模版&#xff08;類&#xff09;中有的變量的類型是什么的時候&#xff0c;我們先用模版參數定義&#xff0c;當類實例化的時候在傳參確認 非類型模版&#xff1a;模版參數定義的時候也可以定義整型類型&#xff08;c20之后才支持其…

奇點云:SAFe框架下,我們對平臺軟件工程生產線做了4項改造

導讀&#xff1a; 客戶規模擴大&#xff0c;如何保證大數據軟件產品和服務質量始終如一&#xff1f;幾乎所有成長中的軟件廠商&#xff0c;尤其是需要通過私有化部署交付的廠商&#xff0c;都會面臨這個問題。正如《人月神話》中多次表明的&#xff0c;單純地增加人手、擴大團隊…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的植物病害檢測系統(Python+PySide6界面+訓練代碼)

摘要&#xff1a;開發高效的植物病害檢測系統對于提升農業生產效率和作物健康管理意義重大。本篇博客詳細闡述了如何運用深度學習技術構建一個植物病害檢測系統&#xff0c;并提供了完整的實現代碼。該系統基于先進的YOLOv8算法&#xff0c;對YOLOv7、YOLOv6、YOLOv5進行了性能…

考研數學——高數:微分方程

一、一階線性微分方程 兩種形式&#xff1a; 非齊次&#xff1a; 齊次&#xff1a; 推導過程 推導公式的過程一般由特殊到一般&#xff1a;所以先求解齊次方程的解 &#xff08;然后對等式兩邊同時積分&#xff09; 再來求非齊次方程的解&#xff0c;由…

【測開求職】2023秋招快手一面面經

已經過了百度測開三面,快手這個一面比百度的要難很多,可能也是遇到了比較嚴格的面試官,感覺其他面經沒有這么難。30分鐘實習,20分鐘算法題,20分鐘八股,沒有問項目。 實習 diff遇到了哪些痛點diff是全量還是增量一些字段的增加或者枚舉值的增加可以用diff測嗎有哪些自動化…

03-grafana的下拉列表選項制作-grafana的變量

一、準備環境 為了實現下拉列表篩選的樣例&#xff0c;我們監控兩個linux節點&#xff1b; 目前&#xff0c;我們已經有了一個節點了&#xff0c;再添加一個&#xff1b; 二、grafana的儀表盤變量 如果想給儀表盤自定義下拉列表&#xff0c;那么&#xff0c;需要設置變量&#…

線上問題——2021-12-27 父子線程共用線程池導致死鎖故障

一、事故現象 從早上6點開始edu-wings-admin的timer-task和mq就開始報警任務堆積&#xff0c;且數量持續上升&#xff0c;到6點50左右mq也開始告警&#xff0c;8點左右發現問題&#xff0c;開始排查&#xff0c;直到11點才找到問題&#xff0c;任務開始正常消費。 二、事故影響…

haproxy集成國密ssl功能[下]

上接[haproxy集成國密ssl功能上 4. 源碼修改解析 以下修改基本圍繞haproxy的ssl_sock.c進行修改來展開的,為了將整個實現邏輯能夠說明清楚,下述內容有部分可能就是直接摘抄haproxy的原有代碼沒有做任何修改,而大部分增加或者修改的內容則進行了特別的說明。 4.1 為bind指令…

基于springboot+vue的疾病防控綜合系統

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

計算機設計大賽 深度學習貓狗分類 - python opencv cnn

文章目錄 0 前言1 課題背景2 使用CNN進行貓狗分類3 數據集處理4 神經網絡的編寫5 Tensorflow計算圖的構建6 模型的訓練和測試7 預測效果8 最后 0 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度學習貓狗分類 ** 該項目較為新穎&a…

Python測試框架pytest介紹用法

1、介紹 pytest是python的一種單元測試框架&#xff0c;同自帶的unittest測試框架類似&#xff0c;相比于unittest框架使用起來更簡潔、效率更高 pip install -U pytest 特點&#xff1a; 1.非常容易上手,入門簡單,文檔豐富&#xff0c;文檔中有很多實例可以參考 2.支持簡單的單…

C++內存模型與內存序

寫在前面 在真正了解Memory Order的作用之前&#xff0c;曾經簡單地將Memory Order等同于mutex和atomic來進行線程間數據同步&#xff0c;或者用來限制線程間的執行順序&#xff0c;其實這是一個錯誤的理解。直到后來仔細研究了Memory Order之后&#xff0c;才發現無論是功能還…

Android 12 設置默認的屏幕亮度百分比

1、安卓每個版本的更新&#xff0c; 其核心代碼也會隨之更新&#xff0c;本次為Android 12 版本默認屏幕亮度的修改。 其中涉及的核心代碼主要有&#xff1a; packages\apps\Settings\src\com\android\settings\display\BrightnessLevelPreferenceController.java frameworks…

力扣706:設計哈希映射

題目&#xff1a; 不使用任何內建的哈希表庫設計一個哈希映射&#xff08;HashMap&#xff09;。 實現 MyHashMap 類&#xff1a; MyHashMap() 用空映射初始化對象void put(int key, int value) 向 HashMap 插入一個鍵值對 (key, value) 。如果 key 已經存在于映射中&#x…

【GPU驅動開發】- mesa編譯與鏈接過程詳細分析

前言 不必害怕未知&#xff0c;無需恐懼犯錯&#xff0c;做一個Creator&#xff01; 一、總體框架圖 暫時無法在飛書文檔外展示此內容 二、Mesa API 處理 OpenGL 函數調用 Mesa API 負責實現 OpenGL 和其他圖形 API 的函數接口。Mesa API 表是一個重要的數據結構&#xf…

c# 獲得進程的標題

使用 System.Diagnostics.Process 類來獲取所有 Internet Explorer 進程的標題。以下是如何做到這一點的代碼示例&#xff1a; using System; using System.Diagnostics;class Program {static void Main(){foreach (Process process in Process.GetProcessesByName("iex…

數據中臺的演進與實踐——構建企業的數字核心_光點科技

數據中臺&#xff0c;一個在近年來被頻繁提及的概念&#xff0c;已經成為眾多企業數字化轉型的核心組成部分。然而&#xff0c;盡管它的重要性被業界廣泛認可&#xff0c;對于數據中臺的深入理解和有效實踐仍然是許多企業面臨的挑戰。在本文中&#xff0c;我們將從數據中臺的演…

從租完ecs云服務器 使用docker建立用戶 全過程

一 登錄root用戶 ssh root公網ip 輸入密碼&#xff0c;若沒有密碼可以前往阿里云設置服務器root密碼 二 創建新用戶 并賦予 新用戶sudo權限 adduser $USER usermod -aG sudo $USER 三 Ubuntu安裝docker sudo apt-get remove docker docker-engine docker.io containerd ru…

藍橋杯:門牌制作

題目 小藍要為一條街的住戶制作門牌號。 這條街一共有2020 位住戶&#xff0c;門牌號從1 到2020 編號。 小藍制作門牌的方法是先制作0 到9 這幾個數字字符&#xff0c;最后根據需要將字符粘貼到門牌上&#xff0c;例如門牌1017 需要依次粘貼字符1、0、1、7&#xff0c;即需要1…

反向代理原理

反向代理是一種網絡應用架構模式&#xff0c;主要用于將對一個或多個后端服務器的請求進行轉發、負載均衡和緩存&#xff0c;以提高系統的安全性、性能和可靠性。 其原理如下&#xff1a; 1. 客戶端向反向代理發送請求。 2. 反向代理服務器接收請求&#xff0c;并根據預設的規…