IsDebuggerPresent 함수는 윈도우에서 제공하는 API로, 아주 고전적인 안티 디버깅 함수이다.




 간단히 user-mode debugging을 탐지하여 bool 리턴값으로 디버깅 중이면 true를, 아니면 false를 반환한다.

이를 찾아 바이너리 패치를 통해 우회하는 방법을 적어보려 한다.


IsDebuggerPresent_Sample.exe



 일단 샘플을 그냥 실행시킬 시 "Now not debugging! XD"을 출력하고 종료되며,



 Ollydbg등을 이용해 디버깅하며 실행하면 "Now debugging... :("을 출력하고 종료된다.



 main 함수 내부를 디스어셈블한 모습이다.

IsDebuggerPresent 함수를 실행하여 EAX에 반환된 값을 TEST 연산을 통해 0인지 확인하고, 0일 경우 점프하는 루틴이 있다. 디버깅 중일 경우에는 true, 즉 1을 반환하므로 점프하지 않을 것이다. 따라서 우리는 저 조건 점프문을 그냥 반환  값에 관계없이 점프하도록 바꿔주기만 하면 된다.



 명령어를 더블클릭하면 수정이 가능한데, "Jump if Equal"의 줄임말인 JE를 그냥 무조건 점프하는 JMP로 바꿔준다.

이것만으로는 바이너리가 패치가 되지 않고 메모리만 바뀌기 때문에 드라이브에 저장되어 있는 원본 파일은 바뀌지 않는다. 이를 파일로 따로 저장할 필요가 있다.



 패치한 부분을 드래그하여 선택 후 우클릭, Copy to executable -> Selection 을 선택한다.



 이후 나타난 창에서 Save file을 클릭하여 따로 파일을 저장하면 된다.



 이렇게 패치한 파일은 디버깅 중이어도 항상 Now not debugging!을 출력하게 된다. 이렇게 바이너리 패치를 통해 간단한 안티 디버깅 기법을 무력화할 수 있다.


블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

댓글을 달아 주세요