95.網絡游戲逆向分析與漏洞攻防-ui界面的設計-ui的設計與架構

免責聲明:內容僅供學習參考,請合法利用知識,禁止進行違法犯罪活動!

如果看不懂、不知道現在做的什么,那就跟著做完看效果,代碼看不懂是正常的,只要會抄就行,抄著抄著就能懂了

內容參考于:易道云信息技術研究院

上一個內容:94.利用數據包實現使用技能

碼云版本號:2827cd4dfd810afb514b838b6a7c1ee0a11e639e

代碼下載地址,在 titan 目錄下,文件名為:titan-ui的設計與架構.zip

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

提取碼:q9n5

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

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

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

提取碼:78h8

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

以 94.利用數據包實現使用技能?它的代碼為基礎進行修改

現在實現了好多功能,但是沒有一個界面顯示都有什么功能,沒有界面感覺有一點黑燈瞎火的,所以接下來先把ui給實現了,再搞其它的

下方的ui界面是黑兔sdk模板里的(去百度網盤下載)

tab控件的屬性,屬性可不改,改它只是為了好看點的

添加一個list控件,屬性可不改,改它只是為了好看點的

給控件添加一個變量

輸入個變量名,直接點完成,推薦變量名與下圖中一致(lstlog)方便以后跟節奏

效果圖:

CUIWnd_0.cpp文件也修改了,它修改的內容不重要,所以不在這把代碼貼出來了

TextManger.h文件的修改:新加 TextManger構造函數

#pragma once
#include <iostream>
#include <fstream>/*
03E1B73B | 68 58120304              | push fxgamelogic.4031258         | 4031258:"gui"
03E1B740 | E8 7BEF0F00              | call fxgamelogic.3F1A6C0         |
03E1B745 | 83C4 04                  | add esp,4                        |
03E1B748 | 85C0                     | test eax,eax                     |
03E1B74A | 0F84 10090000            | je fxgamelogic.3E1C060           |
03E1B750 | 68 4C120304              | push fxgamelogic.403124C         | 403124C:"TextManager"
03E1B755 | 50                       | push eax                         |
03E1B756 | 8D4C24 64                | lea ecx,dword ptr ss:[esp+64]    |
03E1B75A | 51                       | push ecx                         |
03E1B75B | E8 00091000              | call fxgamelogic.3F1C060         |
03E1B760 | 8D5424 68                | lea edx,dword ptr ss:[esp+68]    |
03E1B764 | 52                       | push edx                         |
03E1B765 | E8 16EF0F00              | call fxgamelogic.3F1A680         | 111111111111
03E1B76A | 83C4 10                  | add esp,10                       |
03E1B76D | 85C0                     | test eax,eax                     |
03E1B76F | 894424 14                | mov dword ptr ss:[esp+14],eax    | [esp+14]:CD3DDDIDX10_DrawIndexedPrimitive+113
*/
// 游戲中的中文表結構是 中文名英文id 這樣的
typedef class TextTable {
public:int next = ((int)0xFFFFFFFF);int un = sizeof(TextTable);wchar_t* Txt;// 中文char TxtId[0x24];// 中文對應的英文id
}*PTextTable;typedef class TextManger
{
public:static unsigned ReadTextProc;static const wchar_t NullText[2];TextManger(const char* file);
private://int un[0x20];// 0x20 * 0x4 = 0x80int un[0x1E];union {char* TextBuff;unsigned* Count;};PTextTable textDatas = nullptr; // 中文結構
public:PTextTable* textTable = nullptr; // 暫時無用
private:int un1;
public:unsigned hashCount;unsigned* HashIndexTable = nullptr; // 哈希表
public:bool CreateTextDat(const char* filename); // 導出語言包bool LoadTextData(const char* _filename); // 加載 CreateTextDat函數寫出的文件const wchar_t* ReadTextById(const char* _id); // 根據id獲取中文名unsigned Hashcode(const char* id);// 哈希函數// 獲取一個未使用的中文與對應id結構,用與存放從文件中讀取的中文與對應idPTextTable GetNullText(PTextTable _table);
}*PTextManger;

TextManger.cpp文件的修改:新加 TextManger構造函數

#include "pch.h"
#include "TextManger.h"unsigned TextManger::ReadTextProc = 0x10295FB0;
const wchar_t TextManger::NullText[2]{};TextManger::TextManger(const char* file)
{LoadTextData(file);
}bool TextManger::CreateTextDat(const char* _filename)
{if (!textTable) {return false;}std::ofstream out(_filename, std::ios::out|std::ios::binary);if (out.bad())return false;out.write((char*)&hashCount, sizeof(hashCount));for (int i = 0; i < hashCount; i++) {// 游戲中的中文表結構是 中文名英文id 這樣的int lenId = strlen(textTable[i]->TxtId) + 1;// 寬字節一個字是2字節,wcslen函數返回值是字的個數int lenTxt = wcslen(textTable[i]->Txt) + 1;lenTxt = lenTxt * 2;out.write(textTable[i]->TxtId, lenId);out.write((char*)textTable[i]->Txt, lenTxt);}out.close();return true;
}bool TextManger::LoadTextData(const char* _filename)
{CString txt;if (textDatas)return false;std::ifstream file(_filename, std::ios::in | std::ios::binary|std::ios::ate);if(file.bad()) {return false;}unsigned buffSize = file.tellg();TextBuff = new char[buffSize];file.seekg(std::ios::beg);file.read(TextBuff, buffSize);// textTable = new PTextTable[Count[0]];textDatas = new TextTable[Count[0]];txt.Format(L"%X", &textDatas);AfxMessageBox(txt);char* buffStart = TextBuff + 4;char* buffEnd = buffStart + buffSize;int icount = 0;while(buffStart < buffEnd){// 讀取語言文件的數據到 textDatas 變量里int lenId = strlen(buffStart) + 1;memcpy(textDatas[icount].TxtId, buffStart, 0x24);buffStart = buffStart + lenId;int lenTxt = wcslen((wchar_t*)buffStart) + 1;lenTxt = lenTxt * 2;textDatas[icount].Txt = (wchar_t*)buffStart;buffStart = buffStart + lenTxt;icount++;}hashCount = Count[0];HashIndexTable = new unsigned[hashCount];memset(HashIndexTable, 0xFF, hashCount * sizeof(unsigned));for (int i = 0; i < Count[0]; i++) {// 給 textDatas 變量添加哈希算法索引(哈希表存放 textDatas的下標)unsigned hash = Hashcode(textDatas[i].TxtId);hash = hash % (hashCount + 1);if (HashIndexTable[hash] == -1) {HashIndexTable[hash] = i;}else {PTextTable nullTable = GetNullText(&textDatas[HashIndexTable[hash]]);nullTable->next = i;}}return false;
}const wchar_t* TextManger::ReadTextById(const char* _id)
{// unsigned callProc = 0x10295FB0;if (textTable) {int index;_asm {push ebxmov ebx, thispush _idcall ReadTextProcmov index, eaxpop ebx}if (index < 0)return NullText;PTextTable* _table = textTable;return (wchar_t*)_table[index]->Txt;}else {unsigned hash = Hashcode(_id);hash = hash % (hashCount + 1);unsigned index = HashIndexTable[hash];if (index > hashCount) {// index的值如果是-1那么它肯定比hashCount大return NullText;}while (strcmp(textDatas[index].TxtId, _id)) {index = textDatas[index].next;if (index > hashCount)return NullText;}return textDatas[index].Txt;}
}unsigned TextManger::Hashcode(const char* id)
{unsigned hash = 0;for (int i = 0; id[i]; i++){hash = hash * 131 + id[i];}return hash;
}PTextTable TextManger::GetNullText(PTextTable _table)
{while (_table->next != -1) {// 從鏈表中找出最后一個(next的值是-1的)_table = &textDatas[_table->next];}return _table;
}

htdMfcDll.cpp文件的修改:修改了 InitInstance函數、KeyCallBack函數

// htdMfcDll.cpp: 定義 DLL 的初始化例程。這是一個MFC的dll
//#include "pch.h"
#include "framework.h"
#include "htdMfcDll.h"
#include "extern_all.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif// 注釋掉下方宏,以入口點注入的方式注入
// #define WNDHOOK
#ifdef WNDHOOK
typedef struct htdDll
{HHOOK     keyHook;unsigned  KbdProc;unsigned  SetDll;}*PHtdDll;
void htdSetDll(htdDll hDll);
htdDll mDll;
#endifBEGIN_MESSAGE_MAP(ChtdMfcDllApp, CWinApp)
END_MESSAGE_MAP()// ChtdMfcDllApp 構造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 WNDHOOKmDll.KbdProc = (DWORD)(KeyCallBack);mDll.SetDll = 0;
#elsekeyHook = SetWindowsHook(WH_KEYBOARD, KeyCallBack);// 代碼一開始,在這注冊一個鍵盤事件的鉤子
#endifPGameProc = new GameProc();wndMain = new CUI();wndMain->Create(IDD_MAIN);Client = wndMain;return TRUE;
}// 鉤子處理事件
LRESULT CALLBACK KeyCallBack(int nCode, WPARAM w, LPARAM l)
{if (nCode == 0){if ((l & (1 << 31)) == 0){switch (w){case VK_HOME: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

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

#include "pch.h"
#include "GameProc.h"
#include "extern_all.h"// typedef bool(GameWinSock::* U)(char*, unsigned);bool _OnComprase(HOOKREFS2) {return WinSock->OnRecv((char*)_EDI, _EBP);
}bool _OnRecv(HOOKREFS2) {_EAX = WinSock->RecvPoint;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);PGameProc->InitTextManger();return true;
}GameProc::GameProc()
{hooker = new htd::hook::htdHook2();Init();InitInterface();
}void GameProc::LoadBase()
{LoadLibraryA("fxnet2.dll");hlogic = LoadLibraryA("fxgamelogic.dll");// 如果fxgamelogic.dll里用到了其它dll里面的東西,在這賦值可能會有問題// 最好在游戲網絡連接成功哪里賦值,或者進入到游戲中之后再搞GetClassByName = (PGetClassByName)((unsigned)hlogic + 0x60A6C0);GetClassModByName = (PGetClassModByName)((unsigned)hlogic + 0x60C060);GetClassObject = (PGetClassObject)((unsigned)hlogic + 0x60A680);
}void GameProc::InitTextManger()
{CLASS_OFFSET offSet;void* classPointer = GetClassByName("gui");GetClassModByName(&offSet, classPointer, "TextManager");txtManger = GetClassObject(&offSet);
}void GameProc::Init()
{
#ifdef  Anlyanly = new CAnly();GameAnlyer = new GameAnly();
#endif/*這里的 WinSock 是0沒有創建對象,但是還是能調用Init函數這是因為Init函數里面沒有用到this,沒用到就不會報錯*/// Client = new NetClient();init_datadesc();
}void GameProc::InitInterface()
{LoadBase();// MessageBoxA(0, "1", "1", MB_OK);// 只會HOOK一次,一次性的HOOKhooker->SetHook((LPVOID)0x10617046, 0x1, _OnConnect, 0, true);/*第一個參數是HOOK的位置第二個參數是HOOK的位置的匯編代碼的長度(用于保證執行的匯編代碼完整)第三個參數是HOOK之后當游戲執行到第一個參數的位置的時候跳轉的位置第四個參數是 _OnRecv 函數返回 false 之后跳轉的位置*/hooker->SetHook((LPVOID)0x10618480, 0x1, _OnRecv, 0);hooker->SetHook((LPVOID)0x1061161D, 0x3, _OnComprase, (LPVOID)0x10611602);/*在這里綁定游戲處理數據包函數(0x10618480函數)然后0x10618480函數在上面一行代碼已經進行了HOOK所以在調用_OnRecv函數指針時,它就會進入我們HOOK*/InitClassProc(&GameWinSock::_OnRecv, 0x10618480);}

CUI.cpp文件的修改:新加 SetListView函數、getTxtManger函數,修改了 DoDataExchange函數、OnInitDialog函數、InstallPage函數

// CUI.cpp: 實現文件
//#include "pch.h"
#include "htdMfcDll.h"
#include "CUI.h"
#include "afxdialogex.h"
#include "extern_all.h"// CUI 對話框IMPLEMENT_DYNAMIC(CUI, CDialogEx)CUI::CUI(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_MAIN, pParent)
{}CUI::~CUI()
{
}void CUI::SetListView(CListCtrl* lst)
{auto lStyle = GetWindowLongPtr(lst->m_hWnd, GWL_STYLE); // 獲取窗口樣式lStyle |= LVS_REPORT; // 設置為報表模式SetWindowLongPtr(lst->m_hWnd, GWL_STYLE, lStyle);// 給窗口設置樣式auto dStyle = lst->GetExtendedStyle(); // 獲取擴展樣式dStyle |= LVS_EX_FULLROWSELECT; // 設置選擇時選擇一行dStyle |= LVS_EX_GRIDLINES; // 畫網格線lst->SetExtendedStyle(dStyle); // 設置擴展樣式
}void CUI::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_TAB1, mTab);DDX_Control(pDX, IDC_LIST1, lstlog);
}BOOL CUI::OnInitDialog()
{CDialogEx::OnInitDialog();SetListView(&lstlog);InstallPage(new CUIWnd_0(), IDD_PAGE_0, L"角色", TRUE);InstallPage(new CUIWnd_1(), IDD_PAGE_1, L"信息");lstlog.InsertColumn(0, L"消息", 0, 70);lstlog.InsertColumn(1, L"內容", 0, 700);lstlog.InsertColumn(2, L"時間", 0, 130);//PageINJ.Init(wAppPath);//PageRAN.SetAppPath(wAppPath);return TRUE;
}bool CUI::InstallPage(CDialogEx* wnd, int IDD_WND, CString&& _Name, BOOL IsShow)
{if (CurPage >= MAX_PAGE_MAIN) return false;Pages[CurPage] = wnd;Pages[CurPage]->Create(IDD_WND, this);//Pages[CurPage]->SetParent(this);Pages[CurPage]->ShowWindow(IsShow);CRect rect;mTab.GetClientRect(&rect);rect.top += 28;rect.left += 5;rect.bottom -= 4;rect.right -= 5;Pages[CurPage]->MoveWindow(&rect);mTab.InsertItem(CurPage, _Name);CurPage++;return true;
}BEGIN_MESSAGE_MAP(CUI, CDialogEx)ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, &CUI::OnTcnSelchangeTab1)
END_MESSAGE_MAP()// CUI 消息處理程序void CUI::OnTcnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{// TODO: 在此添加控件通知處理程序代碼*pResult = 0;int n = mTab.GetCurSel();for (int i = 0; i < CurPage; i++){Pages[i]->ShowWindow(i == n);}
}PTextManger CUI::getTxtManger()
{if (!txtManger)txtManger = new TextManger("F:\\語言包.txt");return txtManger;
}

CUI.h文件的修改:修改了 CUI類,引入 NetClient頭文件、TextManger頭文件,新加 SetListView函數、getTxtManger函數、lstlog變量

#pragma once
#include "afxdialogex.h"
#include "NetClient.h"
#include "TextManger.h"
//增加頁面頭文件
#include "CUIWnd_0.h"
#include "CUIWnd_1.h"
//游戲輔助UI類
// CUI 對話框
#define MAX_PAGE_MAIN 3// 這里用了多重繼承,這回有一個問題,函數名一樣的會發生沖突
// 所以在繼承的時候要注意函數名
class CUI : public CDialogEx,public NetClient
{DECLARE_DYNAMIC(CUI)public:CUI(CWnd* pParent = nullptr);   // 標準構造函數virtual ~CUI();// 對話框數據
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_MAIN };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持DECLARE_MESSAGE_MAP()CDialogEx* Pages[MAX_PAGE_MAIN];short      CurPage = 0;
public:CTabCtrl mTab;virtual BOOL OnInitDialog();bool    InstallPage(CDialogEx* wnd, int IDD_WND, CString&& _Name, BOOL IsShow=FALSE);afx_msg void OnTcnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult);
public:void SetListView(CListCtrl* lst);PTextManger getTxtManger();CListCtrl lstlog;
};

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

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

相關文章

基于jeecgboot-vue3的Flowable新建流程定義(二)

因為這個項目license問題無法開源&#xff0c;更多技術支持與服務請加入我的知識星球。 接上一節 4、編輯好后進行保存&#xff0c;保存代碼如下&#xff1a; /*保存流程定義*/const save (data: any) > {//console.log("save data", data); // { process: {..…

python從入門到精通05

一、輸入身份證號碼輸出對應省份 id_number "4313212002" province_code id_number[0] id_number[1] province_code_list {43:"湖南"} print("身份證號對應省份是&#xff1a;",province_code_list[province_code]) 二、統計需要取快遞人員…

博客增長與數據分析:不可不知的 6 大策略

CSDN 的朋友你們好&#xff0c;我是何未來&#xff0c;一個熱愛編程和寫作的計算機本科生&#xff0c;今天給大家帶來專欄【程序員博主教程&#xff08;完全指南&#xff09;】的第 11 篇文章“分析和追蹤博客表現”。本篇文章為你揭示了如何通過數據洞察來優化你的技術博客&am…

-bash: locate: 未找到命令(解決辦法)

-bash: locate: 未找到命令的解決辦法 一、解決辦法二、什么是locate三 、locate命令的具體用法 一、解決辦法 CentOS7默認沒有安裝locate命令&#xff0c;安裝方式如下&#xff1a; 執行以下命令進行安裝&#xff1a; yum install mlocate用 updatedb 指令創建 或更新locate …

數學建模--LaTeX基本介紹和入門

1.引言 &#xff08;1&#xff09;上次我們介紹到了我們這個團隊第一次參加這個數學建模比賽&#xff0c;就是這個電工杯&#xff0c;我是一名論文手&#xff0c;我們在這個下午也是對于這個比賽過程中出現的問題做了相應的分析&#xff0c;每個人也是進行了反思&#xff0c;知…

Tomcat源碼解析(七):底層如何獲取請求url、請求頭、json數據?

Tomcat源碼系列文章 Tomcat源碼解析(一)&#xff1a;Tomcat整體架構 Tomcat源碼解析(二)&#xff1a;Bootstrap和Catalina Tomcat源碼解析(三)&#xff1a;LifeCycle生命周期管理 Tomcat源碼解析(四)&#xff1a;StandardServer和StandardService Tomcat源碼解析(五)&…

golang實現mediasoup的tcp服務及channel通道

tcp模塊 定義相關類 Client&#xff1a;表示客戶端連接&#xff0c;包含網絡連接conn、指向服務器的指針Server和Channel指針c。server&#xff1a;表示TCP服務器&#xff0c;包含服務器地址address、TLS配置config以及三個回調函數&#xff1a; onNewClientCallback&#xf…

最大連續1的個數(滑動窗口)

算法原理&#xff1a; 這道題大眼一看是關于翻轉多少個0的問題&#xff0c;但是&#xff0c;如果你按照這種思維去做題&#xff0c;肯定不容易。所以我們要換一種思維去做&#xff0c;這種思維不是一下就能想到的&#xff0c;所以想不到也情有可原。 題目是&#xff1a;給定一…

Vue3:動態路由+子頁面(新增、詳情頁)動態路由配置(代碼全注釋)

文章目錄 實現思路調用后端接口獲取用戶權限獲取頁面權限動態綁定到路由對象中動態添加子頁面路由 實現思路 emm&#xff0c;項目中使用動態路由實現根據后端返回的用戶詳情信息&#xff0c;動態將該用戶能夠訪問的頁面信息&#xff0c;動態生成并且綁定到路由對象中。但是后…

如何從清空的回收站中恢復已刪除的Excel文件?

“嗨&#xff0c;幾天前我刪除了很多沒有備份的Excel文件。回收站已清空。當我意識到我犯了一個大錯誤時&#xff0c;所有的Excel文件都消失了&#xff0c;回收站里什么都沒有。清空回收站后是否可以恢復已刪除的 Excel 文件&#xff1f; 回收站是一種工具&#xff0c;可讓您在…

LeetCode 343. 整數拆分 (dp動態規劃)

343. 整數拆分 力扣題目鏈接(opens new window) 給定一個正整數 n&#xff0c;將其拆分為至少兩個正整數的和&#xff0c;并使這些整數的乘積最大化。 返回你可以獲得的最大乘積。 示例 1: 輸入: 2輸出: 1解釋: 2 1 1, 1 1 1。 示例 2: 輸入: 10輸出: 36解釋: 10 3 …

【openlayers系統學習】4.2Mapbox 樣式渲染圖層

二、Mapbox 樣式渲染圖層 顯然我們目前的地圖需要一些樣式。 VectorTile? 圖層的樣式與 Vector? 圖層的樣式工作方式完全相同。那里描述的樣式在這里也適用。 對于這樣的地圖&#xff0c;創建數據驅動的樣式&#xff08;對矢量圖層操作&#xff09;非常簡單。但矢量切片也用…

單兵組網設備+指揮中心:集群系統技術詳解

一、單兵設備功能特點 單兵組網設備是現代通信技術的重要成果&#xff0c;旨在為單個作戰或工作單元提供高效的通信和數據傳輸能力。其主要功能特點包括&#xff1a; 1. 便攜性&#xff1a;設備輕巧&#xff0c;便于單兵攜帶和使用&#xff0c;適應各種復雜環境。 2. 通信能…

簡述vue-router 組件復用導致路由參數失效怎么辦

當使用Vue Router時&#xff0c;組件復用可能會導致路由參數失效的問題。為了解決這個問題&#xff0c;我們可以采取以下策略&#xff1a; 1. 監聽路由變化 在Vue組件中&#xff0c;我們可以使用watch屬性來監聽$route對象的變化。當路由發生變化時&#xff0c;如果目標組件是…

第 8 章 機器人實體導航實現_路徑規劃(自學二刷筆記)

重要參考&#xff1a; 課程鏈接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 講義鏈接:Introduction Autolabor-ROS機器人入門課程《ROS理論與實踐》零基礎教程 9.3.5 導航實現05_路徑規劃 路徑規劃仍然使用 navigation 功能包集中的 move_base 功能包。 5.1編寫launch文…

PHP之fastadmin系統配置分組增加配置和使用

目錄 一、實現功能&#xff1a;fasttadmin實現添加系統配置分組和添加參數、使用 二、添加分組 三、配置分組參數 四、最終存儲位置 五、獲取配置參數 一、實現功能&#xff1a;fasttadmin實現添加系統配置分組和添加參數、使用 二、添加分組 在字典配置中找到分組對應鍵值…

linux系統——top資源管理器

在linux系統中&#xff0c;有類似于windows系統中的資源管理器&#xff0c;top用于實時的監控系統的任務執行狀態以及硬件配置信息 在linux中&#xff0c;輸入top命令&#xff0c;可以進入相應界面&#xff0c;在此界面可以使用一些指令進行操作 如&#xff0c;輸入z 可以改變…

終端安全管理系統、天銳DLP(數據泄露防護系統)| 數據透明加密保護,防止外泄!

終端作為企業員工日常辦公、數據處理和信息交流的關鍵工具&#xff0c;承載著企業運營的核心信息資產。一旦終端安全受到威脅&#xff0c;企業的敏感數據將面臨泄露風險&#xff0c;業務流程可能遭受中斷&#xff0c;甚至整個企業的運營穩定性都會受到嚴重影響。 因此&#xff…

【EVI】Hume AI 初探

寫在前面的話 Hume AI宣布已在B輪融資中籌集5000萬美元&#xff0c;由前Google DeepMind研究員Alan Cowen創立并擔任CEO。該AI模型專注于理解人類情感&#xff0c;并發布了「共情語音界面」演示&#xff0c;通過語音對話實現互動。從 Hume AI 官網展示的信息&#xff0c;EVI 能…

計算機視覺與深度學習實戰:以Python為工具,基于深度學習的汽車目標檢測

隨著人工智能技術的飛速發展,計算機視覺與深度學習已經成為當今科技領域的熱點。其中,汽車目標檢測作為自動駕駛、智能交通等系統的核心技術,受到了廣泛關注。本文將以Python為工具,探討基于深度學習的汽車目標檢測方法及其實戰應用。 一、計算機視覺與深度學習基礎 計算機…