《Rust》滑鼠驅動 C++ 原始碼 快速閱讀精華
- 🛠️ **核心功能**:透過核心模式驅動程式 (Kernel Driver) 模擬滑鼠移動,解決遊戲封鎖 `SendInput` 的問題。
- 💻 **適用對象**:C++ 開發者、想研究繞過 EAC 輸入檢測的高階玩家。
- 📦 **包含內容**:
- 完整 C++ 客戶端通訊原始碼
- 驅動通訊介面實作 (`DeviceIoControl`)
- 預編譯驅動檔案下載
- ⚠️ **風險等級**:⭐⭐⭐⭐⭐ (涉及驅動讀寫,請務必使用小號測試)
《Rust》模擬滑鼠失效?為何一般腳本無法運作
大家在玩《Rust》的時候,是不是遇過這種情況:明明在桌面測試腳本都能正常移動滑鼠,一進到遊戲視窗,滑鼠游標就像被強力膠黏住一樣,完全動不了?
這不是你的腳本壞了,而是《Rust》的反作弊系統 Easy Anti-Cheat (EAC) 在作祟。為了防止壓槍腳本,EAC 封鎖了 Windows API 中常見的 `SendInput` 和 `mouse_event` 指令。換句話說,任何「軟體層面」的模擬輸入都會被遊戲無視。
今天要分享的,就是解決這個痛點的**終極方案**:直接透過「核心驅動程式 (Kernel Driver)」來與滑鼠硬體對話。這就像是我們不再請傳令兵傳話,而是直接拿著對講機對滑鼠下指令,EAC 就很難攔截到這種底層訊號。
特別提醒:本篇教學屬於技術研究性質,操作涉及系統底層驅動,具有一定風險。請務必在虛擬機或測試帳號上進行實驗。
👉 GM後台版 遊戲 推薦 ⬇️⬇️⬇️ 快速玩各種二次元動漫手遊app

技術解密:如何透過 C++ 繞過輸入檢測
要讓滑鼠在《Rust》裡動起來,我們需要兩個部分:
- **驅動程式 (Driver)**:這是一個 `.sys` 檔案,它已經載入到 Windows 核心,擁有最高的權限,負責執行真正的「移動滑鼠」動作。
- **客戶端 (Client)**:這就是我們下面要寫的 C++ 程式,它負責告訴驅動程式「X軸移多少、Y軸移多少」。
在本次分享的原始碼中,我們使用了 `DeviceIoControl` 這個函式來跟驅動溝通。這就像是給驅動程式打一通加密電話,告訴它我們的需求。
【小知識】什麼是 IOCTL?
IOCTL (Input/Output Control) 是應用程式與驅動程式溝通的橋樑。在程式碼中你會看到 `IOCTL_MOUSE_MOVE_RAW`,這就是我們自定義的「暗號」,當驅動收到這個暗號,就知道該移動滑鼠了。
完整 C++ 驅動通訊原始碼 (v2026)
以下是與驅動程式通訊的完整 C++ 實作代碼。這段程式碼定義了與驅動 `\\\\.\\Adverse` 的連線方式,並封裝了 `MoveMouse` 函式供你隨意調用。
#include <Windows.h>
#include <IOStream>
#include <conio.h>
// 定義滑鼠移動的控制碼 (IOCTL Code)
#define IOCTL_MOUSE_MOVE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
// 這裡使用原始碼中特定的通訊代碼
#define IOCTL_MOUSE_MOVE_RAW 0x220444
// 定義滑鼠移動的數據結構
typedef struct _MOUSE_MOVE_INPUT {
LONG x;
LONG y;
USHORT flags; // 按鍵標誌 (2 bytes),驅動通常預期至少 8 bytes
USHORT padding; // 用於對齊的填充位
} MOUSE_MOVE_INPUT, * PMOUSE_MOVE_INPUT;
class MouseDriver {
private:
HANDLE hDriver;
public:
MouseDriver() : hDriver(INVALID_HANDLE_VALUE) {}
~MouseDriver() {
Close();
}
// 開啟驅動程式控制代碼
bool Open() {
hDriver = CreateFileW(
L"\\\\.\\Adverse", // 驅動程式的裝置名稱
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hDriver == INVALID_HANDLE_VALUE) {
std::cerr << "Failed to open driver. Error: " << GetLastError() << std::endl;
return false;
}
return true;
}
void Close() {
if (hDriver != INVALID_HANDLE_VALUE) {
CloseHandle(hDriver);
hDriver = INVALID_HANDLE_VALUE;
}
}
// 發送移動指令給驅動
bool MoveMouse(LONG x, LONG y, USHORT buttonFlags = 0) {
if (hDriver == INVALID_HANDLE_VALUE) {
std::cerr << "Driver not opened!" << std::endl;
return false;
}
MOUSE_MOVE_INPUT input;
input.x = x;
input.y = y;
input.flags = buttonFlags;
input.padding = 0;
DWORD bytesReturned = 0;
BOOL result = DeviceIoControl(
hDriver,
IOCTL_MOUSE_MOVE_RAW,
&input,
sizeof(input),
NULL,
0,
&bytesReturned,
NULL
);
if (!result) {
DWORD error = GetLastError();
std::cerr << "DeviceIoControl failed. Error: " << error << std::endl;
return false;
}
return true;
}
bool IsOpen() const {
return hDriver != INVALID_HANDLE_VALUE;
}
};
int main() {
MouseDriver driver;
// 嘗試連接驅動
if (!driver.Open()) {
std::cout << "請確認驅動程式是否已載入!" << std::endl;
return 1;
}
// 測試移動:X軸+10, Y軸+10
driver.MoveMouse(10, 10);
std::cout << "滑鼠移動指令已發送。" << std::endl;
return 0;
}
檔案下載與安裝說明
這個壓縮檔內包含了與上述程式碼配套的驅動檔案。請記得,驅動程式必須先成功載入(Load Driver),上述的 C++ 程式才能成功執行 `Open()` 連線。
所有站內附件皆會附上安全掃描報告 請會員查看純淨度百分比後判斷使用
相關檔案須知: 取得檔案前,請先詳細閱讀文章內容 避免不必要錯誤與誤會發生。 也可多參考文章討論樓層內容 了解附件檔案相關討論資訊。
使用步驟簡述:
- 下載並解壓縮檔案。
- 使用驅動載入工具(如 KDMapper 或其他簽章載入器)將 `.sys` 驅動檔案載入系統。
- 編譯並執行上述提供的 C++ 程式碼。
- 若主控台顯示「滑鼠移動指令已發送」,則代表繞過成功。
《Rust》核心主題 重點回顧
- 《Rust》透過封鎖 `SendInput` 來阻擋一般腳本,必須使用驅動層級解決方案。
- 使用 `CreateFile` 開啟 `\\\\.\\Adverse` 裝置是與此驅動通訊的關鍵。
- 透過 `DeviceIoControl` 發送原始座標數據,可繞過大部分軟體層面的輸入檢測。
- 操作涉及核心權限,務必注意帳號安全與系統穩定性。
Rust 外部驅動_常見問題Q&A
Q:為什麼我執行程式後顯示 "Failed to open driver"?
A:這代表你的驅動程式還沒有成功載入到 Windows 核心,或者是驅動程式的名稱(Name)已被修改,不叫 `Adverse`。請檢查你的驅動載入器是否顯示成功,並確認驅動內部的裝置名稱設定。
Q:使用這個驅動會被 EAC 封號嗎?
A:任何繞過反作弊的行為都有風險。雖然這是「驅動層級」模擬,理論上比軟體模擬隱蔽,但如果該驅動的特徵碼(Signature)已經被 EAC 列入黑名單,載入瞬間就可能被偵測。建議僅供學習研究使用,切勿用於主帳號。
Q:這個代碼可以支援滑鼠左右鍵點擊嗎?
A:可以的。在 `MOUSE_MOVE_INPUT` 結構中的 `flags` 參數就是用來控制按鍵狀態的。你需要查閱相關文件找出對應左鍵按下(LBUTTONDOWN)和放開(LBUTTONUP)的 flag 值並傳入即可。
Q:為什麼我的滑鼠移動很卡頓?
A:如果是在遊戲內移動卡頓,可能是因為發送頻率過高或數據包處理延遲。建議在 `MoveMouse` 呼叫之間加入微小的延遲(例如 `Sleep(1)`),模擬人類的真實操作軌跡。
|