1P by GN⁺ | ★ favorite | 댓글 1개
  • Black Ops Cold War의 TAC(Treyarch Anti-Cheat) 는 Ricochet 커널 드라이버가 없는 사용자 모드 안티치트지만, 최신 Call of Duty 계열과 상당 부분 유사한 코드 구조를 가짐
  • 보호 계층은 Arxan의 실행 파일 암호화·체크섬·jmp 난독화·엔트리포인트 난독화와 Treyarch/IW 계열 포인터 암호화를 함께 사용함
  • TAC는 런타임 API 해시 조회, API 훅 패턴 검사, 디버그 레지스터 확인, Windows 테스트 서명 감지, 콘솔 할당 감지, DirectX/오버레이 탐지 등 여러 사용자 모드 탐지를 수행함
  • 외부 오버레이는 창 스타일·위치·표시 친화도·프로세스 모듈 목록을 수집해 서버로 업로드하며, Cheat Engine류 메모리 스캐너는 가상 메모리 허니팟으로 감지될 수 있음
  • 가장 독특한 기법은 암호화된 커스텀 syscall 스텁으로, ntdll 훅을 우회하고 syscall 출처를 다른 ntdll 함수처럼 보이게 만들어 모니터링을 어렵게 함

분석 대상과 범위

  • 분석 대상은 Black Ops Cold War 내부의 사용자 모드 안티치트이며, 명칭은 TAC(Treyarch Anti-Cheat) 로 사용됨
  • Black Ops Cold War에는 Modern Warfare 2019 및 이후 타이틀에 있는 Ricochet의 커널 모드 구성요소가 없음
  • 최신 Call of Duty와의 큰 차이는 커널 모드 드라이버이며, 안티치트 코드의 대부분은 사용자 모드이고 TAC와 매우 유사함
  • 함수 의사코드는 실제 디컴파일 결과가 난독화·해결 코드로 복잡해 재구성된 형태임
  • 일부 내용은 치팅 또는 우회 홍보를 피하기 위해 삭제됨

Arxan과 실행 파일 보호

  • Arxan은 Black Ops 3 이후 많은 Call of Duty 게임에서 사용되는 난독화·보호 도구임
  • 런타임 실행 파일 복호화
    • 게임 실행 파일은 패킹되고 암호화되어 있음
    • Arxan은 시작 과정에 코드를 삽입해 실제 게임 실행 파일을 언팩·복호화함
  • 실행 파일 체크섬
    • Arxan은 게임 실행 파일 패치를 지속적으로 감시함
    • 디버거 또는 체크섬 불일치가 감지되면 프로세스를 종료함
  • jmp 난독화
    • 함수의 명령어 사이에 다수의 jmp를 삽입해 정적 분석을 어렵게 만듦
    • 큰 함수에 수백 개의 점프가 삽입되면 IDA 분석이 깨지고 외부 도구가 필요해짐
  • 엔트리포인트 난독화
    • 보호된 Arxan 코드가 실제 엔트리포인트를 언팩하고 실행함
    • 이 구간에도 jmp 난독화가 들어갈 수 있어 흐름 추적이 어려움

포인터 암호화

  • 중요한 포인터는 사용 직전에 암호화·복호화됨
    • 현재 게임 전역 객체
    • 엔티티 배열
    • 오브젝트 포인터 등
  • 같은 암호화 방식에는 16개 변형이 있으며, 현재 PEB 주소가 어떤 방식을 쓸지 결정함
  • 이 방식은 Cheat Engine의 포인터 스캔을 방해함
    • 전역 값에는 암호화된 값만 저장됨
    • 복호화된 값은 스택에만 존재함
  • 복호화 포인터를 얻으려면 복호화 명령어 추적 도구를 쓰거나, 게임이 이미 복호화한 지점에 훅을 거는 방식이 필요함

런타임 API 조회와 훅 탐지

  • TAC는 인라인된 런타임 API 조회 함수를 사용함
    • 모듈 해시와 API 이름 해시를 받음
    • 로드된 모듈 목록을 순회하며 이름을 해시함
    • 모듈의 export 함수를 순회하며 컴파일 타임 해시와 비교함
  • 해시 식별은 게임 프로세스의 로드된 모듈 목록과 게임의 해싱 함수를 이용해 진행됨
    • 모듈명과 export 이름의 해시를 계산함
    • 디컴파일 결과에서 base hash와 function hash를 수작업으로 가져와 어떤 API를 호출하는지 매칭함
  • 해시는 게임 버전마다 같지 않음
  • 함수 포인터가 전역 변수에 저장되므로, 가상 주소를 로드된 DLL의 export 함수와 비교하는 방식으로도 식별 가능함
  • TAC의 API 훅 탐지는 현재 7개 패턴만 확인함
    • push/movabs/xchg/ret 계열 스텁
    • push immret
    • call
    • jmp [rip+x]
  • 모든 중요한 API를 검사하지는 않고, 자신이 사용하는 API에 대한 훅을 검사함

디버그 레지스터와 드라이버 테스트 서명 감지

  • 디버그 레지스터는 Arxan의 .text 패치 감시를 우회하는 비코드 패치 훅 방식으로 사용될 수 있음
  • TAC는 스레드 컨텍스트에서 DR0~DR3 값을 확인함
    • 값이 있으면 현재 프로세스 내부인지 여부에 따라 다른 메시지로 콜백을 호출함
    • 이후 종료 함수로 흐름이 이동함
  • DR0~DR3는 privileged register라서 일반 어셈블리로 직접 읽을 수 없고, Windows 커널 또는 예외 전달을 통해 가져와야 함
  • Windows 테스트 모드는 정상 서명이 없는 커널 모드 드라이버 실행을 허용함
  • TAC는 NtQuerySystemInformation으로 테스트 서명 활성화 여부를 확인함
    • 이 감지만으로 직접 ban되지는 않지만 계정이 flag됨

프로세스 종료 방식

  • TAC는 두 가지 방식으로 프로세스를 종료함
  • 첫 번째 방식은 레지스터를 지운 뒤 NtTerminateProcess를 호출함
    • RCX-1로 설정함
    • NtTerminateProcess가 훅된 것으로 감지되면 이 방식을 쓰지 않음
  • 두 번째 방식은 레지스터를 지운 뒤 0x0으로 점프해 프로세스를 크래시시킴
  • 두 방식 모두 중요한 레지스터를 지우기 때문에 복구가 어려움

콘솔·시각화·오버레이 탐지

  • 내부 치트는 로그 출력이나 메뉴 구현을 위해 AllocConsole을 사용할 수 있음
  • TAC는 콘솔 창 또는 PEB의 ConsoleHandle을 확인해 콘솔 할당을 감지함
  • 내부 시각화는 주로 그래픽 API 훅으로 화면에 그려짐
    • 최신 Call of Duty는 DirectX 12를 사용함
    • 흔한 훅 대상은 IDXGISwapChain::Present
    • DirectX 12에서는 command queue가 필요하며, ID3D12CommandQueue::ExecuteCommandLists가 흔한 확보 지점임
  • OBS Studio, Streamlabs OBS, Discord 게임 오버레이, Steam 게임 오버레이도 유사한 위치에서 동작할 수 있음
    • Steam과 Discord는 그리기를 수행함
    • OBS 계열은 게임 캡처 사용 시 렌더링 이미지를 캡처함
  • TAC는 현재 DXGI present 함수 자체를 스캔하지 않고, vtable의 present 포인터를 확인함

외부 치트와 창 기반 탐지

  • 외부 치트는 게임 창 위를 덮는 overlapped window를 만들 가능성이 큼
  • TAC는 모든 창을 순회하며 GetWindowLongAWS_EX_LAYERED 스타일을 확인함
  • 이후 GetWindowRect로 게임 창과 겹치는지 비교함
    • 겹침 비율이 0.5 이상이고 캐시 개수가 8개 미만이면 해당 hwnd를 저장함
    • 예시 화면 크기로 1920x1080에 해당하는 값이 나타남
  • 캐시된 창은 별도 함수에서 추가 조사됨
    • GetWindowTextW로 창 텍스트 확인
    • GetClassNameA로 클래스 이름 확인
    • GetWindowDisplayAffinity로 표시 친화도 확인
  • SetWindowDisplayAffinityWDA_EXCLUDEFROMCAPTURE를 사용해 녹화·스크린샷 도구에서 숨기는 경우도 TAC가 확인함
  • 창 관련 정보는 암호화 버퍼에 저장되고 서버로 업로드됨
    • 창 텍스트
    • 클래스 이름
    • 창 위치와 스타일
    • display affinity
    • 겹친 창 프로세스의 모듈 목록과 exe 이름
  • 겹친 창 프로세스는 OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION)로 열고, K32EnumProcessModulesK32GetModuleFileNameExW로 모듈명을 수집함

Cheat Engine류 메모리 스캐너 감지

  • Cheat Engine은 Windows 가상 메모리 동작 때문에 감지하기 쉬움
  • 프로그램이 VirtualAlloc으로 가상 메모리를 할당해도, 접근 전에는 물리 메모리로 backing되지 않음
  • 게임은 메모리를 할당한 뒤 사용하지 않을 수 있음
  • Cheat Engine 또는 Process Hacker의 메모리 탭이 해당 영역을 스캔하면 접근이 발생하고 메모리가 valid 상태가 됨
  • TAC식 허니팟은 K32QueryWorkingSetEx로 해당 가상 주소가 실제 접근되었는지 확인해 메모리 스캐너를 감지함

시그니처 스캔 방해

  • 게임 해커는 업데이트 후에도 치트가 자동으로 동작하도록 signature scanning을 자주 사용함
  • Treyarch의 아이디어는 다시 호출되지 않을 함수에서 return address 주변을 PAGE_NOACCESS로 보호하는 방식임
  • signature scanner는 실행 파일 바이트를 처음부터 끝까지 읽으며 패턴을 찾음
  • 각 바이트마다 접근 가능 여부를 조회하면 매우 느리기 때문에, PAGE_NOACCESS 영역에 도달하면 프로세스가 크래시할 수 있음
  • 이 방식은 완전한 차단책은 아니지만 많은 분석자를 어렵게 만들 수 있음

안티디버깅

  • TAC 자체의 안티디버그 검사는 단순하지만, Arxan도 별도의 안티디버그 기법을 제공함
  • TAC는 현재 프로세스의 모든 스레드를 순회함
    • CreateToolhelp32Snapshot과 thread snapshot을 사용함
    • 각 스레드의 TEB에서 DbgSsReserved를 확인해 DebugObject 존재를 감지함
  • 비정상 메모리에 쓰기를 수행해 access violation을 유발하는 기법도 있음
    • 코드가 예외 이후 지점까지 도달하면 디버거가 예외를 처리했거나 우회했다고 판단함
  • CheckRemoteDebuggerPresent도 사용함
  • ThreadHideFromDebugger는 예외를 디버거가 아니라 프로세스로 보내게 함
    • 디버거가 프로세스를 멈추려 할 때 STATUS_BREAKPOINT 예외가 발생해 프로세스가 종료될 수 있음
    • 사용자 모드에서는 이 플래그를 unset할 수 없음
    • 이 전술은 실행 파일 엔트리포인트 이전의 TLS callback에서 실행됨

네트워크 트래픽 모니터링

  • TAC는 모든 활성 연결을 저장하지 않고, 특정 조건만 찾음
  • 감지 대상은 게임 프로세스 내부에 로컬 네트워크 서버를 만드는 방식임
    • 치터가 shellcode를 게임 프로세스에 작성함
    • 게임 프로세스 안에서 네트워크 서버를 시작함
    • 외부 애플리케이션이 이 로컬 서버와 정보를 주고받음
  • TAC는 GetTcpTable2로 TCP 테이블을 가져오고, 현재 프로세스가 만든 연결과 다른 프로세스의 포트 관계를 비교해 조건을 감지함

암호화된 커스텀 syscall 스텁

  • ntdll의 export API 다수는 내부에서 syscall을 수행함
  • 커스텀 syscall 스텁을 쓰면 사용자 모드 치트가 ntdll 함수를 훅해도 우회할 수 있음
  • syscall은 instrumentation callback에 노출될 수 있음
    • instrumentation callback은 syscall 이후 호출됨
    • 반환 주소는 syscall instruction 바로 뒤가 됨
  • TAC는 암호화된 syscall 스텁으로 정적 분석을 어렵게 함
  • 스텁은 .text 섹션에 할당된 큰 영역을 write/execute로 보호한 뒤 구성됨
  • NtReadFile에서 syscall instruction을 찾고, CPU 시간 값을 난수 요소로 사용해 위치를 바꿈
  • 모니터링하는 쪽에서는 syscall이 임의의 ntdll 함수에서 발생한 것처럼 보일 수 있음
    • 실제 syscall은 NtReadFile이 아닐 수 있음
    • eax의 syscall index를 확인하지 못하면 어떤 syscall인지 알기 어려움
  • 재실행할 때 syscall instruction 위치가 바뀌는 예시가 있음

안티디버거 숨김 우회 탐지

  • ThreadHideFromDebugger를 설정하려면 NtSetInformationThread가 호출되어야 함
  • 치터는 이 API를 훅해 성공을 반환하게 만들 수 있음
    • 그러면 안티치트는 숨김 설정이 성공했다고 믿지만 실제로는 아무 일도 일어나지 않을 수 있음
  • TAC는 잘못 만든 훅을 잡기 위해 잘못된 인자를 넣어 호출 결과를 확인함
    • 길이 인자가 맞지 않아 실패해야 하는 호출이 성공하면 감지함
    • 디버거와 ScyllaHide 환경에서 다른 반환값이 나온 예시가 있음
    • 가짜 핸들을 넣어 ThreadHideFromDebugger 요청에 무조건 성공을 반환하는 훅도 확인함

원격 스레드 생성 차단

  • TAC는 STATUS_PRIVILEGED_INSTRUCTION 예외에서 현재 스레드에 TerminateThread를 호출하는 예외 핸들러를 설치함
  • 수동 매핑 DLL은 원격 프로세스에서 shellcode를 실행할 방법이 필요하며, 흔한 방식이 CreateRemoteThread
  • Windows PE의 TLS callback은 스레드가 생성될 때 스레드 엔트리포인트보다 먼저 호출될 수 있음
  • TAC는 새 스레드 컨텍스트에서 시작 주소를 확인함
    • NtQueryInformationThread로 Win32 start address를 가져옴
    • 로드된 모듈 목록을 순회해 시작 주소가 정상 모듈 범위 안에 있는지 확인함
  • 시작 주소가 어떤 로드된 모듈 범위에도 없으면 탐지를 저장하고, privileged instruction 예외를 발생시켜 해당 스레드를 종료함

기타 검사와 결론

  • 알 수 없는 검사로 NtQuerySystemInformationAllocationGranularity0x10000인지 확인하는 코드가 있음
    • 가상 머신이나 커스텀 Windows 버전을 flag하는 것처럼 보임
  • TAC는 연결된 모듈 목록에 크게 의존하므로, PEB의 InMemoryOrderModuleList가 빈 목록인지 확인함
    • 빈 목록으로 만들면 프로세스 자체가 깨질 가능성이 있음
  • 최종적으로 TAC는 다음 기능을 가진 사용자 모드 안티치트임
    • 런타임 API 조회
    • 잘못 만든 훅 탐지
    • 외부 오버레이 탐지
    • 내부 DirectX 훅 탐지
    • 사용 API 훅 검사
    • 디버거와 디버깅 흔적 확인
    • AllocConsole 감지
    • CreateRemoteThread 감지
    • spoofed·encrypted syscall 스텁
  • Arxan은 강한 난독화, 정적 분석 방해, IDA Pro를 깨는 기법, .text 수정 감시, 자체 안티디버그 기능으로 TAC를 보조함
  • TAC와 유사한 코드가 현대 Call of Duty 게임에서도 사용됨

댓글과 토론

Hacker News 의견들
  • 2021년에 Linux CS:GO 계정에서 신뢰도 지표 문제가 생겨 노란색, 이후 빨간색으로 떨어졌고, 공식 차단은 아니지만 사실상 제재처럼 작동했음
    그 결과 계속 치터들과 매칭되어 팀원을 찾기 어려웠음
    나중에 Radeon GPU와 16GB 이상 VRAM을 쓰는 다른 Linux 사용자들도 비슷한 문제를 겪고 있다는 걸 알게 되었고, 문제 추적을 위해 GitHub 이슈를 만들었음: https://github.com/ValveSoftware/csgo-osx-linux/issues/2630
    조사해 보니 Valve가 특정 하드웨어 구성, 특히 당시엔 꽤 신형이던 16GB 이상 VRAM Radeon 카드를 가진 Linux 사용자를 제재하고 있었던 것으로 보였음
    결국 한 사용자가 gaben에게 직접 연락한 뒤 문제가 수정됨: https://github.com/ValveSoftware/csgo-osx-linux/issues/2630#...
    Steam Deck 출시를 준비하던 Valve가 Linux 사용자 경험을 신경 쓴 결과였을지도 모른다고 추측함

    • Gabe Newell이 그냥 좋은 사람일 수도 있지 않을까?
    • Linux 사용자를 제재하는 게 어떻게 Linux 사용자 경험을 좋게 만드는 건지 잘 모르겠음
      그래도 흥미롭긴 함
    • 신뢰도 지표가 노란색, 빨간색으로 떨어졌다는 걸 어떻게 알 수 있었는지 궁금함
      게임 품질이 나빠져서 추측한 건지, 아니면 확인 방법이 있었는지 모르겠음
      이해하기로는 신뢰도 지표는 악용을 막으려고 숨겨져 있음
  • 치팅은 결국 사람 문제
    글에서 설명한 안전장치와 휴리스틱으로 노골적인 치터 90%를 걸러낼 수는 있고, 그런 안티치트는 기본적으로 좋은 방향이라고 봄
    다만 안티치트는 보수적으로 동작해야 하며, 최종적으로는 플레이어와 관리자가 해결해야 함
    온라인 멀티플레이 게임은 반드시 사람이 관리하는 서버에서 돌아가야 하고, 플레이어가 접속해 있는 대부분의 시간에 관리자가 있어야 함
    가능하면 플레이어가 알아보는 관리자면 더 좋고, 관리자가 없을 때는 투표 강퇴나 투표 차단 같은 완화된 중재도 가능해야 함
    치터를 쫓아내는 것과 채팅을 악용하는 사람을 쫓아내는 것 사이에 본질적 차이는 없음
    결국 온라인 멀티플레이 게임에서 실현 가능한 서버 형태는 사설 서버나 커뮤니티 서버뿐이라고 봄
    치터와 악용자를 통제하는 과정은 신고 시스템으로 받아 비동기 처리하는 방식이어선 안 되고, 게임 관리자가 빠르게 강퇴나 차단을 해야 함
    온라인 플레이가 퍼블리셔의 매치메이킹 서버로만 가능하고, 치터나 채팅 악용자 처리가 웹 양식 신고뿐인 게임이라면 구매하거나 플레이하지 말고 지갑으로 투표해야 함

    • 온라인 멀티플레이 게임이 반드시 사람이 관리하는 서버에서 돌아가야 한다는 조건은 규모를 생각하면 꽤 황당함
    • 차라리 각 게임마다 모두에게 보이는 심판을 두고, 위반이 있을 때마다 비디오 판독을 하게 만들자는 얘기처럼 들림
      심판만 감시하는 별도 조직까지 둘 수도 있겠지만, 그냥 게임을 하면 됨
    • 왜 사람이 관리하는 것만 유일하게 가능한 해법이라고 보는지 모르겠음
      Apex Legends는 강력한 신고와 안티치트 시스템으로 잘 돌아가고, Rocket League도 대부분 자동화된 중재가 효과적으로 작동함
    • 대체로 동의하지만 다른 방법도 있음
      전화번호, 사진을 통한 수동 인증, 경쟁전 전에 10시간 플레이 요구, 다른 플레이어의 추천, 혹은 이런 조건 위에 5달러짜리 1회 결제 게임 패스 같은 방식도 가능함
      아직 안 봤다면 Valve의 AI 안티치트 발표를 추천함
      작업이 꽤 흥미롭고, 치터의 99%를 잡는다고 주장함
      물론 아주 미묘한 치팅 방법도 여전히 있음
  • Activision의 거짓 영구 차단을 뒤집기 위해 2년 법정 싸움을 했고, Activision은 치팅 증거를 하나도 내지 못해 패소함: https://antiblizzard.win/2025/01/18/my-two-year-fight-agains...

    • League of Legends에서도 똑같은 일을 겪었음
      치팅을 한 적이 전혀 없는데 설명 없이 차단됐고, 세 계정을 정기적으로 플레이하는데 나머지 두 계정은 차단되지 않았음
      고객지원은 계속 “검토 결과 차단이 맞다”고만 했고, 무엇을 잘못했는지 고칠 수 있게 해 주는 정보는 전혀 주지 않았음
      게임에서 가장 희귀한 스킨 몇 개를 갖고 있고 2009년부터 수천 시간을 플레이했으며, ARAM만 하는데 가장 캐주얼한 모드에서 감정적 가치가 큰 계정을 걸고 치팅했다는 건 말이 안 됨
      게임 관련해서 이보다 더 스트레스받은 적이 없었고, 업계 지인이 내부 확인을 해 준 덕분에 이유 없이 차단이 풀렸음
      아직 플레이하긴 하지만 거의 매번 그 거짓 차단이 떠오르고, League가 시간을 들일 마지막 경쟁 멀티플레이 게임이 될 것 같음
      다시 그런 일이 생길까 두려워서 더는 하고 싶지 않은 마음도 있음
    • 나도 거짓 영구 차단을 당했음
      콘솔에서는 치팅이 거의 불가능하고, 랭크에서 겨우 평범한 골드 1까지 가는 데 너무 오래 걸렸으며, 어떤 행동으로도 경고나 신고를 받은 적이 없는데 설명 없이 영구 차단됐음
      글쓴이처럼 싸우는 대신 Activision 제품에는 다시는 돈을 쓰지 않기로 했고, 모두가 그렇게 해야 한다고 봄
    • 게임에서 잘하면 누군가 프로필을 보고 플레이 시간을 확인하다가 “나는 치터다”라는 빨간 표시를 바로 보게 된다는 대목은, 그 라벨이 명예훼손으로 볼 수 있는지 궁금함
      미국에서는 아마 더 어렵겠지만, 영국이나 잉글랜드에서는 피고가 사실임을 증명해야 한다고 이해하고 있음
    • 저런 싸움을 해야 했다니 끔찍함
      멀티플레이 슈터를 거의 안 해서 다행이고, 방대한 Steam 라이브러리를 잃게 된다면 정말 싫을 듯함
    • 이 글 자체만으로도 별도 제출감이고, 매우 흥미로운 글임
  • 점프 난독화가 매우 궁금함
    역공학을 더 해 본 사람이 답해 줄 수 있다면 좋겠음
    무조건 점프가 특정 사전 조건으로 걸러내기 어려울 만큼 흔한지, 함수 끝은 반환이 있으니 찾기 쉬워 보이는데 스택을 분석해 함수가 어디로 반환되는지 알고 반환 주소 바로 앞의 호출을 찾는 방식이 가능한지 궁금함
    x86 어셈블리 프로그래밍을 많이 해 보지 않아서 동작 방식을 잘못 이해했을 수도 있음

    • angr나 https://github.com/cea-sec/miasm 같은 에뮬레이터로 상징 실행을 해서 제어 흐름 그래프 평탄화를 풀 수 있는 멋진 기법들이 있음
      Intel의 PIN 프레임워크로도 흥미로운 분석을 할 수 있음
      도움이 될 만한 글은 여기 있음: https://calwa.re/reversing/obfuscation/binary-deobfuscation-..., https://www.nccgroup.com/us/research-blog/a-look-at-some-rea...
    • 무조건 점프는 매우 흔하고, 최적화 이후의 x86 어셈블리는 전반적으로 아주 지저분함
      많은 함수가 ret로 끝나지 않음
    • Guitar Hero 3 일부를 역공학하는 이 영상이, 게임 코드를 강하게 난독화하는 데 쓰인 비슷한 기법들을 다뤄서 흥미로울 수 있음: https://www.youtube.com/watch?v=A9U5wK_boYM
    • 흔한 문제들이 몇 가지 있음
      일부 점프는 가짜이고, 일부 점프는 명령어 내부로 들어감
      디컴파일러는 같은 위치에 두 명령어가 있는 상황을 처리하지 못함
      예를 들어 jmp 0x1234에서 jmp 연산 코드를 건너뛰고 0x1234를 유효한 명령어로 가정하는 식임
      어떤 분기에서는 스택이 망가져 있지만, 예외를 일부러 일으키기 위한 의도일 수 있음
      그래서 lea RAX, [rsp + 0x99999999999] 같은 명령어를 nop으로 바꿔 디컴파일을 고칠 수는 있지만, 의도된 예외를 놓칠 수도 있음
      IDA는 이런 걸 잘 처리하지 못해서 Binary Ninja 라이선스를 쓰고 있고, 디컴파일러용으로 함수를 인라인하는 스크립트를 쉽게 만들 수 있음
      IDA는 점프 사이의 코드 덩어리가 한 함수에만 속할 수 있어서, 점프들이 코드 덩어리를 서로 재사용하는 상황을 제대로 처리하기 어렵다고 봄
      Binary Ninja가 Blizzard 게임에서 버그가 있었기 때문에 사람들이 덜 쓰는 것 같지만, 1년쯤 전 버그 리포트로 수정됐음
    • 이 특정 점프들은 충분히 쉽게 걸러낼 수 있어 보임
      흔한 기성 도구, 특히 IDA Pro 사용자를 귀찮게 만들기 위한 난독화임
      대부분의 난독화는 사람들이 다른 프로젝트로 넘어가게 할 만큼만 귀찮게 만드는 데 목적이 있음
  • 판매 이후 제품 기능을 빼앗는 행위는 계약이나 EULA에 있더라도 법으로 막아야 함
    차단이 게임 소유권 자체를 빼앗아서는 안 되고, 그렇게 된다면 환불해야 함
    판결까지 가야 환불을 유도할 수 있다면 라이선스 비용, 변호사 비용, 법원 비용 위에 3배 손해배상까지 있어야 함
    예컨대 Steam에서 차단되어 모든 구매가 무효화되는 형태는 법적으로 불가능해야 함
    계정 로그인이 막히더라도 아이템과 인벤토리는 거래 가능해야 하고, 이는 돈을 낸 고객이 실제 시간을 들여 얻은 것이기 때문임
    멀티플레이 게임에서 윤리 규정을 집행하고 싶다면 게임에 돈을 받을 수 없거나, 유료 사용자는 차단에 대해 권리를 가져야 함
    차단은 비례 원칙을 따라야 하고, 사람이 참여하며 비용이 라이선스 가격으로 제한되고 패소 시에만 부담하는 항소 심판 절차와 기록이 있어야 함

    • 치팅을 해도 Steam에서 차단되지는 않음
      최악의 경우 VAC 게임에서 계정에 공개 망신 표시가 붙는 정도임
      사람들은 즐기고 다른 사람과 상호작용하려고 멀티플레이 게임을 하므로, 치팅이든 다른 나쁜 행동이든 타인에게 영향을 준다면 멀티플레이 서비스 이용은 차단되어야 함
    • 운전 중 과속과 뭐가 다른지 모르겠음
      사회에 민폐를 끼치면 대가를 치르는 건 꽤 보편적인 원칙임
    • 치터가 제대로 당하는 건 괜찮다고 봄
      실제 돈을 잃어도 된다고 생각함
      다만 실수로 차단되는 건 다른 문제임
      그리고 차단되는 건 전체 Steam 계정이 아니라 더는 플레이할 수 없는 해당 게임 아닌가?
    • 차라리 치터라는 라벨을 붙이고, 다른 치터들과만 게임하게 하면 될 듯함
    • 치팅을 하거나 다른 플레이어의 게임을 망친다면 접근 권한을 잃어도 마땅함
      다른 플레이어들도 돈을 냈음
  • COD에서는 굳이 치팅할 필요도 없음
    버그가 너무 많아서 게임이 대신 해 줌
    랭크에서 칼 대신 총을 로드하기도 하고, 랭크 총기 장비 검사에서 명백히 잘못된 caseif-else가 있어 그런 일이 가능하며, 장비 선택기에 보이는 총이 허용되지 않으면 XM4로 기본 설정되는 것 같음
    내가 아는 게임 중 랭크 버전이 캐주얼 버전보다 더 망가진 거의 유일한 게임

  • 이런 건 어디서 배웠는지 궁금함
    글의 절반이라도 이해할 수 있을 만큼 더 배우고 싶은데 어디서 시작해야 할지 모르겠음

    • 약 15년 전에 Eldad Eilam의 Reversing: Secrets of Reverse Engineering이라는 책을 읽으며 많이 배웠음
      오래된 책이지만 훌륭하고, 여러 기법과 실습을 따라가게 해 줌
      최신 도구는 그때와 좀 달라졌지만 x86 명령어 집합과 어셈블리 전반은 크게 달라지지 않았음
      가장 큰 수확 중 하나는 crackme를 알게 된 것임
      역공학을 배우도록 만들어진 작은 도전용 바이너리이고, 자물쇠 따기 커뮤니티의 연습용 자물쇠 같은 존재임
      기억상 책에 CD-ROM으로 여러 개가 들어 있었고, 온라인에도 찾아보면 많이 있음
      이런 연습을 직접 해 보는 게 배우는 길임
      처음부터 COD를 역공학하려 들면 안 되고, 단계적으로 쌓아 가야 함
    • 예전에는 Lena151 튜토리얼로 시작했음: https://github.com/kosmokato/Lena151
    • 예전 같으면 Gamedeception에 가서 어울리라고 했을 텐데, 몇 년 전에 사라진 모양임
      UnknownCheats, cs.rin.ru 등을 보던 사람들에게 인사함
    • UnknownCheats가 이런 종류의 자료가 가장 좋은 곳 중 하나임
      나도 거기서 활동 중이고, 특히 Linux 사용자 공간 안티치트, 그중에서도 VAC가 어떻게 동작하는지에 더 관심이 있음
    • https://pwn.college는 훌륭한 교육 자료임
  • 인기 있는 Horde/Alliance 기반 MMO를 조금 역공학해 봤는데, 거의 같은 단계들을 따르고 있었고 FNV32 내보내기 해시도 포함되어 있었음
    매우 비슷한 트릭을 쓰는 걸 봐서 거의 같은 방식처럼 보임
    같은 보호 기술로 패킹된 것인지 궁금함

    • Source 2 엔진도 스키마, 즉 엔티티 속성을 해시하는 데 fnv를 사용함
    • 합병 이후 Activision 지식재산에 Warden을 재사용했다면 말이 됨
  • 시그니처 스캐닝은 정말 강력함
    역공학에서 나에게 가장 중독적인 부분이기도 함
    시그니처 목록을 만들고, 그 함수 포인터를 호출할 수 있도록 스크립트 언어 바인딩을 작성하는 과정이 재미있음
    많은 서드파티 모드 플랫폼의 기반이기도 한데, 1차 개발사가 노출하지 않은 의미 있는 API를 모더에게 제공해야 하기 때문임

    • 시그니처 스캐닝이 뭔지는 모르지만, 궁금한 사람을 위한 자료를 찾았음: https://www.unknowncheats.me/forum/general-programming-and-r...
    • 맞음
      몇몇 Source 엔진 플러그인도 필요할 때 이 방식을 쓰는 것으로 알고 있음
      다만 대부분은 가상 함수 테이블 포인터의 오프셋을 사용하는 것 같음
  • 주기적으로 게임 상태에 전자 서명을 하거나, 어떤 작업 증명을 넣어 치팅을 막는 게 가능하거나 의미 있지 않을까 싶음
    치팅은 막기 너무 어려운 문제라는 생각이 들기 시작했음
    작고 저렴한 온라인 FPS를 만들고 있는데, 안티치트 소프트웨어를 두기보다는 사용자끼리 신뢰하고 치터를 직접 찾게 하거나, Valve처럼 AI를 쓰는 쪽을 생각함
    플레이어가 직접 서버를 관리하고 운영하게 둘 것 같음
    휴대폰 번호를 연결하고, 다른 플레이어가 주는 평판 점수, 신분증이나 다른 강한 인증 수단, 데이팅 앱처럼 사진을 통한 수동 인증, 경쟁전 전에 10시간 플레이 같은 조건을 둘 수 있음
    하드코어 플레이어들은 치터를 줄이기 위해 이런 절차를 기꺼이 할 거라고 봄

    • 온라인 게임을 어느 정도 해 봤다면, 플레이어들이 아주 적은 증거만으로도 치팅 의혹을 끊임없이 제기한다는 걸 알 것임
      마음에 안 드는 플레이어를 신고해서 차단시키려는 사회적 악용도 있음
      그런 시스템에서는 어떤 안티치트보다 오탐이 훨씬 많아질 것임
    • 높은 수준에서 보면, 치트 없는 게임을 시뮬레이션해서 거기에 서명하고 치트는 별도로 처리하면 됨