äžãæŽäœåäœåŒæ¶æ
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â CF 宿¹æåäœåŒäœç³» â
â â
â âââââââââââââââââââ âââââââââââââââââââ â
â â ACE åäœåŒé©±åš â â TP ä¿æ€ç³»ç» â â å
æ žå± â
â â (Kernel Module) â â (TencentProtect)â â
â ââââââââââ¬âââââââââ ââââââââââ¬âââââââââ â
â â â â
â ââââââââââŒââââââââââââââââââââââŒâââââââââ â
â â å
æ žåè° + è¿æ»€é©±åš â â
â â ⢠ObRegisterCallbacks (å¥æä¿æ€) â â
â â ⢠PsSetCreateProcessNotifyRoutine â â
â â ⢠PsSetLoadImageNotifyRoutine (DLLçæ§)â â
â â ⢠CmRegisterCallback (泚åè¡šä¿æ€) â â
â â ⢠MiniFilter (æä»¶ç³»ç»è¿æ»€) â â
â ââââââââââ¬âââââââââââââââââââââââââââââââ â
â â â
â ââââââââââŒâââââââââââââââââââââââââââââââ â
â â çšæ·ææ£æµå± â â
â â ⢠çªå£æäžŸ + 屿§æ«æ â â
â â ⢠暡å宿޿§æ ¡éª (.text hash) â â
â â ⢠Hook æ£æµ (inline/IAT/vtable) â â
â â ⢠泚å
¥æ£æµ (DLLé»åå/çœåå) â â
â â ⢠Overlay æ£æµ â â
â â ⢠è¡äžºç¹åŸæ£æµ (Aimbot pattern) â â
â ââââââââââ¬âââââââââââââââââââââââââââââââ â
â â â
â ââââââââââŒâââââââââââââââââââââââââââââââ â
â â æå¡ç«¯æ£æµå± â â
â â â¢ å»æ/ç倎çåŒåžž â â
â â ⢠è§é远螪çåŸ â â
â â ⢠æªåž§/æªåŸåäŒ åæ â â
â â ⢠æºåšåŠä¹ æš¡åæå â â
â ââââââââââââââââââââââââââââââââââââââââââ â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
äºãæ¹æ¡éè§ç 6 å€§æ£æµåéïŒæèŽåœçšåºŠæåºïŒ
ð¥ æ£æµç»ŽåºŠ 1ïŒOverlay çªå£ç¹åŸæ£æµ
è¿æ¯å€é𿹿¡éè§æçŽæ¥çæ»å ã
åäœåŒåäºä»ä¹ïŒ
åäœåŒè¿çšïŒéåžžæ¯ SGuard64.exe / ace-guard.exeïŒäŒåšææ§ïŒ~500msïŒæ§è¡ïŒ
EnumWindows â éåææé¡¶å±çªå£
âââ æ£æ¥ WS_EX_TRANSPARENT | WS_EX_LAYERED | WS_EX_TOPMOST
âââ æ£æ¥çªå£ç©åœ¢æ¯åŠå®å
šèŠçæžžæçªå£
âââ æ£æ¥çªå£ç±»åæ¯åŠåšé»ååäž
âââ GetWindowLong(GWL_HINSTANCE) â æ£æ¥æ¯åŠæ¥èªæªç¥æš¡å
âââ æ£æ¥çªå£è¿çšæ¯åŠ = æžžæè¿çš (å
éšoverlay)
âââ æ£æ¥çªå£æ¯åŠåšæžžæçªå£ Zåºä¹äž + åæ ·å€§å°
å ·äœæ£æµç¹ïŒ
|
æ£æµé¡¹ |
API |
æ£æµéåŒ |
|
WS_EX_LAYERED |
|
åŠæ == æžžæè¿çšçªå£ â æ£åžžïŒåŠæ != äžèŠçæžžæçªå£ â æ è®° |
|
WS_EX_TRANSPARENT |
åäž |
éæ + èŠçæžžæçªå£ â é«å± |
|
çªå£ Z åº |
|
overlay çªå£æ°å¥œåšæžžæçªå£äžæ¹ â æ è®° |
|
çªå£å€§å°å¹é |
|
å®å šäžèŽ â æ è®° |
|
çªå£ç±»å |
|
“D2DOverlay”ã”ExternalOverlay” ç â çŽæ¥å°çŠ |
ç»è¿æè·¯ïŒ
æ¹æ¡ A: éæºåçªå£å±æ§
- WS_EX_LAYERED å
³é â çš DirectComposition/WinUI æ¿ä»£
- WS_EX_TOPMOST å
³é â çš SetWindowPos + HWND_TOPMOST æ¯æ¬¡ç»å¶å
- çªå£éæºåç§» 1-2pxïŒäžå®å
šå¹é
æžžæçªå£
- ç±»åçšéæº GUID
æ¹æ¡ B: å
æ žæž²æ (äžåå»ºçšæ·æçªå£)
- D3DKMT çŽæ¥åæŸå¡èŸåº
- äžç»è¿ GDI32/USER32 â çšæ·ææ£æµå®å
šæ æ
æ¹æ¡ C: å«ææžžæèªèº«çªå£
- Hook GetDC/BeginPaint â åšæžžæçªå£ DC äžç»å¶
- æ ç¬ç«çªå£ â çªå£æäžŸæ£æµæ æ
- äœéèŠæ³šå
¥ â è§Šåæ³šå
¥æ£æµ
ð¥ æ£æµç»ŽåºŠ 2ïŒå åè¯»åæ£æµ (OpenProcess/RPM)
åäœåŒåäºä»ä¹ïŒ
ObRegisterCallbacks 泚å:
â OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE
â åœä»»äœè¿çšå°è¯ OpenProcess(crossfire.exe) æ¶:
âââ æ£æ¥è¯·æ±ç DesiredAccess
âââ åŠæå
å« PROCESS_VM_READ | PROCESS_VM_OPERATION
âââ äžè°çšè
äžæ¯çœååè¿çš
âââ â StripHandleAccess (å¥çŠ»æé) æçŽæ¥æç»
åš WinDbg äžäœ å¯ä»¥çå°çïŒ
// ACE é©±åšæ³šåçåè°
ObRegisterCallbacks(&CallbackRegistration, &RegistrationHandle);
// åè°äž:
if (DesiredAccess & PROCESS_VM_READ) {
if (!IsWhitelisted(RequestorProcess)) {
// é项1: å¥çŠ» VM_READ æé
*DesiredAccess &= ~PROCESS_VM_READ;
// é项2: çŽæ¥è¿å STATUS_ACCESS_DENIED
return STATUS_ACCESS_DENIED;
}
}
ç»è¿æè·¯ïŒ
æ¹æ¡ A: å
æ žé©±åš RPM
- çšèªå·±ç驱åšéå å°æžžæè¿çš (KeStackAttachProcess)
- çŽæ¥çš MmCopyVirtualMemory 读å
å
- ç»è¿ ObRegisterCallbacks çå¥æä¿æ€
- äœéèŠ: çŸåé©±åš or æŒæŽå©çšå 蜜æªçŸå驱åš
æ¹æ¡ B: 奿嫿
- æŸå°æžžæäžå·²æ PROCESS_VM_READ æéç奿
- éè¿ NtDuplicateObject å€å¶
- äœ ACE ä¹äŒæ³šå Duplicate åè°
æ¹æ¡ C: DMA (Direct Memory Access)
- çš PCIe 硬件 (åŠ Screamer/Future) çŽæ¥è¯»ç©çå
å
- éè¿ FPGA èµ° VT-d æè·¯
- äžç»è¿ Windows å
å管çå± â æäœç³»ç»çº§æ£æµå®å
šå€±æ
- ææ¬: 硬件 200-500 USD + éèŠå FPGA åºä»¶
æ¹æ¡ D: è¿çšæ³šå
¥ (å
éšè¯»å)
- version.dll 代ç嫿 (äœ å·²éªè¯å¯è¡)
- äœ .text 段修æ¹äŒè¢«æ£æµ
- éèŠæŸäžä¿®æ¹ä»£ç çæ³šå
¥æ¹åŒ
ð¥ æ£æµç»ŽåºŠ 3ïŒæªåŸ/ç»é¢åäŒ åæ
åäœåŒåäºä»ä¹ïŒ
åšææ§æªåŸ (æ¯ 3-10 ç§):
âââ æ¹åŒ1: BitBlt 仿žžæçªå£ DC åç»é¢
âââ æ¹åŒ2: Hook Present/EndScene çŽæ¥æ¿ backbuffer
âââ æ¹åŒ3: NvFBC/NvIFR (NVIDIA æŸå¡åž§æè·)
âââ äžäŒ å°æå¡åš
âââ æå¡åšç«¯åæ:
âââ é¢è²çŽæ¹åŸïŒæ¯åŠæéæžžæé¢æçé¢è² (ESP é¢è²)
âââ èŸ¹çŒæ£æµïŒæ¯åŠææ¹æ¡çº¿æ¡
âââ OCR æåïŒæ¯åŠæé¢å€æå
âââ ç®æ æ£æµæš¡åïŒæ¯åŠæç»å¶å
çŽ
å
³é®åž§åé:
âââ 廿ç¬éŽåå 3 åž§å¿
äŒ
âââ 被å€äººäžŸæ¥ â è§Šåé«é¢æªåŸ
âââ åŒåžžç倎ç â å¢å æªåŸé¢ç
ç»è¿æè·¯ïŒ
æ¹æ¡ A: Hook æªåŸåœæ°
- Hook BitBlt â æ£æµå°åäœåŒè¿çšè°çšæ¶è¿åå¹²åç»é¢
- Hook Present â åšåäœåŒæªåŸåæ¹æ ESP
- é®é¢: API hook æ¬èº«å¯èœè¢«æ£æµ
æ¹æ¡ B: è¯å«åäœåŒæªåŸæ¶æº
- åäœåŒæªåŸéåžžåšåž§èŸ¹ç
- åšæªåŸå 1 åž§ææ¶å
³é ESP
- äœéèŠç²Ÿç¡®çæ¶åºåæ¥
æ¹æ¡ C: æž²ææ³ç»è¿
- ESP ç»åšç¬ç«ç overlay surface (äžç»è¿æžžæ backbuffer)
- BitBlt 仿žžæçªå£åå°çç»é¢äžå
å« ESP
- äœç¬ç« overlay è§Šåçªå£æ£æµ (绎床1)
ð æ£æµç»ŽåºŠ 4ïŒæ³šå ¥/DLL 宿޿§æ£æµ
ACE å
æ žé©±åš:
âââ PsSetLoadImageNotifyRoutine
â âââ æ¯æ¬¡ DLL å 蜜 â æ£æ¥çŸå + ååž + è·¯åŸ
âââ æ«æå·²å 蜜暡å:
â âââ EnumProcessModules â è·åææ DLL
â âââ GetModuleFileName â è·¯åŸçœå忝坹
â âââ è®¡ç® .text 段 SHA256 â äžå·²ç¥å¹²åçæ¬æ¯å¯¹
â âââ æ£æµæªç¥ DLL â äžæ¥
âââ ä»£ç æ®µå®æŽæ§:
â âââ åšææ§è¯»å .text 段
â âââ äžæå¡åšäžåçå¹²å hash æ¯å¯¹
â âââ inline hook â hash äžå¹é
â å°çŠ
âââ å æ åæº¯:
âââ æ£æµè°çšæ äžæ¯åŠææªç¥æš¡åçå°å
ç»è¿æè·¯ïŒ
æ¹æ¡ A: æ 代ç ä¿®æ¹æ³šå
¥ (äœ å·²éªè¯)
- VEH + DR 硬件æç¹ â äžä¿®æ¹ .text
- version.dll 代ç嫿 â åæ³å 蜜éŸ
- äœ PsSetLoadImageNotifyRoutine ä»ç¶èœçå° DLL å 蜜
æ¹æ¡ B: ä»£ç æ®µéæ å°ç»è¿ååžæ ¡éª
- Hook å: ä¿ååå§åè
- Hook æ¶: ä¿®æ¹ä»£ç
- æ ¡éªå: æ¢å€åå§åè (éè¿ VEH æè·æ ¡éªè¯»å)
- äœéèŠç²Ÿç¡®æè· ACE çæ ¡éªæ¶æº
æ¹æ¡ C: 驱åšçº§éè
- ä» PEB->Ldr->InLoadOrderModuleList äžæé€ DLL èç¹
- ä» VAD æ äžç§»é€æ å° (MmUnmapViewOfSection çé«çº§æå·§)
- æåšæ å° (Manual Map) â äžèµ°ç³»ç»å 蜜åš, PsSetLoadImageNotify äžè§Šå
ð æ£æµç»ŽåºŠ 5ïŒDirectX Hook æ£æµïŒå éš ESPïŒ
åŠæäœ éæ©å éšæž²æè·¯çº¿ïŒ
|
Hook ç±»å |
æ£æµæ¹æ³ |
|
vtable hook |
æ¯å¯¹ vtable æéæ¯åŠæåå·²ç¥æš¡åå |
|
inline hook |
.text 段 hash äžå¹é |
|
IAT hook |
æ¯å¯¹ IAT äžçå°åæ¯åŠ = åå§å¯Œåºå°å |
|
Detours/MinHook |
è·³æ¿ä»£ç äžåšåå§æš¡åèåŽ â æ£æµå° |
|
Present hook |
ID3D11DeviceContext::Present å°å â d3d11.dll èåŽ |
ð æ£æµç»ŽåºŠ 6ïŒè¡äžºç¹åŸ + æºåšåŠä¹
æå¡ç«¯æ°æ®:
âââ æ¯å±ç»è®¡: ç倎çãK/Dãååºæ¶éŽ
âââ éŒ æ 蜚迹: æ¯åŠåºç° "ç¬ç§»" (aimbot snap)
âââ è§è§è¿œèžª: æ¯åŠæç»éå®æäººéªšéªŒ
âââ é¢çè¡äžº: å¢åé¢çæäººäœçœ®çæŠç
âââ äžŸæ¥æ°æ®: ç©å®¶äžŸæ¥äœäžºè§Šåæ¡ä»¶
æš¡åæå:
âââ æ£åžžç©å®¶åæ°: 0-30
âââ å¯ç: 30-60 â å¢å æªåŸé¢ç
âââ é«å¯ç: 60-80 â 宿¶çæ§ + åœå
âââ 确讀: 80-100 â èªåšå°çŠ
äžãæ¹æ¡éè§ç»è¿ïŒæ¹æ¡å¯¹æ¯ç©éµ
|
æ¹æ¡ |
çªå£æ£æµ |
RPMæ£æµ |
æ³šå ¥æ£æµ |
æªåŸæ£æµ |
å®ç°éŸåºŠ |
æä¹ æ§ |
|
å€éš overlay |
â çŽæ¥è§Šå |
â RPMè¢«æŠæª |
â æ æ³šå ¥ |
â ïž åå³äºæªåŸæ¹åŒ |
â â |
äœ |
|
å æ žé©±åš RPM + DMA overlay |
â çªå£å±æ§æ··æ· |
â å æ žè¯» |
â æ æ³šå ¥ |
â ïž |
â â â â â |
é« |
|
DMA硬件 + FPGAæž²æ |
â æ çšæ·æçªå£ |
â ç©çå å读 |
â æ æ³šå ¥ |
â ç¬ç«æž²æå± |
â â â â â |
æé« |
|
å éšæ³šå ¥ + çªå£å«æ |
â ç»åšæžžæçªå£äž |
â å éšè¯» |
â æ³šå ¥æ£æµ |
â ç»åš backbuffer |
â â â â |
äž |
|
驱åšçº§ Manual Map + Present Hook |
â å éšæž²æ |
â å éšè¯» |
â ïž é«çº§éè |
â éèŠæž çæ¶æº |
â â â â â |
äž |



没æåå€å 容