1 điểm bởi GN⁺ 2025-01-21 | 1 bình luận | Chia sẻ qua WhatsApp
  • TAC (Treyarch Anti-Cheat) của Black Ops Cold War là anti-cheat ở user mode, không có kernel driver Ricochet, nhưng có cấu trúc mã khá tương đồng với các bản Call of Duty mới hơn
  • Lớp bảo vệ sử dụng kết hợp mã hóa tệp thực thi, checksum, làm rối jmp, làm rối entry point của Arxan cùng với cơ chế mã hóa con trỏ của dòng Treyarch/IW
  • TAC thực hiện nhiều cơ chế phát hiện ở user mode như tra cứu API bằng hash lúc runtime, kiểm tra pattern hook API, kiểm tra debug register, phát hiện Windows test signing, phát hiện cấp phát console, phát hiện DirectX/overlay
  • Overlay bên ngoài được thu thập thông tin về kiểu cửa sổ, vị trí, display affinity, danh sách module của tiến trình rồi tải lên máy chủ; các trình quét bộ nhớ kiểu Cheat Engine có thể bị phát hiện bằng virtual memory honeypot
  • Kỹ thuật độc đáo nhất là syscall stub tùy biến được mã hóa, giúp vượt qua hook của ntdll và khiến nguồn gốc syscall trông như đến từ một hàm ntdll khác, gây khó khăn cho việc giám sát

Đối tượng và phạm vi phân tích

  • Đối tượng phân tích là anti-cheat ở user mode bên trong Black Ops Cold War, được gọi là TAC (Treyarch Anti-Cheat)
  • Black Ops Cold War không có thành phần kernel mode của Ricochet như trong Modern Warfare 2019 và các tựa game về sau
  • Khác biệt lớn với các bản Call of Duty mới là driver kernel mode; phần lớn mã anti-cheat vẫn ở user mode và rất giống TAC
  • Pseudocode của hàm là dạng tái dựng vì kết quả decompile thực tế quá phức tạp do bị làm rối và có mã resolve
  • Một số nội dung đã được lược bỏ để tránh cổ vũ hành vi gian lận hoặc vượt qua cơ chế bảo vệ

Arxan và bảo vệ tệp thực thi

  • Arxan là công cụ làm rối và bảo vệ được dùng trong nhiều game Call of Duty từ Black Ops 3 trở đi
  • Giải mã tệp thực thi lúc runtime
    • Tệp thực thi của game được pack và mã hóa
    • Arxan chèn mã vào quá trình khởi động để unpack và giải mã tệp thực thi thật của game
  • Checksum tệp thực thi
    • Arxan liên tục giám sát việc vá tệp thực thi của game
    • Nếu phát hiện debugger hoặc checksum không khớp, tiến trình sẽ bị kết thúc
  • Làm rối jmp
    • Chèn nhiều lệnh jmp giữa các chỉ thị của hàm để gây khó cho phân tích tĩnh
    • Khi một hàm lớn bị chèn hàng trăm lệnh nhảy, phân tích của IDA có thể bị phá vỡ và cần công cụ bên ngoài
  • Làm rối entry point
    • Mã Arxan được bảo vệ sẽ unpack và thực thi entry point thực sự
    • Đoạn này cũng có thể bị làm rối bằng jmp, khiến việc lần theo luồng thực thi trở nên khó khăn

Mã hóa con trỏ

  • Các con trỏ quan trọng được mã hóa và giải mã ngay trước khi sử dụng
    • đối tượng toàn cục hiện tại của game
    • mảng entity
    • con trỏ object, v.v.
  • Cùng một cơ chế mã hóa có 16 biến thể, và địa chỉ PEB hiện tại quyết định sẽ dùng kiểu nào
  • Cách làm này cản trở việc pointer scan của Cheat Engine
    • giá trị lưu trong biến toàn cục chỉ là giá trị đã mã hóa
    • giá trị đã giải mã chỉ tồn tại trên stack
  • Muốn lấy được con trỏ đã giải mã thì cần dùng công cụ theo dõi lệnh giải mã, hoặc hook vào điểm game đã giải mã sẵn

Tra cứu API lúc runtime và phát hiện hook

  • TAC dùng hàm tra cứu API lúc runtime được inline
    • nhận hash của module và hash tên API
    • duyệt danh sách module đã nạp và hash tên của chúng
    • duyệt các hàm export của module rồi so sánh với hash tại thời điểm biên dịch
  • Việc nhận diện hash được thực hiện bằng danh sách module đã nạp trong tiến trình game và hàm hash của game
    • tính hash của tên module và tên export
    • lấy thủ công base hash và function hash từ kết quả decompile để đối chiếu API đang được gọi là gì
  • Hash không giống nhau giữa các phiên bản game
  • Vì con trỏ hàm được lưu trong biến toàn cục, cũng có thể nhận diện bằng cách so sánh địa chỉ ảo với các hàm export trong DLL đã nạp
  • Cơ chế phát hiện hook API của TAC hiện chỉ kiểm tra 7 pattern
    • các stub kiểu push/movabs/xchg/ret
    • push imm rồi ret
    • call
    • jmp [rip+x]
  • TAC không kiểm tra mọi API quan trọng mà chỉ kiểm tra các API chính nó sử dụng

Phát hiện debug register và test signing của driver

  • Debug register có thể được dùng như một cách hook không vá mã để vượt qua cơ chế giám sát vá .text của Arxan
  • TAC kiểm tra các giá trị DR0~DR3 trong thread context
    • nếu có giá trị, nó sẽ gọi callback với thông điệp khác nhau tùy có thuộc tiến trình hiện tại hay không
    • sau đó luồng sẽ chuyển sang hàm kết thúc
  • DR0~DR3 là privileged register nên không thể đọc trực tiếp bằng assembly thông thường; phải lấy qua kernel Windows hoặc qua chuyển tiếp ngoại lệ
  • Chế độ test của Windows cho phép chạy driver kernel mode không có chữ ký hợp lệ
  • TAC dùng NtQuerySystemInformation để kiểm tra xem test signing có đang bật hay không
    • chỉ riêng việc bị phát hiện này chưa dẫn đến ban trực tiếp nhưng tài khoản sẽ bị gắn cờ

Cách kết thúc tiến trình

  • TAC có hai cách để kết thúc tiến trình
  • Cách thứ nhất là xóa các thanh ghi rồi gọi NtTerminateProcess
    • đặt RCX thành -1
    • nếu phát hiện NtTerminateProcess đã bị hook thì sẽ không dùng cách này
  • Cách thứ hai là xóa các thanh ghi rồi nhảy đến 0x0 để làm tiến trình crash
  • Cả hai cách đều xóa các thanh ghi quan trọng nên rất khó khôi phục

Phát hiện console, hiển thị trực quan và overlay

  • Cheat nội bộ có thể dùng AllocConsole để in log hoặc làm menu
  • TAC kiểm tra cửa sổ console hoặc ConsoleHandle trong PEB để phát hiện việc cấp phát console
  • Thành phần hiển thị nội bộ thường được vẽ lên màn hình bằng hook vào graphics API
    • các bản Call of Duty hiện đại dùng DirectX 12
    • mục tiêu hook phổ biến là IDXGISwapChain::Present
    • với DirectX 12, cần command queue và ID3D12CommandQueue::ExecuteCommandLists là điểm lấy phổ biến
  • OBS Studio, Streamlabs OBS, Discord game overlay và Steam game overlay cũng có thể hoạt động ở vị trí tương tự
    • Steam và Discord thực hiện vẽ
    • nhóm OBS sẽ chụp ảnh render khi dùng game capture
  • TAC hiện không quét chính hàm DXGI present mà kiểm tra con trỏ present trong vtable

Cheat bên ngoài và phát hiện dựa trên cửa sổ

  • Cheat bên ngoài nhiều khả năng tạo một overlapped window phủ lên trên cửa sổ game
  • TAC duyệt tất cả cửa sổ và dùng GetWindowLongA để kiểm tra kiểu WS_EX_LAYERED
  • Sau đó dùng GetWindowRect để so sánh xem có chồng lấp với cửa sổ game hay không
    • nếu tỷ lệ chồng lấp từ 0.5 trở lên và số mục cache nhỏ hơn 8 thì lưu hwnd đó
    • có xuất hiện các giá trị tương ứng với độ phân giải ví dụ 1920x1080
  • Các cửa sổ đã cache sẽ được điều tra thêm ở hàm khác
    • kiểm tra văn bản cửa sổ bằng GetWindowTextW
    • kiểm tra tên lớp bằng GetClassNameA
    • kiểm tra display affinity bằng GetWindowDisplayAffinity
  • TAC cũng kiểm tra trường hợp dùng SetWindowDisplayAffinityWDA_EXCLUDEFROMCAPTURE để ẩn khỏi công cụ quay/chụp màn hình
  • Thông tin liên quan đến cửa sổ được lưu vào bộ đệm mã hóa và tải lên máy chủ
    • văn bản cửa sổ
    • tên lớp
    • vị trí và kiểu cửa sổ
    • display affinity
    • danh sách module và tên exe của tiến trình sở hữu cửa sổ chồng lấp
  • Tiến trình của cửa sổ chồng lấp được mở bằng OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION), rồi thu thập tên module bằng K32EnumProcessModulesK32GetModuleFileNameExW

Phát hiện trình quét bộ nhớ kiểu Cheat Engine

  • Cheat Engine khá dễ bị phát hiện vì cách hoạt động của bộ nhớ ảo trên Windows
  • Dù chương trình cấp phát bộ nhớ ảo bằng VirtualAlloc, vùng đó vẫn chưa được backing bằng bộ nhớ vật lý trước khi bị truy cập
  • Game có thể cấp phát bộ nhớ rồi không dùng tới
  • Nếu Cheat Engine hoặc tab memory của Process Hacker quét vùng đó, sẽ phát sinh truy cập và bộ nhớ chuyển sang trạng thái valid
  • Honeypot kiểu TAC dùng K32QueryWorkingSetEx để kiểm tra xem địa chỉ ảo đó đã thực sự bị truy cập hay chưa, từ đó phát hiện trình quét bộ nhớ

Cản trở quét signature

  • Hacker game thường dùng signature scanning để cheat vẫn tự hoạt động sau mỗi lần cập nhật
  • Ý tưởng của Treyarch là bảo vệ vùng quanh return address của những hàm không bị gọi lại bằng PAGE_NOACCESS
  • Signature scanner sẽ đọc byte của tệp thực thi từ đầu đến cuối để tìm pattern
  • Nếu kiểm tra khả năng truy cập ở từng byte thì rất chậm, nên khi chạm vào vùng PAGE_NOACCESS, tiến trình có thể bị crash
  • Đây không phải biện pháp chặn tuyệt đối nhưng có thể khiến nhiều người phân tích gặp khó khăn

Chống debug

  • Các kiểm tra anti-debug của riêng TAC khá đơn giản, nhưng Arxan cũng cung cấp kỹ thuật anti-debug riêng
  • TAC duyệt tất cả thread của tiến trình hiện tại
    • dùng CreateToolhelp32Snapshot và thread snapshot
    • kiểm tra DbgSsReserved trong TEB của từng thread để phát hiện sự tồn tại của DebugObject
  • Cũng có kỹ thuật ghi vào vùng nhớ bất thường để tạo access violation
    • nếu mã tiếp tục chạy đến điểm sau ngoại lệ thì TAC cho rằng debugger đã xử lý hoặc vượt qua ngoại lệ đó
  • TAC cũng dùng CheckRemoteDebuggerPresent
  • ThreadHideFromDebugger khiến ngoại lệ được gửi cho tiến trình thay vì debugger
    • khi debugger cố dừng tiến trình, có thể phát sinh ngoại lệ STATUS_BREAKPOINT khiến tiến trình bị kết thúc
    • ở user mode không thể unset cờ này
    • chiến thuật này được thực thi trong TLS callback trước entry point của tệp thực thi

Giám sát lưu lượng mạng

  • TAC không lưu toàn bộ kết nối đang hoạt động mà chỉ tìm một số điều kiện cụ thể
  • Đối tượng phát hiện là cách tạo máy chủ mạng cục bộ bên trong tiến trình game
    • kẻ gian ghi shellcode vào tiến trình game
    • khởi động máy chủ mạng bên trong tiến trình game
    • ứng dụng bên ngoài trao đổi dữ liệu với máy chủ cục bộ này
  • TAC lấy bảng TCP bằng GetTcpTable2, rồi so sánh các kết nối do tiến trình hiện tại tạo ra với quan hệ cổng của tiến trình khác để phát hiện điều kiện này

Syscall stub tùy biến được mã hóa

  • Nhiều API export của ntdll thực hiện syscall ở bên trong
  • Dùng syscall stub tùy biến có thể vượt qua hook của hàm ntdll do cheat ở user mode cài vào
  • Syscall có thể lộ ra với instrumentation callback
    • instrumentation callback được gọi sau syscall
    • địa chỉ trả về sẽ là ngay sau lệnh syscall
  • TAC dùng syscall stub được mã hóa để khiến việc phân tích tĩnh khó hơn
  • Stub được dựng sau khi bảo vệ một vùng lớn được cấp trong section .text ở chế độ write/execute
  • Nó tìm lệnh syscall trong NtReadFile, rồi dùng giá trị thời gian CPU như yếu tố ngẫu nhiên để thay đổi vị trí
  • Với bên giám sát, syscall có thể trông như phát sinh từ một hàm ntdll ngẫu nhiên
    • syscall thực tế có thể không phải là NtReadFile
    • nếu không kiểm tra syscall index trong eax thì khó biết đó là syscall nào
  • Có ví dụ cho thấy vị trí lệnh syscall thay đổi giữa các lần chạy lại

Phát hiện vượt qua cơ chế ẩn anti-debugger

  • Muốn thiết lập ThreadHideFromDebugger thì phải gọi NtSetInformationThread
  • Kẻ gian có thể hook API này và buộc nó trả về thành công
    • khi đó anti-cheat tưởng rằng việc ẩn đã thành công nhưng thực tế có thể không có gì xảy ra
  • TAC kiểm tra kết quả gọi với tham số sai để bắt các hook làm cẩu thả
    • nếu một lời gọi lẽ ra phải thất bại vì sai tham số độ dài mà lại thành công thì sẽ bị phát hiện
    • có ví dụ cho thấy debugger và môi trường ScyllaHide trả về giá trị khác nhau
    • cũng có trường hợp hook luôn trả về thành công cho yêu cầu ThreadHideFromDebugger với handle giả

Chặn tạo remote thread

  • TAC cài exception handler gọi TerminateThread trên thread hiện tại khi gặp ngoại lệ STATUS_PRIVILEGED_INSTRUCTION
  • DLL manual mapping cần có cách thực thi shellcode trong tiến trình từ xa, và cách phổ biến là CreateRemoteThread
  • TLS callback trong Windows PE có thể được gọi trước thread entry point khi thread được tạo
  • TAC kiểm tra địa chỉ bắt đầu trong context của thread mới
    • lấy Win32 start address bằng NtQueryInformationThread
    • duyệt danh sách module đã nạp để kiểm tra xem địa chỉ bắt đầu có nằm trong phạm vi module hợp lệ hay không
  • Nếu địa chỉ bắt đầu không nằm trong phạm vi của bất kỳ module đã nạp nào, nó sẽ ghi nhận phát hiện rồi tạo ngoại lệ privileged instruction để kết thúc thread đó

Các kiểm tra khác và kết luận

  • Có đoạn mã kiểm tra chưa rõ mục đích là xác nhận AllocationGranularity của NtQuerySystemInformation có bằng 0x10000 hay không
    • có vẻ như để gắn cờ máy ảo hoặc bản Windows tùy biến
  • TAC phụ thuộc khá nhiều vào danh sách module đã liên kết, nên nó kiểm tra xem InMemoryOrderModuleList trong PEB có phải là danh sách rỗng hay không
    • nếu biến thành rỗng, bản thân tiến trình có thể bị hỏng
  • Cuối cùng, TAC là một anti-cheat user mode có các chức năng sau
    • tra cứu API lúc runtime
    • phát hiện hook làm cẩu thả
    • phát hiện overlay bên ngoài
    • phát hiện hook DirectX nội bộ
    • kiểm tra hook trên các API nó sử dụng
    • kiểm tra debugger và dấu vết debug
    • phát hiện AllocConsole
    • phát hiện CreateRemoteThread
    • syscall stub giả mạo và được mã hóa
  • Arxan hỗ trợ TAC bằng khả năng làm rối mạnh, cản trở phân tích tĩnh, kỹ thuật phá IDA Pro, giám sát sửa đổi .text, và chức năng anti-debug riêng
  • Mã tương tự TAC cũng được dùng trong các game Call of Duty hiện đại

1 bình luận

 
GN⁺ 2025-01-21
Ý kiến trên Hacker News
  • Năm 2021, tài khoản CS:GO trên Linux của tôi gặp vấn đề với chỉ số độ tin cậy, tụt xuống màu vàng rồi sau đó là màu đỏ; không phải lệnh cấm chính thức nhưng trên thực tế hoạt động như một hình thức trừng phạt
    Kết quả là tôi liên tục bị ghép trận với cheater, khiến việc tìm đồng đội trở nên khó khăn
    Sau này tôi biết rằng những người dùng Linux khác dùng GPU Radeon và VRAM từ 16GB trở lên cũng gặp vấn đề tương tự, nên đã tạo một issue trên GitHub để theo dõi: https://github.com/ValveSoftware/csgo-osx-linux/issues/2630
    Tìm hiểu thì có vẻ Valve đang phạt những người dùng Linux có một số cấu hình phần cứng nhất định, đặc biệt là card Radeon có VRAM từ 16GB trở lên, vốn lúc đó còn khá mới
    Cuối cùng, sau khi một người dùng liên hệ trực tiếp với gaben, vấn đề đã được sửa: https://github.com/ValveSoftware/csgo-osx-linux/issues/2630#...
    Tôi đoán có thể đó là kết quả của việc Valve quan tâm đến trải nghiệm người dùng Linux khi chuẩn bị ra mắt Steam Deck

    • Cũng có thể Gabe Newell đơn giản là người tốt chăng?
    • Tôi không rõ việc phạt người dùng Linux thì làm sao cải thiện trải nghiệm người dùng Linux được
      Dù vậy vẫn khá thú vị
    • Tôi tò mò làm sao họ biết được chỉ số độ tin cậy đã tụt xuống vàng rồi đỏ
      Không biết là họ suy đoán từ chất lượng trận đấu kém đi, hay có cách nào để kiểm tra
      Theo tôi hiểu thì chỉ số độ tin cậy được ẩn đi để tránh bị lạm dụng
  • Cheating rốt cuộc là vấn đề con người
    Các biện pháp bảo vệ và heuristic được mô tả trong bài có thể lọc được 90% cheater lộ liễu, và về cơ bản tôi cho rằng anti-cheat như vậy là hướng đi tốt
    Tuy nhiên anti-cheat phải vận hành một cách thận trọng, và cuối cùng thì người chơi cùng quản trị viên mới là bên phải giải quyết
    Game multiplayer online nhất thiết phải chạy trên server do con người quản lý, và phải có quản trị viên hiện diện trong phần lớn thời gian người chơi đang kết nối
    Nếu có thể thì càng tốt khi đó là quản trị viên mà người chơi nhận ra; khi không có quản trị viên, cũng cần có các hình thức điều tiết nhẹ hơn như vote kick hoặc vote ban
    Không có khác biệt bản chất nào giữa việc đuổi cheater và đuổi người lạm dụng chat
    Rốt cuộc, tôi cho rằng hình thức server khả thi duy nhất cho game multiplayer online là server riêng hoặc server cộng đồng
    Quá trình kiểm soát cheater và kẻ lạm dụng không nên là kiểu nhận báo cáo qua hệ thống report rồi xử lý bất đồng bộ; quản trị viên game phải nhanh chóng kick hoặc ban
    Nếu một game chỉ cho chơi online qua server matchmaking của nhà phát hành, và cách xử lý cheater hay người lạm dụng chat chỉ là gửi report qua biểu mẫu web, thì đừng mua hay chơi nó; hãy bỏ phiếu bằng ví tiền của mình

    • Điều kiện rằng game multiplayer online nhất thiết phải chạy trên server do con người quản lý nghe khá vô lý nếu xét đến quy mô
    • Nghe giống như nói rằng mỗi game nên có một trọng tài mà ai cũng thấy, rồi cứ mỗi lần có vi phạm thì cho xem lại video
      Có thể còn lập hẳn một tổ chức riêng chỉ để giám sát trọng tài, nhưng tốt hơn là cứ chơi game thôi
    • Tôi không hiểu vì sao chỉ quản lý bởi con người mới được xem là giải pháp khả thi duy nhất
      Apex Legends vận hành tốt nhờ hệ thống report và anti-cheat mạnh, còn Rocket League thì phần lớn cơ chế điều tiết tự động cũng hoạt động hiệu quả
    • Nhìn chung tôi đồng ý, nhưng cũng có những cách khác
      Có thể dùng số điện thoại, xác minh thủ công bằng ảnh, yêu cầu chơi 10 giờ trước khi vào đấu xếp hạng, đề cử từ người chơi khác, hoặc thêm một game pass trả một lần 5 USD trên các điều kiện đó
      Nếu chưa xem, tôi khuyên nên xem bài trình bày về AI anti-cheat của Valve
      Công việc đó khá thú vị, và họ tuyên bố bắt được 99% cheater
      Tất nhiên vẫn còn những cách cheat rất tinh vi
  • Tôi đã có cuộc chiến pháp lý kéo dài 2 năm để lật ngược lệnh cấm vĩnh viễn sai của Activision, và Activision thua kiện vì không đưa ra được bất kỳ bằng chứng cheating nào: https://antiblizzard.win/2025/01/18/my-two-year-fight-agains...

    • Tôi cũng gặp y hệt trong League of Legends
      Tôi chưa từng cheat, nhưng bị ban không có giải thích; tôi chơi thường xuyên ba tài khoản, còn hai tài khoản kia thì không bị ban
      Bộ phận hỗ trợ khách hàng cứ lặp lại “sau khi xem xét, lệnh cấm là đúng”, và không cung cấp bất kỳ thông tin nào để tôi biết mình đã làm sai gì mà sửa
      Tôi sở hữu vài skin hiếm nhất trong game, đã chơi hàng nghìn giờ từ năm 2009, chỉ chơi ARAM; thật vô lý khi cho rằng tôi lại đem một tài khoản có giá trị tình cảm lớn ra để cheat trong chế độ casual nhất
      Chưa có chuyện gì liên quan đến game khiến tôi stress hơn thế, và nhờ một người quen trong ngành kiểm tra nội bộ, lệnh cấm đã được gỡ mà không có lý do rõ ràng
      Tôi vẫn chơi, nhưng hầu như lần nào cũng nhớ đến lệnh cấm sai đó, và có lẽ League sẽ là game multiplayer cạnh tranh cuối cùng mà tôi bỏ thời gian vào
      Tôi cũng có cảm giác không muốn chơi nữa vì sợ chuyện như vậy lại xảy ra
    • Tôi cũng từng bị cấm vĩnh viễn sai
      Trên console gần như không thể cheat, tôi mất quá nhiều thời gian mới leo được đến mức Gold 1 bình thường trong ranked, và chưa từng bị cảnh cáo hay report vì bất kỳ hành vi nào, vậy mà bị cấm vĩnh viễn không giải thích
      Thay vì chiến đấu như tác giả bài viết, tôi quyết định sẽ không bao giờ chi tiền cho sản phẩm của Activision nữa, và tôi nghĩ mọi người cũng nên làm vậy
    • Đoạn nói rằng nếu bạn chơi giỏi trong game, ai đó xem hồ sơ của bạn để kiểm tra thời gian chơi rồi lập tức thấy một nhãn đỏ “tôi là cheater” khiến tôi tự hỏi liệu nhãn đó có thể bị xem là phỉ báng không
      Ở Mỹ có lẽ khó hơn, nhưng tôi hiểu là ở Anh hoặc England, bị đơn phải chứng minh điều đó là sự thật
    • Thật kinh khủng khi phải trải qua một cuộc chiến như vậy
      May là tôi hầu như không chơi shooter multiplayer, và tôi chắc sẽ rất ghét nếu mất cả thư viện Steam khổng lồ của mình
    • Chỉ riêng bài viết này cũng đáng được submit riêng, và là một bài rất thú vị
  • Rất tò mò về làm rối lệnh nhảy
    Sẽ rất hay nếu ai đó đã reverse engineering sâu hơn có thể trả lời
    Tôi thắc mắc liệu các lệnh nhảy vô điều kiện có phổ biến đến mức khó lọc bằng một số điều kiện tiên quyết cụ thể hay không; cuối hàm có lệnh trả về nên có vẻ dễ tìm, nhưng liệu có thể phân tích stack để biết hàm sẽ trả về đâu rồi tìm lệnh gọi ngay trước địa chỉ trả về không
    Tôi chưa lập trình assembly x86 nhiều nên có thể đã hiểu sai cách nó hoạt động

    • Có những kỹ thuật rất hay dùng thực thi ký hiệu với các emulator như angr hoặc https://github.com/cea-sec/miasm để gỡ phẳng hóa đồ thị luồng điều khiển
      Cũng có thể thực hiện các phân tích thú vị bằng framework PIN của Intel
      Một số bài viết có thể hữu ích ở đây: https://calwa.re/reversing/obfuscation/binary-deobfuscation-..., https://www.nccgroup.com/us/research-blog/a-look-at-some-rea...
    • Lệnh nhảy vô điều kiện rất phổ biến, và assembly x86 sau tối ưu hóa nhìn chung cực kỳ lộn xộn
      Nhiều hàm không kết thúc bằng ret
    • Video này reverse engineering một phần Guitar Hero 3, có thể sẽ thú vị vì nó đề cập đến các kỹ thuật tương tự được dùng để làm rối mạnh mã game: https://www.youtube.com/watch?v=A9U5wK_boYM
    • Có một vài vấn đề thường gặp
      Một số lệnh nhảy là giả, và một số lệnh nhảy đi vào giữa một lệnh máy
      Decompiler không xử lý được tình huống có hai lệnh ở cùng một vị trí
      Ví dụ như trong jmp 0x1234, bỏ qua opcode jmp và giả định 0x1234 là một lệnh hợp lệ
      Ở một số nhánh, stack bị hỏng, nhưng có thể đó là chủ ý để cố tình gây exception
      Vì vậy có thể sửa decompile bằng cách đổi các lệnh như lea RAX, [rsp + 0x99999999999] thành nop, nhưng cũng có thể bỏ lỡ exception được chủ ý tạo ra
      IDA xử lý những thứ như vậy không tốt nên tôi đang dùng license Binary Ninja, và có thể dễ dàng viết script để inline hàm cho decompiler
      Tôi cho rằng IDA khó xử lý đúng các trường hợp những lệnh nhảy tái sử dụng các khối mã của nhau, vì một khối mã giữa các lệnh nhảy chỉ có thể thuộc về một hàm
      Có vẻ mọi người ít dùng Binary Ninja hơn vì nó từng có lỗi với game của Blizzard, nhưng lỗi đó đã được sửa qua một bug report khoảng một năm trước
    • Các lệnh nhảy cụ thể này trông có vẻ đủ dễ để lọc ra
      Đây là kiểu làm rối nhằm gây khó chịu cho người dùng các công cụ phổ biến có sẵn, đặc biệt là IDA Pro
      Phần lớn obfuscation chỉ nhằm khiến mọi người khó chịu đủ để chuyển sang dự án khác
  • Hành vi tước bỏ tính năng sản phẩm sau khi bán nên bị pháp luật ngăn cấm, dù có trong hợp đồng hay EULA
    Việc bị chặn không được tước luôn quyền sở hữu trò chơi, và nếu như vậy thì phải hoàn tiền
    Nếu phải đi đến phán quyết mới buộc được hoàn tiền, thì ngoài phí license, phí luật sư, chi phí tòa án còn phải có bồi thường thiệt hại gấp 3 lần
    Chẳng hạn, việc bị chặn trên Steam khiến mọi giao dịch mua bị vô hiệu hóa nên là điều không thể về mặt pháp lý
    Ngay cả khi không đăng nhập được tài khoản, vật phẩm và kho đồ vẫn phải có thể giao dịch, vì đó là những thứ khách hàng đã trả tiền và bỏ thời gian thật để có được
    Nếu muốn thực thi quy tắc đạo đức trong game multiplayer thì hoặc không được thu tiền cho game, hoặc người dùng trả phí phải có quyền liên quan đến việc bị chặn
    Việc chặn phải tuân theo nguyên tắc tương xứng, và phải có quy trình cùng hồ sơ kháng cáo với con người tham gia, chi phí được giới hạn bằng giá license và chỉ phải chịu nếu thua kiện

    • Cheat cũng không khiến bạn bị chặn khỏi Steam
      Trường hợp tệ nhất là tài khoản bị gắn một dấu bêu xấu công khai trong các game VAC
      Mọi người chơi game multiplayer để giải trí và tương tác với người khác, nên nếu hành vi cheat hay hành vi xấu khác ảnh hưởng đến người khác thì nên bị chặn sử dụng dịch vụ multiplayer
    • Tôi không hiểu nó khác gì với việc chạy quá tốc độ khi lái xe
      Nếu gây phiền hà cho xã hội thì phải trả giá là một nguyên tắc khá phổ biến
    • Tôi thấy cheater bị xử lý thích đáng thì ổn
      Tôi nghĩ họ mất tiền thật cũng được
      Nhưng bị chặn do nhầm lẫn lại là chuyện khác
      Và thứ bị chặn không phải toàn bộ tài khoản Steam mà là game cụ thể không thể chơi nữa, đúng không?
    • Có lẽ cứ gắn nhãn cheater cho họ và chỉ cho họ chơi với các cheater khác là được
    • Nếu bạn cheat hoặc phá hỏng game của người chơi khác thì mất quyền truy cập là xứng đáng
      Những người chơi khác cũng đã trả tiền
  • Trong COD thì cũng chẳng cần phải cheat
    Game có quá nhiều bug đến mức nó làm thay bạn
    Trong ranked đôi khi game load súng thay vì dao, và chuyện đó có thể xảy ra vì trong phần kiểm tra trang bị súng ranked có một case hoặc if-else rõ ràng sai; có vẻ nếu khẩu súng hiển thị trong bộ chọn trang bị không được phép thì nó mặc định thành XM4
    Đây gần như là game duy nhất tôi biết mà phiên bản ranked còn hỏng hơn phiên bản casual

  • Tôi tò mò không biết những thứ như thế này được học ở đâu
    Tôi muốn học thêm đến mức có thể hiểu được dù chỉ một nửa bài viết, nhưng không biết nên bắt đầu từ đâu

    • Khoảng 15 năm trước, tôi đã học được rất nhiều khi đọc cuốn Reversing: Secrets of Reverse Engineering của Eldad Eilam
      Dù là sách cũ nhưng rất hay, giúp mình theo được nhiều kỹ thuật và bài thực hành
      Các công cụ hiện đại đã hơi khác so với thời đó, nhưng tập lệnh x86 và assembly nói chung thì không thay đổi nhiều
      Một trong những thu hoạch lớn nhất là biết đến crackme
      Đó là các binary thử thách nhỏ được tạo ra để học reverse engineering, giống như ổ khóa luyện tập trong cộng đồng lockpicking
      Tôi nhớ trong sách có kèm CD-ROM chứa nhiều cái như vậy, và nếu tìm trên mạng cũng có rất nhiều
      Tự tay làm những bài luyện tập kiểu này chính là cách để học
      Đừng bắt đầu bằng cách cố reverse engineering COD ngay, mà phải tích lũy từng bước
    • Trước đây tôi bắt đầu bằng tutorial Lena151: https://github.com/kosmokato/Lena151
    • Nếu là ngày xưa thì tôi đã bảo bạn vào Gamedeception để giao lưu, nhưng có vẻ nó đã biến mất vài năm trước
      Xin chào những ai từng xem UnknownCheats, cs.rin.ru, v.v.
    • UnknownCheats là một trong những nơi tốt nhất cho loại tài liệu này
      Tôi cũng đang hoạt động ở đó, và đặc biệt quan tâm hơn đến anti-cheat ở user space trên Linux, nhất là cách VAC hoạt động
    • https://pwn.college là tài liệu học tập rất tuyệt
  • Tôi từng reverse engineering một chút một MMO nổi tiếng dựa trên Horde/Alliance, và nó gần như đi theo cùng các bước, bao gồm cả hash export FNV32
    Thấy họ dùng các trick rất giống nhau nên trông gần như cùng một cách làm
    Không biết có phải nó được pack bằng cùng công nghệ bảo vệ không

    • Engine Source 2 cũng dùng fnv để hash schema, tức là các thuộc tính entity
    • Nếu sau sáp nhập họ tái sử dụng Warden cho tài sản trí tuệ của Activision thì cũng hợp lý
  • Signature scanning thật sự rất mạnh
    Đó cũng là phần gây nghiện nhất với tôi trong reverse engineering
    Quá trình tạo danh sách signature rồi viết binding cho ngôn ngữ script để có thể gọi các function pointer đó rất thú vị
    Nó cũng là nền tảng của nhiều nền tảng mod bên thứ ba, vì cần cung cấp cho modder các API có ý nghĩa mà nhà phát triển chính không công khai

    • Tôi không biết signature scanning là gì, nhưng đã tìm được tài liệu cho ai tò mò: https://www.unknowncheats.me/forum/general-programming-and-r...
    • Đúng vậy
      Tôi biết một số plugin của engine Source cũng dùng cách này khi cần
      Tuy nhiên, có vẻ đa số dùng offset của con trỏ bảng hàm ảo
  • Tôi tự hỏi liệu việc định kỳ ký điện tử trạng thái game, hoặc đưa vào một dạng proof of work nào đó để chống cheat có khả thi hay có ý nghĩa không
    Tôi bắt đầu nghĩ rằng cheating là một vấn đề quá khó để ngăn chặn
    Tôi đang làm một FPS online nhỏ, chi phí thấp, và thay vì cài phần mềm anti-cheat, tôi đang nghĩ đến việc để người dùng tin tưởng lẫn nhau và tự phát hiện cheater, hoặc dùng AI như Valve
    Có lẽ tôi sẽ để người chơi tự quản lý và vận hành server
    Có thể đặt các điều kiện như liên kết số điện thoại, điểm danh tiếng do người chơi khác đưa ra, căn cước hoặc phương thức xác thực mạnh khác, xác thực thủ công qua ảnh như app hẹn hò, hoặc chơi 10 giờ trước khi vào đấu xếp hạng
    Tôi cho rằng các game thủ hardcore sẽ sẵn sàng làm những quy trình như vậy để giảm cheater

    • Nếu đã chơi game online ở mức nào đó, bạn sẽ biết người chơi liên tục đưa ra nghi ngờ cheating chỉ với rất ít bằng chứng
      Cũng có kiểu lạm dụng xã hội là báo cáo người chơi mình không thích để khiến họ bị chặn
      Trong một hệ thống như vậy, số false positive sẽ nhiều hơn bất kỳ anti-cheat nào rất nhiều
    • Nhìn ở mức khái quát, chỉ cần mô phỏng một game không có cheat, ký nó, rồi xử lý cheat riêng là được