從技術面簡介線上遊戲外掛

53 %
47 %
Information about 從技術面簡介線上遊戲外掛
Technology

Published on March 15, 2014

Author: zuan0312

Source: slideshare.net

Description

從技術面探討遊戲外掛運行的原理,討論三大類遊戲外掛:記憶體修改外掛、自動化外掛、封包修改外掛;尤其著重於記憶體修改外掛及自動化外掛,介紹這些外掛一般撰寫的所需要用到的 API 以及技巧。另外也會對逆向工程以及 Rootkit 兩項撰寫遊戲外掛必備的技術做簡介,以方便觀眾了解本篇中其他內容。最後探討反外掛程式,他們透過哪些方式來防堵外掛,例如 Signature-based Detection 以及 API Hooking,再來討論外掛作者可以使用哪些方法來破解這些方法。

從技術面簡介線上遊戲外掛 An Introduction to Online-Game Hacks, From a Technical Perspective Zuan@chroot.org

僅學術研究性質 請不要違反 EULA

本篇沒有任何 外掛的 Live Demo

Who am I? ● 2006 年左右活耀於 Cheat Engine Forum, 為其 Underground 成員 ● 當年主要玩楓之谷外掛 , 專門破解 nProtect GameGuard (rev641~12xx) ● MzBot 作者

Who am I? ● 台科大不分系大五 – 主修資工 , 電子 , 輔修機械 , 企管 ● chr00t 資安社群成員 ● 2010 趨勢雲端程式競賽第一名 ● 2013 International Future Energy Challenge – Grand Prize

為什麼今天要來講

1. 想學寫外掛的能入門

2. 想寫遊戲的能了解外掛

目錄 ● 自動化外掛 ● 記憶體修改外掛 – 分析 – 修改 ● 反 - 反外掛

遊戲外掛有兩大類

自動化外掛 (俗稱按鍵精靈 ) 封包修改外掛 記憶體修改外掛

自動化外掛 (俗稱 按鍵精靈 ) 記憶體修改外掛 封包修改外掛 是否有作弊的效果 ? 無 有 理論上是否能防堵 ? 不能 能 運作原理 無聊的事情 由電腦代勞 欺騙遊戲伺服器

自動化工具很多

AutoIt, Sikuli, ACTools

讀取螢幕 / 讀取記憶體 判定動作 模擬鍵盤 滑鼠

在模擬鍵盤滑鼠方面

One API to rule them all

SendInput()

UINT WINAPI SendInput( _In_ UINT nInputs, _In_ LPINPUT pInputs, _In_ int cbSize );

INPUT inp[2]; inp[0].type = inp[1].type = INPUT_KEYBOARD; inp[0].ki.wScan = inp[1].ki.wScan = 0; inp[0].ki.time = inp[1].ki.time = 0; inp[0].ki.dwExtraInfo = 0; inp[1].ki.dwExtraInfo = 0; inp[0].ki.wVk = inp[1].ki.wVk = VK_RETURN; inp[0].ki.dwFlags = 0; inp[1].ki.dwFlags = KEYEVENTF_KEYUP; SendInput( 2, inp, sizeof(INPUT) );

讀取螢幕方面使用 GetDC(), GetPixel(), bitblt()

HDC GetDC( _In_ HWND hWnd ); COLORREF GetPixel( _In_ HDC hdc, _In_ int nXPos, _In_ int nYPos );

HDC hDC = GetDC( NULL ); COLORREF color = GetPixel( hDC, x, y );

記憶體修改外掛 封包修改外掛

欺騙遊戲伺服器 ? 是怎麼個欺騙法 ?

遊戲 伺服器 遊戲 客戶端 螢幕上有 : 怪 A, 怪 B, 玩家 玩家攻擊怪 A 傷害 9999 OS: 你說的我 都相信 ! 超自然嘛 ~ 玩家資訊 : … 攻擊力 50+/-15 玩家輸入 攻擊怪 A 計算傷害 = 56 記憶體修改 封包修改 移除怪 A 經驗值 +xx

遊戲 伺服器 遊戲 客戶端 草叢裡有玩家 A 但是你別顯示 記憶體修改 封包竊聽 顯示玩家 A

1. 為什麼這類計算不放到伺服器 ? 2. 為什麼這類資訊要給客戶端 ? 3. 為什麼這些計算沒有被檢查 ?

1)為什麼這類資訊要給客戶端 ? – 遊戲架構已經確定修改起來不符合成 本效益 2)有些計算無法搬到伺服器 – 網路延遲問題 3)為什麼這些計算沒有被檢查 ? – 檢 成本高查 (CPU/ 記憶體 ) – 沒有人力去寫

當然面對以上三個問題

“ 因為遊戲作者 太腦殘不了解” 都可以是答案

舉 rand() 為例子

傷害 = 傷害基準 +rand()%5

xkcd 221: http://xkcd.com/221/

檢測亂數產生器 ● 需保有亂數產生器狀態 ● 不能漏掉任何對 rand() 的呼叫 ● Replay 一遍確保沒被修改

記憶體修改外掛 vs. 封包修改外掛

現今幾乎所有外掛都是 記憶體修改外掛

封包修改的困難 ● 封包修改外掛不好實作 ● 沒有公開 API 可以進行封包修改 ● 需要自己寫 NDIS Passthrough 驅動 ● 大多遊戲都有加密封包

// From OdinMS

記憶體修改相較簡單 柿子挑軟的吃

記憶體修改外掛

修改哪裡 ? 如何修改 ? 如何不被阻止 ?

修改 裡哪

原始碼 原始碼 原始碼 編譯 執行檔 EXE

所有程式經過編譯後 都成為二進位的程式碼

人不能讀二進位

所以二進位的程式碼 被一對一轉換成文字

這就是組合語言 (Assembly Language)

暫存器 EAX EBX ECX EDX ESI EDI EBP ESP EIP EFLAGS 記憶體

常見指令 ● MOV 目的地 , 來源 ( 把來源複製到目的地 ) – MOV EAX, EBX => EAX = EBX; – MOV EAX, [0x005C] => EAX = *((int*)0x005C); ● ADD 目的地 , 來源 ( 把來源加到目的地 ) – ADD ECX, 5 => ECX += 5; – ADD ECX, [x] => ECX += x; ● SUB, XOR, OR, AND... 等指令 , 一樣的用法

常見指令 ● CMP A, B ( 比較 A 跟 B, 結果寫到 FLAGS) – CMP EAX, 5 – CMP ECX, EDX ● JMP 地址 ( 跳到地址去 ) – JMP 0x7FFE0300 ● JE 地址 ( 如果上次比較時 , A==B, 就跳 ) – JE 0x00401753 ● JNE, JGE, JG, JL, JLE... 等等是不同的比較狀 況 C F P F A F Z F S F

if ( x == 3 ) { // ooo } else { // xxx } MOV EAX, [x] CMP EAX, 3 JNE NEXT ; ooo JMP END NEXT: ; xxx END:

堆疊 ... :0x080 ... :0x07C ... :0x078 ... :0x074 ... :0x070 ... :0x06C ... :0x068 ... :0x064 ESP

常見指令 ● PUSH 來源 ( 把來源 Push 到堆疊上 ) – PUSH 5 => ESP-=4; *((int*)ESP)=5; – PUSH EAX => ESP-=4; *((int*)ESP)=EAX; ● POP 目的地 ( 把堆疊最上面 Pop 到目的 地 ) – POP EAX => EAX=*((int*)ESP); ESP+=4; ● CALL 地址 ( 呼叫在地址的函數 ) – CALL 0x004027A0 => PUSH EIP, JMP 0x004027A0 ● RET ( 從目前函數 Return) – RET => POP EIP

函數呼叫 新函數變數 :0x080 原函數 EBP :0x07C RET 地址 :0x078 新函數參數 :0x074 新函數參數 :0x070 新函數參數 :0x06C 原函數變數 :0x068 原函數變數 :0x064 ESP

這些只是常見指令

如果遇到不會的指令 請找 Intel 算帳 去 Google

Intel 64 and IA-32 Architectures Software Developer's Manual

學了組合語言 但怎麼拆解 EXE 檔 ?

靜態分析 : IDA Pro 動態分析 : OllyDbg Cheat Engine

IDA Pro

OllyDbg

OllyDbg 跟 IDA 都是正規的 逆向工程工具

他們只是輔助

Break 下去 , 遊戲就斷線了

外掛不只是改數字 , 還有改程式碼

怎麼修改

使用現有工具 Cheat Engine

Player.health--; ... DEC [EBX+047C] ... ... NOP ...

... DEC [EBX+047C] ... ... FF 8B 7C 04 00 00 ... ... NOP NOP NOP NOP NOP NOP ... ... 90 90 90 90 90 90 ...

... DEC [EBX+047C] ... ... FF 8B 7C 04 00 00 ... ... NOP NOP NOP NOP NOP NOP ... ... 90 90 90 90 90 90 ...

if ( Player.ID != 1 ) { Player.health--; } ... MOV EAX, [EBX+010] CMP EAX, 1 JE END DEC [EBX+047C] END: ...

Code Injection

alloc(newmem,2048) label(returnhere) label(originalcode) label(exit) Newmem: mov EAX, [EBX+010] cmp EAX, 1 je END dec [EBX+047C] end: jmp returnhere 00426E99: jmp newmem nop returnhere:

... 00426E99: DEC [EBX+047C] ... ... 00426E99: JMP Newmem ... Newmem: mov EAX, [EBX+010] cmp EAX, 1 je END dec [EBX+047C] end: jmp returnhere

用 CE 有點 Low 真男人外掛就要自己寫

0x00000000 0xFFFFFFFF 線上遊戲 .exe 0x00000000 0xFFFFFFFF 外掛 .exe explorer.exe 0x00000000 0xFFFFFFFF …... …...

1. Windows API 2. DLL Injection

OpenProcess() ReadProcessMemory() WriteProcessMemory()

DLL Injection

0x00000000 0xFFFFFFFF 線上遊戲 .exe 0x00000000 0xFFFFFFFF 外掛 .exe explorer.exe 0x00000000 0xFFFFFFFF …... …... 外掛 .DLL

int main( int argc, char** argv ) int CALLBACK WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )

BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved ) { if ( fwdReason == DLL_PROCESS_ATTACH ) { CreateThread( ... ); } return TRUE; };

00426E99: nop nop nop ((unsigned char*)0x00426E99) = 0x90; ((unsigned char*)0x00426E9A) = 0x90; ((unsigned char*)0x00426E9B) = 0x90;

LPVOID WINAPI VirtualAlloc( _In_opt_ LPVOID lpAddress, _In_ SIZE_T dwSize, _In_ DWORD flAllocationType, _In_ DWORD flProtect ); unsigned char *mem = VirtualAlloc( NULL, 2048, MEM_COMMIT, PAGE_EXECUTE_READWRITE ); mem[0] = ...;

DLL 怎麼把他塞 到遊戲程式裡面?

1. Cheat Engine 2. WriteProcessMemory + CreateRemoteThread 3. Target IAT

注入的時間很重要

如何不被阻止 ?

防止程式被分析 加殼技術 (Packer)

PE Header .text .data .rsrc Entry Point ( 進入點 )

PE Header .text .data .rsrc Packer Entry Point ( 進入點 )

非保護性加殼 : UPX, ASPack... etc

Armadillo ● 2003 年左右 ● OEP 難找 ● 透過隱藏 OEP 來避免被脫殼 ● Anti-Debugging

Anti-Debugging 現今使用 Olly 的 Plugin ( 如 StrongOD) 就能解決

ASProtect ● 2006 年左右 ● IAT 隱藏 ● Stolen Code

載入 DLL 前 : … CALL printf … printf: jmp xxxx 載入 DLL 後 : … CALL printf … printf: jmp 10A0573C

保護後 : … CALL FunctionA … FunctionA: jmp Packer_FunctionA … Packer_FunctionA: …

Import Reconstructor

OEP: PUSH XXX PUSH XXX CALL XXX XOR EBX, EBX PUSH EBX MOV EDI, [GetModuleHandleA] CALL EDI ...

Themida/VMProtect ● 2008 年左右 ● VM 技術 ● 需要專門的反組譯器

反外掛系統

1. 防堵 2. 偵測

防堵

.exe User mode (Ring 3) Kernel mode (Ring 0) ntoskrnl.exe Kernel32.dll User32.dll GDI32.dll ntdll.dll SSDT

Kernel32.dll ● OpenProcess() ● ReadProcessMemory() ● WriteProcessMemory() ● VirtualAlloc() ● CreateThread() ● TerminateProcess() User32.dll ● CreateWindow() ● PostMessage() ● SendInput() ● GetDC() GDI32.dll ● bitblt()

Detour Hook IAT Hook

... call SendInputA ... SendInputA: jmp xxxx IAT Hook

Detour Hook 其實就是 Code Injection

SendInputA: push ebp mov ebp, esp ... Detour Hook SendInputA: jmp xxx ...

.exe User mode (Ring 3) Kernel mode (Ring 0) ntoskrnl.exe Kernel32.dll User32.dll GDI32.dll ntdll.dll SSDT Detour/IAT Hook Detour/IAT Hook

SSDT Hook

typedef void(*FuncPtr)( … ); FuncPtr SSDT[xxx] = { KernelFunction1, KernelFunction2, … } void onSysenter( int callID, … ) { (SSDT[callID])( … ); }

.exe User mode (Ring 3) Kernel mode (Ring 0) ntoskrnl.exe Kernel32.dll User32.dll GDI32.dll ntdll.dll SSDT SSDT Hook

Detour Hook in Kernel

.exe User mode (Ring 3) Kernel mode (Ring 0) ntoskrnl.exe Kernel32.dll User32.dll GDI32.dll ntdll.dll SSDT Detour Hook

遇到 Kernel 的 Hook 就幾乎一定要寫驅動

DDK Driver Development Kit

偵測

跟防毒軟體一樣 只是他是掃描記憶體

免殺

免殺過的 Cheat Engine, 叫做 UCE Undetected Cheat Engine

首先偵測字串

const char* var =“xxx”; funcA( “xxx” );

DLL Export 的函數名稱 也會被偵測

__declspec(dllexport) void __cdecl Function1(void);

使用 strings 指令確認

有些時候 , 程式碼 也會被偵測到

被偵測到 的外掛 ?

反外掛系統的未來發展

道高一尺 魔高一丈

1. x64 下的變化 2. 虛擬化的崛起

以上都是 x86 下 也就是 32 位元的 Windows

64 位元的 Windows 下有很大的變化

從 64-bit 的 Vista 開始

1. 驅動程式數位簽章 2. PatchGuard

沒有簽章的驅動程式 不能載入

除非開 開發者模式啟

PatchGuard

SSDT 不能改 Ntoskrnl.exe 不能改 GDT&IDT 不能改 MSR 不能改

M$: “ 朕不給的 , 你們不能搶”

Kaspersky 表示 :... McAfee 表示 :...

x64 下 , 主場優勢更大

順帶一題

One Microsoft Way Redmond, WA 98052-7329 USA

美國華盛頓州 雷德蒙特市 微軟路一號

“One Microsoft Way” 只有一條路 , 就是聽微軟的

虛擬化

就是 VMWare, VirtualBox 那種虛擬化

以前統統要自己寫

Intel VT-x AMD-V

Host OS Guest OS

Host OS Guest OS 遊戲外掛 反外掛

DTDebug Ddvp

Cheat Engine 疑似也有類似功能

謝謝大家

工商時間

台灣駭客年會

1. 參加 2. 應徵工作人員 3. 投 Paper

http://hitcon.org/

Q & A

Add a comment

Related presentations

Related pages

從技術面簡介線上遊戲外掛 // Speaker Deck

從技術面簡介線上遊戲外掛 by Chen John L. Published March 15, 2014 in Programming.
Read more

【心得】盡力卻仍不明白,身邊的年輕人 ...

[SITCON 2014] 從技術面簡介線上遊戲外掛 - Zuan. https://youtu.be/Ywry9hEbhdA. 而此時的計算,我想提一個名詞"溢數"(或稱溢位)
Read more

[程式設計]請問一下 寫遊戲外掛要什麼樣的 ...

程式設計『請問一下 寫遊戲外掛要什麼樣的知識? ... [SITCON 2014] 從技術面簡介線上遊戲外掛 - Zuan ...
Read more

game淘外挂_网通1.95黄金浩月 - East Baton Rouge ...

從技術面簡介線上遊戲外掛An Introduction to Online-Game Hacks, From 僅學術 研究性質請不要違反EULA 本篇沒有任何外掛的Live ...
Read more

拉密牌(Rummikub)遊戲簡介 - Documents

拉密牌(Rummikub)遊戲簡介 壹、拉密牌的由來及簡介: 許長壽 拉密牌(Rummikub) ... 從技術面簡介線上遊戲外掛 昱泉 ...
Read more

線上遊戲洗錢教學 - 娛樂社

線上遊戲洗錢教學。極速禁地NFSPC, Taipei, ... 大家趕快刷吧.希望BUG衝裝備外掛(限次版本) - 線上遊戲版 - 鐵 ...
Read more

修改遊戲封包教學 - FeedRoc

現今市面上的大型線上遊戲 ... 從技術面簡介線上遊戲外掛 ... com/watch?v=Ywry9hEbhdA 從技術面探討遊戲外掛 ...
Read more

學生計算機年會 Students' Information Technology ...

從技術面簡介線上遊戲外掛. David Kuo (Davy) David Kuo(郭子德),常用的帳號是 david50407 ...
Read more

(二手書)工業工程與管理:從技術面、決策 ...

日本橋 遊戲片滿$799 ... 工業工程與管理:從技術面、決策面、管理面探討ie ... 國內外30 多 ...
Read more