VSCode에서 IDAPython 사용하기

eunjo·2022년 7월 23일
0

IDAPython을 사용하는 방법은 크게 두 가지가 있습니다.

  1. File > Script File을 클릭하여 스크립트 파일을 로딩시키기
  2. IDA에서 제공되는 편집기 사용하기 (Shift+F2 or 하단에 위치한 인터프리터)

저는 그간 IDAPython을 쓰면서 이러한 방법들이 사용하기 불편하다고 느꼈어요. IDA에서 제공되는 편집기를 사용하면 코드 인텔리전스가 지원되지 않아 패키지에 어떤 API들이 있는지, API의 프로토타입은 어떻게 되는지 알 수 없었고 (문서도 별로 안 친절해요), 외부 편집기를 사용하자니 스크립트 파일을 복사하여 실행시켜야 하는 등등 어려움이 있었습니다. 그런 와중 가뭄에 단비같은 플러그인을 찾아서 공유해요!

0. 환경 구성

  • IDA Pro 7.7
  • Visual Studio Code 1.69
  • Python 3.10

IDA, VSCode, Python은 설치되어 있다고 가정하겠습니다. 제가 사용하는 버전은 위와 같고, 다른 버전에서는 테스트해보지 않았습니다.

1. 플러그인 설치

IDACode 플러그인을 IDA와 VSCode에 각각 설치할 거에요.

1.1. IDACode - IDA


위 링크에서 릴리즈 파일 중 ida.zip을 내려받아주세요. 압축을 푸시고 idacode_utils, idacode.py%IDAPATH%\plugins 폴더 안에 복사하시면 됩니다.

python -m pip install debugpy tornado

추가적으로 위 명령어를 입력하여 플러그인이 동작하기 위한 종속성 패키지를 설치해주세요.

1.2. IDACode - VSCode

마켓에서 idacode 검색 후 설치하시면 끄-읏

2. IDAPython 스크립트 실행

  • Ctrl+3 > IDACode
  • Edit > Plugins > IDACode

위 방법 중 하나를 선택하셔서 IDACode를 실행하시면 127.0.0.1의 특정 포트를 열게 됩니다. 해당 포트로 VSCode가 IDA에게 스크립트를 전달해주는 것으로 보입니다. 참고로 포트를 여는 작업은 IDB를 매 번 실행할 때마다 수동으로 해주어야 합니다. IDACode 플러그인을 조금 수정하면 IDB를 열 때 자동으로 포트를 여는 것도 가능해 보입니다.

[IDACode] Listening on 127.0.0.1:7065

IDA에서 포트를 정상적으로 여셨다면 위 메시지가 출력됩니다.

import ida_dbg
import ida_nalt

def init_debugger():
    execpath = '1'
    inputpath = '2'
    execdir = '3'
    args = '4'
    ida_dbg.load_debugger('win32', 0)
    ida_nalt.set_root_filename(inputpath)
    ida_dbg.set_process_options(execpath, args, execdir, '', '', 23946)

init_debugger()

이제 VSCode에서 IDAPython 스크립트를 작성해보아요. 예시로 디버거의 설정을 수정하는 스크립트를 실행해볼게요.

스크립트가 정상적으로 실행되었네요!

VSCode에서 IDACode 익스텐션의 기능을 보시면(Ctrl+Shift+P를 누르고 idacode 검색) 네 가지 기능이 있습니다.

  • Connect to IDA: IDA에서 열어뒀던 포트와 연결
  • Execute script in IDA: IDAPython 스크립트를 IDA에서 실행 (IDA와 연결된 상태에서 가능)
  • Attach a debugger to IDA: VSCode 디버그 모드로 돌입 (IDA와 연결된 상태에서 가능)
  • Connect and attach a debugger to IDA: 연결 후 VSCode 디버그 모드 돌입

IDA와 연결 후 스크립트를 실행한다는 점이 포인트에요. VSCode 디버그 모드의 장점은 IDACode 로그가 디버그 콘솔에 기록되기 때문에 현재 상황을 알기 쉬워서 좋습니다.

IDA와 연결하시고 나면 스크립트 파일을 저장만 해도 실행이 될텐데, VSCode에서 IDACode 익스텐션 설정을 수정하시면 변경 가능합니다.

3. IDAPython 스크립트 디버깅

import ida_dbg
import ida_nalt

def init_debugger():
    execpath = '1'
    inputpath = '2'
    execdir = '3'
    args = '4'
    ida_dbg.load_debugger('win32', 0)
    ida_nalt.set_root_filename(inputpath)
    breakpoint()    # 다음 줄부터 breakpoint가 걸림
    ida_dbg.set_process_options(execpath, args, execdir, '', '', 23946)

init_debugger()

Python의 기본 내장 함수인 breakpoint()를 호출하면 다음 줄부터 디버깅이 가능합니다. IDA의 디버깅 여부와는 관계가 없으므로 IDA가 분석 대상 프로그램을 실행 중이 아니더라도 IDAPython 스크립트 디버깅은 가능합니다.

스크립트 수준에서 디버깅이 가능한게 큰 장점입니다. 또한 VSCode 상에서 디버깅을 하는 것이기에 코드 인텔리전스 또한 사용이 가능합니다. 만약, VSCode에서 IDAPython 패키지를 인식하지 못한다면 환경변수 %PYTHONPATH%에 다음 경로를 추가해주세요.

  • %IDAPATH%\python\3
  • %IDAPATH%\plugins

위 두 경로를 추가하시고 VSCode를 재실행하시면 IDAPython 패키지 인식이 가능할거에요.

A. 참고 자료

profile
바이너리 분석이 좋아요

1개의 댓글

comment-user-thumbnail
2022년 8월 13일

너무너무 좋은 글이네요. 감사합니다!

답글 달기