
IDA Pro용 대화형 바이너리 패치 플러그인

기존 프로그램의 동작을 변경하기 위해 어셈블리 코드를 패칭하는 것은 악성코드 분석, 소프트웨어 리버스 엔지니어링 및 보안 연구의 더 넓은 영역에서 드문 일이 아닙니다. 이 프로젝트는 인기 있는 IDA Pro 디스어셈블러를 확장하여 빠른 반복을 위해 설계된 보다 강력한 대화형 바이너리 패칭 워크플로우를 만듭니다.
이 프로젝트는 현재 널리 사용되는 Keystone Engine의 작은 포크를 기반으로 하며, x86/x64 및 Arm/Arm64 패칭을 지원하고 향후 릴리스에서 나머지 Keystone 아키텍처를 활성화할 계획입니다.
이 플러그인 개발을 지원해 주신 Hex-Rays에 특별히 감사드립니다.
이 플러그인은 IDA 7.6과 Python 3이 필요합니다. Windows, Linux, macOS를 지원합니다.
이전 버전의 IDA(8.2 이하)는 Python 3.11 이상과 호환되지 않습니다 .
IDA 콘솔에서 다음 줄을 실행하여 플러그인을 자동으로 설치하세요:
import urllib.request as r; exec(r.urlopen('https://github.com/gaasedelen/patching/raw/main/install.py').read())
import urllib.request as r; exec(r.urlopen('https://github.com/gaasedelen/patching/raw/main/install.py', cafile='/etc/ssl/cert.pem').read())
또는 릴리스 페이지에서 해당 플랫폼용 배포 가능한 플러그인 패키지를 다운로드하고 플러그인 폴더에 압축을 풀어 수동으로 설치할 수 있습니다.
이 플러그인을 IDA의 사용자 플러그인 디렉토리에 설치하는 것을 강력히 권장합니다:
import ida_diskio, os; print(os.path.join(ida_diskio.get_user_idadir(), "plugins"))
패칭 플러그인은 지원되는 아키텍처(x86/x64/Arm/Arm64)에 대해 자동으로 로드되며, IDA 디스어셈블리 뷰의 오른쪽 클릭 컨텍스트 메뉴에 관련 패칭 작업을 삽입합니다:

컨텍스트별 패칭 작업의 전체 목록은 다음 섹션에서 설명합니다.
오른쪽 클릭 컨텍스트 메뉴의 'Assemble' 작업을 통해 기본 패칭 대화 상자를 열 수 있습니다. 이 대화 상자는 기본 IDA 디스어셈블리 뷰를 시뮬레이션하여 여러 명령어를 빠르게 연속해서 편집하는 데 사용할 수 있습니다.

어셈블리 라인은 실시간으로 명령어를 수정하는 데 사용할 수 있는 편집 가능한 필드입니다. Enter 키를 누르면 입력된 명령어가 커밋(패치)되어 데이터베이스에 저장됩니다.
현재 위치(즉, 커서)는 항상 녹색으로 강조 표시됩니다. 패치/편집 결과 덮어쓰여질 명령어는 패치를 커밋하기 전에 빨간색으로 강조 표시됩니다.

마지막으로, 편집 가능한 어셈블리 텍스트 필드에 포커스가 있는 상태에서 UP 및 DOWN 화살표 키를 사용하여 마우스를 사용하지 않고도 디스어셈블리 뷰에서 커서를 빠르게 위아래로 이동할 수 있습니다.
가장 일반적인 패칭 작업은 하나 이상의 명령어를 NOP 처리하는 것입니다. 이러한 이유로 NOP 작업은 빠른 액세스를 위해 항상 오른쪽 클릭 메뉴에 표시됩니다.

개별 명령어뿐만 아니라 선택한 범위의 명령어도 NOP 처리할 수 있습니다.
조건부 점프가 항상 '좋은' 경로를 실행하도록 강제하는 것도 또 다른 일반적인 패칭 작업입니다. 플러그인은 조건부 점프 명령어를 오른쪽 클릭할 때만 이 작업을 표시합니다.

조건부 점프를 절대 수행하지 않게 하려면 대신 NOP 처리하면 됩니다!
패치는 언제든지 패칭 서브메뉴를 통해 선택한 실행 파일에 저장(적용)할 수 있습니다. 빠른 적용 작업은 동일한 설정을 사용하여 후속 패치를 훨씬 더 빠르게 저장할 수 있도록 합니다.

플러그인은 또한 저장할 때마다 현재 데이터베이스 패치 세트를 '깔끔하게' 적용하는 데 사용하는 원본 실행 파일의 백업(.bak)을 적극적으로 유지합니다.
마지막으로, 패치가 마음에 들지 않으면 패치된(노란색) 명령어 블록을 오른쪽 클릭하여 원래 값으로 되돌릴 수 있습니다.

바이트를 원래 값으로 되돌리는 것은 '쉽지만', 분석을 이전 상태로 복원하는 것은 '어려울' 수 있습니다. 패치를 되돌리면 때때로 추가적인 수동 수정이 필요할 수 있습니다.
시간과 동기가 허락된다면, 향후 작업에는 다음이 포함될 수 있습니다:
xor eax, eax; ret;)Pretty: mov [rsp+48h+dwCreationDisposition], 3
Raw: mov [rsp+20h], 3
외부 기여, 이슈 및 기능 요청을 환영합니다. 풀 리퀘스트는 향후 릴리스에서 고려되길 원하신다면 이 저장소의 develop 브랜치로 보내주시기 바랍니다.