Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
從技術面簡介線上遊戲外掛
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 Challen...
為什麼今天要來講
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].k...
讀取螢幕方面使用
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
但是你別顯示
記憶體修改
封包竊聽
顯示玩家 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 目的地 , 來...
常見指令
● CMP A, B ( 比較 A 跟 B, 結果寫到 FLAGS)
– CMP EAX, 5
– CMP ECX, EDX
● JMP 地址 ( 跳到地址去 )
– JMP 0x7FFE0300
● JE 地址 ( 如果上次比較時 ...
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 目的地 ( 把...
函數呼叫
新函數變數 :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...
...
00426E99:
DEC [EBX+047C]
...
...
00426E99:
JMP Newmem
...
Newmem:
mov EAX, [EBX+010]
cmp EAX, 1
je END
dec [EBX+047C]
...
用 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...
BOOL WINAPI DllMain(
HINSTANCE hinstDLL,
DWORD fdwReason,
LPVOID lpvReserved
)
{
if ( fwdReason == DLL_PROCESS_ATTACH ) {
...
00426E99:
nop
nop
nop
((unsigned char*)0x00426E99) = 0x90;
((unsigned char*)0x00426E9A) = 0x90;
((unsigned char*)0x00426E9...
LPVOID WINAPI VirtualAlloc(
_In_opt_ LPVOID lpAddress,
_In_ SIZE_T dwSize,
_In_ DWORD flAllocationType,
_In_ DWORD flProte...
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()
● TerminatePro...
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...
SSDT Hook
typedef void(*FuncPtr)( … );
FuncPtr SSDT[xxx] =
{ KernelFunction1,
KernelFunction2, … }
void onSysenter( int 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
從技術面簡介線上遊戲外掛
從技術面簡介線上遊戲外掛
從技術面簡介線上遊戲外掛
從技術面簡介線上遊戲外掛
從技術面簡介線上遊戲外掛
從技術面簡介線上遊戲外掛
從技術面簡介線上遊戲外掛
從技術面簡介線上遊戲外掛
從技術面簡介線上遊戲外掛
從技術面簡介線上遊戲外掛
從技術面簡介線上遊戲外掛
從技術面簡介線上遊戲外掛
Upcoming SlideShare
Loading in …5
×

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

17,185 views

Published on

演講影片: https://www.youtube.com/watch?v=Ywry9hEbhdA

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

Published in: Technology
  • Be the first to comment

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

  1. 1. 從技術面簡介線上遊戲外掛 An Introduction to Online-Game Hacks, From a Technical Perspective Zuan@chroot.org
  2. 2. 僅學術研究性質 請不要違反 EULA
  3. 3. 本篇沒有任何 外掛的 Live Demo
  4. 4. Who am I? ● 2006 年左右活耀於 Cheat Engine Forum, 為其 Underground 成員 ● 當年主要玩楓之谷外掛 , 專門破解 nProtect GameGuard (rev641~12xx) ● MzBot 作者
  5. 5. Who am I? ● 台科大不分系大五 – 主修資工 , 電子 , 輔修機械 , 企管 ● chr00t 資安社群成員 ● 2010 趨勢雲端程式競賽第一名 ● 2013 International Future Energy Challenge – Grand Prize
  6. 6. 為什麼今天要來講
  7. 7. 1. 想學寫外掛的能入門
  8. 8. 2. 想寫遊戲的能了解外掛
  9. 9. 目錄 ● 自動化外掛 ● 記憶體修改外掛 – 分析 – 修改 ● 反 - 反外掛
  10. 10. 遊戲外掛有兩大類
  11. 11. 自動化外掛 (俗稱按鍵精靈 ) 封包修改外掛 記憶體修改外掛
  12. 12. 自動化外掛 (俗稱 按鍵精靈 ) 記憶體修改外掛 封包修改外掛 是否有作弊的效果 ? 無 有 理論上是否能防堵 ? 不能 能 運作原理 無聊的事情 由電腦代勞 欺騙遊戲伺服器
  13. 13. 自動化工具很多
  14. 14. AutoIt, Sikuli, ACTools
  15. 15. 讀取螢幕 / 讀取記憶體 判定動作 模擬鍵盤 滑鼠
  16. 16. 在模擬鍵盤滑鼠方面
  17. 17. One API to rule them all
  18. 18. SendInput()
  19. 19. UINT WINAPI SendInput( _In_ UINT nInputs, _In_ LPINPUT pInputs, _In_ int cbSize );
  20. 20. 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) );
  21. 21. 讀取螢幕方面使用 GetDC(), GetPixel(), bitblt()
  22. 22. HDC GetDC( _In_ HWND hWnd ); COLORREF GetPixel( _In_ HDC hdc, _In_ int nXPos, _In_ int nYPos );
  23. 23. HDC hDC = GetDC( NULL ); COLORREF color = GetPixel( hDC, x, y );
  24. 24. 記憶體修改外掛 封包修改外掛
  25. 25. 欺騙遊戲伺服器 ? 是怎麼個欺騙法 ?
  26. 26. 遊戲 伺服器 遊戲 客戶端 螢幕上有 : 怪 A, 怪 B, 玩家 玩家攻擊怪 A 傷害 9999 OS: 你說的我 都相信 ! 超自然嘛 ~ 玩家資訊 : … 攻擊力 50+/-15 玩家輸入 攻擊怪 A 計算傷害 = 56 記憶體修改 封包修改 移除怪 A 經驗值 +xx
  27. 27. 遊戲 伺服器 遊戲 客戶端 草叢裡有玩家 A 但是你別顯示 記憶體修改 封包竊聽 顯示玩家 A
  28. 28. 1. 為什麼這類計算不放到伺服器 ? 2. 為什麼這類資訊要給客戶端 ? 3. 為什麼這些計算沒有被檢查 ?
  29. 29. 1)為什麼這類資訊要給客戶端 ? – 遊戲架構已經確定修改起來不符合成 本效益 2)有些計算無法搬到伺服器 – 網路延遲問題 3)為什麼這些計算沒有被檢查 ? – 檢 成本高查 (CPU/ 記憶體 ) – 沒有人力去寫
  30. 30. 當然面對以上三個問題
  31. 31. “ 因為遊戲作者 太腦殘不了解” 都可以是答案
  32. 32. 舉 rand() 為例子
  33. 33. 傷害 = 傷害基準 +rand()%5
  34. 34. xkcd 221: http://xkcd.com/221/
  35. 35. 檢測亂數產生器 ● 需保有亂數產生器狀態 ● 不能漏掉任何對 rand() 的呼叫 ● Replay 一遍確保沒被修改
  36. 36. 記憶體修改外掛 vs. 封包修改外掛
  37. 37. 現今幾乎所有外掛都是 記憶體修改外掛
  38. 38. 封包修改的困難 ● 封包修改外掛不好實作 ● 沒有公開 API 可以進行封包修改 ● 需要自己寫 NDIS Passthrough 驅動 ● 大多遊戲都有加密封包
  39. 39. // From OdinMS
  40. 40. 記憶體修改相較簡單 柿子挑軟的吃
  41. 41. 記憶體修改外掛
  42. 42. 修改哪裡 ? 如何修改 ? 如何不被阻止 ?
  43. 43. 修改 裡哪
  44. 44. 原始碼 原始碼 原始碼 編譯 執行檔 EXE
  45. 45. 所有程式經過編譯後 都成為二進位的程式碼
  46. 46. 人不能讀二進位
  47. 47. 所以二進位的程式碼 被一對一轉換成文字
  48. 48. 這就是組合語言 (Assembly Language)
  49. 49. 暫存器 EAX EBX ECX EDX ESI EDI EBP ESP EIP EFLAGS 記憶體
  50. 50. 常見指令 ● 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... 等指令 , 一樣的用法
  51. 51. 常見指令 ● 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
  52. 52. if ( x == 3 ) { // ooo } else { // xxx } MOV EAX, [x] CMP EAX, 3 JNE NEXT ; ooo JMP END NEXT: ; xxx END:
  53. 53. 堆疊 ... :0x080 ... :0x07C ... :0x078 ... :0x074 ... :0x070 ... :0x06C ... :0x068 ... :0x064 ESP
  54. 54. 常見指令 ● 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
  55. 55. 函數呼叫 新函數變數 :0x080 原函數 EBP :0x07C RET 地址 :0x078 新函數參數 :0x074 新函數參數 :0x070 新函數參數 :0x06C 原函數變數 :0x068 原函數變數 :0x064 ESP
  56. 56. 這些只是常見指令
  57. 57. 如果遇到不會的指令 請找 Intel 算帳 去 Google
  58. 58. Intel 64 and IA-32 Architectures Software Developer's Manual
  59. 59. 學了組合語言 但怎麼拆解 EXE 檔 ?
  60. 60. 靜態分析 : IDA Pro 動態分析 : OllyDbg Cheat Engine
  61. 61. IDA Pro
  62. 62. OllyDbg
  63. 63. OllyDbg 跟 IDA 都是正規的 逆向工程工具
  64. 64. 他們只是輔助
  65. 65. Break 下去 , 遊戲就斷線了
  66. 66. 外掛不只是改數字 , 還有改程式碼
  67. 67. 怎麼修改
  68. 68. 使用現有工具 Cheat Engine
  69. 69. Player.health--; ... DEC [EBX+047C] ... ... NOP ...
  70. 70. ... DEC [EBX+047C] ... ... FF 8B 7C 04 00 00 ... ... NOP NOP NOP NOP NOP NOP ... ... 90 90 90 90 90 90 ...
  71. 71. ... DEC [EBX+047C] ... ... FF 8B 7C 04 00 00 ... ... NOP NOP NOP NOP NOP NOP ... ... 90 90 90 90 90 90 ...
  72. 72. if ( Player.ID != 1 ) { Player.health--; } ... MOV EAX, [EBX+010] CMP EAX, 1 JE END DEC [EBX+047C] END: ...
  73. 73. Code Injection
  74. 74. 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:
  75. 75. ... 00426E99: DEC [EBX+047C] ... ... 00426E99: JMP Newmem ... Newmem: mov EAX, [EBX+010] cmp EAX, 1 je END dec [EBX+047C] end: jmp returnhere
  76. 76. 用 CE 有點 Low 真男人外掛就要自己寫
  77. 77. 0x00000000 0xFFFFFFFF 線上遊戲 .exe 0x00000000 0xFFFFFFFF 外掛 .exe explorer.exe 0x00000000 0xFFFFFFFF …... …...
  78. 78. 1. Windows API 2. DLL Injection
  79. 79. OpenProcess() ReadProcessMemory() WriteProcessMemory()
  80. 80. DLL Injection
  81. 81. 0x00000000 0xFFFFFFFF 線上遊戲 .exe 0x00000000 0xFFFFFFFF 外掛 .exe explorer.exe 0x00000000 0xFFFFFFFF …... …... 外掛 .DLL
  82. 82. 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 )
  83. 83. BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved ) { if ( fwdReason == DLL_PROCESS_ATTACH ) { CreateThread( ... ); } return TRUE; };
  84. 84. 00426E99: nop nop nop ((unsigned char*)0x00426E99) = 0x90; ((unsigned char*)0x00426E9A) = 0x90; ((unsigned char*)0x00426E9B) = 0x90;
  85. 85. 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] = ...;
  86. 86. DLL 怎麼把他塞 到遊戲程式裡面?
  87. 87. 1. Cheat Engine 2. WriteProcessMemory + CreateRemoteThread 3. Target IAT
  88. 88. 注入的時間很重要
  89. 89. 如何不被阻止 ?
  90. 90. 防止程式被分析 加殼技術 (Packer)
  91. 91. PE Header .text .data .rsrc Entry Point ( 進入點 )
  92. 92. PE Header .text .data .rsrc Packer Entry Point ( 進入點 )
  93. 93. 非保護性加殼 : UPX, ASPack... etc
  94. 94. Armadillo ● 2003 年左右 ● OEP 難找 ● 透過隱藏 OEP 來避免被脫殼 ● Anti-Debugging
  95. 95. Anti-Debugging 現今使用 Olly 的 Plugin ( 如 StrongOD) 就能解決
  96. 96. ASProtect ● 2006 年左右 ● IAT 隱藏 ● Stolen Code
  97. 97. 載入 DLL 前 : … CALL printf … printf: jmp xxxx 載入 DLL 後 : … CALL printf … printf: jmp 10A0573C
  98. 98. 保護後 : … CALL FunctionA … FunctionA: jmp Packer_FunctionA … Packer_FunctionA: …
  99. 99. Import Reconstructor
  100. 100. OEP: PUSH XXX PUSH XXX CALL XXX XOR EBX, EBX PUSH EBX MOV EDI, [GetModuleHandleA] CALL EDI ...
  101. 101. Themida/VMProtect ● 2008 年左右 ● VM 技術 ● 需要專門的反組譯器
  102. 102. 反外掛系統
  103. 103. 1. 防堵 2. 偵測
  104. 104. 防堵
  105. 105. .exe User mode (Ring 3) Kernel mode (Ring 0) ntoskrnl.exe Kernel32.dll User32.dll GDI32.dll ntdll.dll SSDT
  106. 106. Kernel32.dll ● OpenProcess() ● ReadProcessMemory() ● WriteProcessMemory() ● VirtualAlloc() ● CreateThread() ● TerminateProcess() User32.dll ● CreateWindow() ● PostMessage() ● SendInput() ● GetDC() GDI32.dll ● bitblt()
  107. 107. Detour Hook IAT Hook
  108. 108. ... call SendInputA ... SendInputA: jmp xxxx IAT Hook
  109. 109. Detour Hook 其實就是 Code Injection
  110. 110. SendInputA: push ebp mov ebp, esp ... Detour Hook SendInputA: jmp xxx ...
  111. 111. .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
  112. 112. SSDT Hook
  113. 113. typedef void(*FuncPtr)( … ); FuncPtr SSDT[xxx] = { KernelFunction1, KernelFunction2, … } void onSysenter( int callID, … ) { (SSDT[callID])( … ); }
  114. 114. .exe User mode (Ring 3) Kernel mode (Ring 0) ntoskrnl.exe Kernel32.dll User32.dll GDI32.dll ntdll.dll SSDT SSDT Hook
  115. 115. Detour Hook in Kernel
  116. 116. .exe User mode (Ring 3) Kernel mode (Ring 0) ntoskrnl.exe Kernel32.dll User32.dll GDI32.dll ntdll.dll SSDT Detour Hook
  117. 117. 遇到 Kernel 的 Hook 就幾乎一定要寫驅動
  118. 118. DDK Driver Development Kit
  119. 119. 偵測
  120. 120. 跟防毒軟體一樣 只是他是掃描記憶體
  121. 121. 免殺
  122. 122. 免殺過的 Cheat Engine, 叫做 UCE Undetected Cheat Engine
  123. 123. 首先偵測字串
  124. 124. const char* var =“xxx”; funcA( “xxx” );
  125. 125. DLL Export 的函數名稱 也會被偵測
  126. 126. __declspec(dllexport) void __cdecl Function1(void);
  127. 127. 使用 strings 指令確認
  128. 128. 有些時候 , 程式碼 也會被偵測到
  129. 129. 被偵測到 的外掛 ?
  130. 130. 反外掛系統的未來發展
  131. 131. 道高一尺 魔高一丈
  132. 132. 1. x64 下的變化 2. 虛擬化的崛起
  133. 133. 以上都是 x86 下 也就是 32 位元的 Windows
  134. 134. 64 位元的 Windows 下有很大的變化
  135. 135. 從 64-bit 的 Vista 開始
  136. 136. 1. 驅動程式數位簽章 2. PatchGuard
  137. 137. 沒有簽章的驅動程式 不能載入
  138. 138. 除非開 開發者模式啟
  139. 139. PatchGuard
  140. 140. SSDT 不能改 Ntoskrnl.exe 不能改 GDT&IDT 不能改 MSR 不能改
  141. 141. M$: “ 朕不給的 , 你們不能搶”
  142. 142. Kaspersky 表示 :... McAfee 表示 :...
  143. 143. x64 下 , 主場優勢更大
  144. 144. 順帶一題
  145. 145. One Microsoft Way Redmond, WA 98052-7329 USA
  146. 146. 美國華盛頓州 雷德蒙特市 微軟路一號
  147. 147. “One Microsoft Way” 只有一條路 , 就是聽微軟的
  148. 148. 虛擬化
  149. 149. 就是 VMWare, VirtualBox 那種虛擬化
  150. 150. 以前統統要自己寫
  151. 151. Intel VT-x AMD-V
  152. 152. Host OS Guest OS
  153. 153. Host OS Guest OS 遊戲外掛 反外掛
  154. 154. DTDebug Ddvp
  155. 155. Cheat Engine 疑似也有類似功能
  156. 156. 謝謝大家
  157. 157. 工商時間
  158. 158. 台灣駭客年會
  159. 159. 1. 參加 2. 應徵工作人員 3. 投 Paper
  160. 160. http://hitcon.org/
  161. 161. Q & A

×