브레이크포인트
실행중인 대상 프로세스를 디버깅을위해 코드진행을 의도적으로 멈추게 하는걸 뜻합니다.
멈춘시점의 파라미터, 변수의 값, 레지스터 등을 알 수 있으며,
소프트웨어 브레이크포인트, 하드웨어 브레이크포인트, 메모리 브레이크포인트로 3종류가 존재합니다.
SoftwareBreakPoint
INT 3 인스트럭션은 Software BP로 많이 사용되는 BP중 하나이며 횟수 제한이 없습니다만
코드변경이 있기에 crc체크를 하는 프로그램에서는 걸리게됩니다.
만약 디버깅 중이라면 해당 인스트럭션이 실행될 때 BP가 트리거 되며 자연스럽게 BP로 인식해 넘어가지만
아닐때는 예외가 발생하며 예외구문에 걸리게 됩니다. 디버거에서 OPCODE는 CC로 설정됩니다.
INT 41 명령어는 커널 디버거를 탐지할 때 사용되며, 보통 해당 인스트럭션은 유저모드 (RING 3) 에선 실행되지 않습니다.
만약 실행하게되면 INT D가 수행되어 예외가 발생됩니다.
HardwareBreakPoint
브레이크 포인트 횟수 제한이 있지만 코드변경이 없습니다.
디버그 레지스터 (Dr0 ~ Dr7)를 이용해 cpu레벨에서 설정합니다.
Dr0 ~ Dr3 는 브레이크 포인트 주소를 담는데 사용되며
Dr4, Dr5 는 다른목적을 위해 예약된 레지스터를
Dr6, Dr7 은 브레이크포인트 행동을 제어하기위해 사용됩니다.
즉, Dr0 ~ Dr3 레지스터를 확인해 값이 들어있다면 하드웨어 브레이크포인트가 설정된것이라 봐도 무방합니다.
코드변조가 없기에 CRC체크를 하는 게임에서 eip 레지스터를 바꾸어 핵을 사용하기도 합니다.
BeingDebugged
TEB(Thread Environment Block)와 PEB(Process Environment Block)를 사용하며,
PEB구조체의 BeingDebugged flag를 검사해 디버깅을 확인하며 디버깅 중이라면 true를 아니라면 false를 반환합니다.
NtQuerySystemInformation
현재 운영체제의 정보들을 가져오는 함수로, OS가 디버그 모드로 부팅되었는지 아닌지를 판별하는 테크닉으로 주로 사용됩니다. 해당 클래스의 35번째에 존재하는 SystemKernelDebuggerInformation(0x23)을 이용하게되면 SYSTEM_KERNEL_DEBUGGER_INFORMATION 구조체의 DebuggerEnabled 값의 확인이 가능해집니다.
eax레지스터에 값이 반환되며 al에 KdDebuggerEnabled 값이 들어가게되며, ah에는 KdDebuggerNotPresent 값이 들어갑니다. ah에 0이 들어있다면 디버깅 중이란 뜻이 됩니다.
다음편에 이어 가겠습니다.
https://imoracle.tistory.com/54
[Anti - Reversing] 보안솔루션 직접 제작하기 - 3 -
메모리 비교보호할 메모리를 읽어봐 비교합니다.클라이언트에서 int형 변수에 17을 넣어주고 출력해줬었습니다.push 11로 17을 넣어주고 있습니다.push 30으로 변조하게되면 감지하게 됩니다. CheckRe
imoracle.tistory.com
'Reverse Engineering > GAMEHACK' 카테고리의 다른 글
[Anti - Reversing] 보안솔루션 직접 제작하기 - 4 - (0) | 2024.07.06 |
---|---|
[Anti - Reversing] 보안솔루션 직접 제작하기 - 3 - (0) | 2024.07.06 |
[Anti - Reversing] 보안솔루션 직접 제작하기 - 1 - (0) | 2024.07.04 |
[Game] 지뢰찾기 월핵 제작 - 2 - (1) | 2024.07.04 |
[Game] 지뢰찾기 월핵 제작 - 1 - (0) | 2024.07.04 |