리버스 엔지니어링/치트엔진

치트엔진으로 안티디버깅(IsDebuggerPresent) 우회 해보기

뿔맨 2018. 9. 16. 04:32
반응형

이번에는 치트엔진 툴을 사용하여 안티디버깅(Anti - Debugging) 기법 중 가장 기초적인 IsDebuggerPresent 를 우회 해보겠습니다.

먼저 아래 간단한 소스코드를 컴파일 하겠습니다.

IsDebuggerPresent 함수를 무한루프를 돌리는 소스입니다.
디버깅이 탐지가 되면 " 디버깅 탐지 " 메시지를 출력하고
아닐시 " 정상 " 메시지가 출력됩니다.

해당 소스를 컴파일해서 실행시키면 아래와 같이 출력됩니다.


이제 치트엔진을 켜서 해당 프로그램을 attach 시켜줍니다.

왼쪽 상단에 모니터 그림을 클릭하고 Process List 에서 해당 프로그램을 Open 해줍니다.

그리고 Memory View 에서 아무 곳에 BP를 설정 해주면 아래와 같이 " 디버깅 탐지 " 메시지가 출력됩니다.


Ctrl + G를 누르면 Goto Address 박스가 출력되며, isdebuggerpresent를 쓴 후 엔터를 칩니다.

Ctrl + G 기능은 OllyDbg의 " Enter expression to follw " 기능과 같습니다.

F5를 눌러서 BP 설정을 해줍니다.
IsDebuggerPresent를 불러온 주소를 알아내야 하기 때문에 계속 F8을 눌러서 진행합니다.

mov [ebp-04],eax에 BP가 자동으로 걸리면서 Call 003F166C 가 IsDebuggerPresnet를 호출하는 것을 확인하였습니다.
좀 더 자세히 확인 해 봅시다.

위의 call 003F166C를 계속 좇아가게 되면 아래와 같은 call eax를 만나게 됩니다.

여기서 F7을 눌러서 함수 내부로 진입하게 되면

위 그림과 같이 IsDebuggerPrenset함수로 jmp하게 됩니다.

그럼 다시 본문으로 돌아와 정리를 해보겠습니다.

왼쪽 그림과 오른쪽의 소스코드를 비교해보면 유사하다는 것을 느낄 수 있습니다.

그러면 IsdebuggerPresent를 우회를 하는 방법은 간단합니다.
IsdebuggerPresent의 반환 값을 0으로 바꿔주면 쉽게 우회가 됩니다.


감사합니다.

반응형