【게임 리버스 엔지니어링】 신뢰할 수 있는 스레드 검사 방법 탐색

1. 주요 스레드 검사

플러그인과 트로이 목마에 대한 솔루션은 메인 쓰레드에 모든 점검 작업을 담는 것이 불가능하기 때문에 솔루션에는 계속해서 작동해야 하는 스캐닝 쓰레드나 환경 점검 쓰레드가 항상 존재하게 되며, 플러그인 및 트로이 목마의 주요 스레드 중요한 공격 대상은 플러그인 및 트로이 목마가 처리되는 한 클라이언트를 쉽게 파괴할 수 있습니다.

클라이언트 안티 트로이 목마 프로그램인 SafeLogin과 TEdit에서 오랫동안 쓰레드 보호의 대결을 경험해왔고, 클라이언트 안티플러그 시스템과 셸에서의 쓰레드 보호와 Sanlix를 이해한 후, 이제는 안티 ​​쓰레드 보호에서, 트로이 목마 대책 플러그인에 비해 앞서 실행되는데 이는 트로이 목마 자체의 특성과 관련이 많으며 스캐닝 쓰레드와 환경 검사 쓰레드가 고정되지 않으면 숨길 수 없게 된다. 기능 스캔, 키보드 후크 및 창 동작의 검사 프로세스에서.

2. 플러그인과 트로이 목마의 일반적인 공격 방식

스레드에 대한 플러그인 및 트로이 목마 공격은 다음과 같은 방법에 불과합니다.

1) 가장 단순하고 쓰레드 함수 코드의 변조는 피쳐 검사로 스캔하기 쉽습니다.

2) 단순히 스레드 생성을 방지하고, 또한 발견하기 쉬운 후크 스레드를 통해 관련 기능을 생성합니다.

3) 이 메서드는 ntdll!CsrNewThread 함수를 후킹하여 스레드 함수의 주소를 교체함으로써 상대적으로 숨겨져 있으며 쉘에서 GetExitCodeThread 및 ResumeThread의 검사 메서드를 우회합니다.

4) 훅 kernel32!Sleep을 통해 더욱 은밀하게, 스레드에서 Sleep이 호출될 때 매개변수를 변조하여 Sleep이 영원히 지속되지만 데이터를 기반으로 하는 SafeLogin의 스레드 검사 방법에서 찾을 수 있습니다.

5) 매우 은밀하다.훅 ntdll!ZwDelayExecution을 통해 스레드를 영원히 잠들게 하는 것이 아니라(Sleep 함수는 결국 이 네이티브 API를 호출할 것이다) 스레드를 더 오랜 시간 동안 잠들게 하는 것이며, 이 틈에서, 트로이 목마는 스레드의 활동 규칙을 확인합니다.(침입자가 모바일 센트리의 활동 규칙을 마스터하는 것과 같습니다.) 둘째, 검사 스레드의 루프 실행을 늦출 수 있습니다(침입자가 이동 센트리의 속도 저하를 제어하는 ​​것과 같습니다. 모바일 보초 검사), 나쁜 일을 할 시간을 벌기 .

사실 이 방법들도 트로이 목마와 맞서는 과정에 있습니다. , 그러나 훅.만약 가로채면 도착하면 가로채고, 가로채지 않으면 빠르게 복원하여 스캐닝 쓰레드의 훅 검사를 피하고, 전 과정이 더욱 은폐된다.

3. 스레드 컨텍스트 스위칭과 데이터 변경 감지를 결합하는 방법

플러그인과 트로이 목마의 대응책을 잘 알면 쓰레드의 코드나 쓰레드 핸들만 확인하면 신뢰할 수 없게 되므로 쓰레드 활동이 쓰레드 검사 데이터를 업데이트하도록 하는 방법이 필요하다. 트로이 목마 4, 5)에 대한 수단으로 스레드가 오랫동안 비활성 상태인 것으로 확인되거나 스레드가 활성화되어 있지만 스레드 검사 데이터가 매번 업데이트되지 않는 경우 이 스레드에 문제가 있다고 판단할 수 있습니다.

배경은 간략하게 소개하고, 중복되는 내용은 반복하지 않으며, 방법은 직접 설명하도록 하겠습니다.

우리는 Windows 시스템의 커널이 모든 스레드를 예약하고 실행한다는 것을 알고 있습니다. 스레드가 전환되면 컨텍스트 정보를 CPU 레지스터 및 기타 환경으로 스왑합니다. 이때 커널에는 스레드 컨텍스트가 있습니다. 스위치의 수(thread Context switch count)는 1씩 증가하며 두 순간의 스레드 데이터의 차이(이하 델타 값), 즉 스레드 컨텍스트 스위치 델타는 다음과 같이 반영됩니다. 두 순간 사이에 전환 전환 횟수.

sysinternals의 프로세스 탐색기 도구에서 이 데이터가 표시되며 지속적으로 업데이트되는 것을 볼 수 있습니다.
여기에 이미지 설명 삽입
프로세스 탐색기에 대한 연구를 통해 5번 함수로 NtQuerySystemInformation 시스템 함수를 호출하는데, 타사 문서를 참고하면 이 구조에 쓰레드 전환 횟수가 존재하고(그림 1 참조) NtQuerySystemInformation을 호출하면 얻을 수 있다. 5번 기능으로(그림 2 참조)

그림 1
여기에 이미지 설명 삽입
그림 2
두 순간에 스레드의 델타 값을 확인하고 스레드 활동 업데이트 데이터 검사(그림 3 참조)와 결합하여 Trojan 방법 4와 5를 효과적으로 제거할 수 있습니다. 설립하다. 또한 점검 과정에서 delta 값과 업데이트 데이터를 통해 쓰레드 활동이 발견되지 않는다면 시스템에서 쓰레드가 전혀 스케쥴되지 않았기 때문인가 Sleep 또는 SwitchToThread 메소드를 통해 쓰레드 스케쥴링을 촉발할 수 있다. 능동적으로(그림 4 참조) 확인 중인 스레드가 "느려지면" 메인 스레드가 뒤따를 것입니다. 이러한 방식으로 보다 안정적인 스레드 검사 방법이 실현됩니다.
여기에 이미지 설명 삽입
그림 3
여기에 이미지 설명 삽입
그림 4

4. 요약

이 검사 방법도 대결 과정에서 진화했다.물론 앞으로도 계속 맞닥뜨릴 가능성이 높다.다중 스레드 크로스 체크를 동시에 할 수 있어 한 스레드가 정상적으로 동작하지 않으면 다른 스레드가 모두 파업에 돌입합니다.

축적과 나눔으로 이 방법은 사실 아주 간단하게 설명드렸는데요, 추후 대결에서 더 좋은 방법이 있으면 공유하도록 하겠습니다.

추천

출처blog.csdn.net/douluo998/article/details/131505080