본문 바로가기

My Study/Reversing

Software Breakpoint Detection

이번에는 소프트웨어 브레이크 포인트를 탐지하는 방법에 대해서 알아보겠습니다.
보통 리버싱을 하면서 거는 BP의 종류는 소프트웨어 브포와 하드웨어 브포가 있습니다.
말 그대로 소프트웨어 브포는 소프트웨어 단에서 코드부분에 0xCC라는 명령어를 주면서 멈추게 되는 것입니다.
반면 하드웨어 브포는 cpu를 사용한 브포입니다. 아마 하드웨어 브포는 최대 4개까지 걸수있을것입니다.

하드웨어 브포같은 경우는 CONTEXT구조체에 있는 값을 가지고 탐지를 할 수 있습니다.

Dr 부분에 쭉 들어가게 됩니다.

여기선 하드웨어 브포 탐지방법이 아닌 소프트웨어 브포 탐지방법에 대해서 알아보도록 하겠습니다.
일단 원리만 말해보겠습니다. 너무나 간단해서 한줄이면 설명이 될꺼같군요.
BP를 탐지하고 싶은 메모리 부분의 해쉬값을 지속적으로 비교하는 것입니다.
먼저 제가 여기서 사용한 방법은 CRC변환 방법을 사용했습니다. 

이제 소프트웨어 브포를 탐지하는 코드를 보시겠습니다.

메인 함수입니다. original_crc에는 탐지하고 싶은 함수의 crc해쉬값을 저장시켜놓습니다.
그리고 탐지를 하는 과정은 스레드로 구현해 놓는 것이 알맞는거 같아서 스레드로 구현해봤습니다.

1초에 한번씩 처음 해쉬값과 새로 계산해낸 해쉬값을 비교를 해서 다르면 
Debugger를 탐지했다는 문장을 출력시켜주는 것입니다.
그리고 제가 탐지를 하고 싶은 함수를 보시겠습니다.

단순히 덧셈을 하는 프로그램입니다.

이제 모든 코드를 봐보았으니 어떻게 동작을 봐보겠습니다.
영상을 보세요~ ( Ctrl + 마우스 휠로 크기 조절하셔서 보시면 됩니다. )
영상 다운

여기서는 소프트웨어 브포를 탐지할수 있다라는 식으로선 설명을 했습니다.
하지만 이건 코드 변화를 감지하게 되는 것입니다.
소프트웨어 브포만 탐지할 수 있는게 아니라 코드 수정 또한 감지할 수 있다는 것입니다.

심심하신 분들은 한번 테스트 해보시길 바랍니다 ^^;