본문 바로가기

4-8. 2021-1 심화 스터디/리버싱을 활용한 디버거 플러그인 개발

[2021.05.22] 리버싱을 활용한 디버거 플러그인 개발6

 

Readmemory 함수

 

플러그인에서 제공해주는 함수, 현재 어태치된 프로세스의 메모리를 읽을 수 있게 해 준다.

대상 프로세스의 핸들을 지정하는 인자가 없기 때문에 그냥 사용하면 된다. 버퍼와 타겟 번지, 그리고 사이즈만을 전달하면 어태치된 프로세스를 그 버처가 읽어와 준다.

 

다음으로 그 버퍼와 그만큼의 사이즈를 Disasm() 함수에 첫 번째, 두 번째 인자로 넣고 읽을 메모리 번지는 세 번째로 넣는다. 그리고 t_disasm 구조체 변수를 넣어주면 구조체 에 값이 담겨온다.

 



 

 

 

(추가활동)
IsDebuggerPresent() 무력화

 

IsDebuggerPresent() 란?

  • 안티디버깅 기법 중 가장 기초적인 기법
  • 해당 프로세스가 디버깅 당하고 있는지 여부를 PEB 구조체의 디버깅 상태값을 통해 확인하는 windows API
  • 디버깅 당할 때: 리턴 값 TRUE(1) -> 프로그램 종료  / 아닐 때: 리턴 값 FALSE(0)

 

  • 예제코드
#define _WIN32_WINNT 0x0500
#include <stdio.h>
#include <Windows.h>
 
int main() {
    while (1) {
        Sleep(1000);
        if (IsDebuggerPresent() == 1) {
            printf("디버깅 당함 \n");
        }
        else {
            printf("정상\n");
        }
    }
    return 0;
}

출처: https://woosunbi.tistory.com/19 [woodonggyu]




IsDebuggerPresent() 무력화

- 소스에서 핵심 코드가 가장 많이 기록된 위치는 사용자가 어떠한 액션을 취했을 대의 코드가 가동되는 부분인 ODBG_Pluginaction() 함수다.

- 이 함수는 사용자가 어떠한 선택을했을 때 각 기능에 해당하는 핸들러이며, 실질적 목적을 달성하기 위한 코드가 기록되어 있다.

 

- IsDebuggerPresent()는 디버깅 중일 때 TRUE, 디버깅 중이 아닐 때 FALSE를 리턴하는데 FALSE는 0이므로 data 배열 변수에 eax를 0으로 만들고 리턴하는 옵코드를 추가한다.

- 그리고 IsDebuggerPresent()의 엔트리 포인트를 해당 버퍼로 바꿈으로써 앞으로 IsDebuggerPresent()는 디버거가 붙어 있든 아니든 무조건 FALSE가 리턴되는 형태를 통해 IsDebuggerPresent()를 우회할 수 있다.




 

 

 

디버거 플러그인 해결한 오류

 

지난 활동 당시 수많은.. LNK2019 오류와 마주하였다.

계속해서 구글링을 해보면서 다양한 시도를 해보았지만, 오류를 해결할 수는 없었다.

그래서 잠시 방향을 틀어, 소스코드를 가져온 깃허브에서 readme를 다시 읽어보았다.

추가하지 않은 파일이 있는 것으로 생각되어 몇 가지를 추가해주었다.

 

그랬더니 수많은 링크 오류가 모두 사라지고 딱 하나의 오류만 남게 되었다.

 

-> https://comso.tistory.com/entry/%EB%B9%84%EC%A3%BC%EC%96%BC-%EC%8A%A4%ED%8A%9C%EB%94%94%EC%98%A4-Express-%EC%97%90%EC%84%9C 참조하여 해결하였다

 

출처 : 리버스 엔지니어링 바이블