
KeyPatch Enhanced — Keystone Engine 기반의 심볼 인식 x86/x64 어셈블리 패치를 위한 IDA Pro 플러그인. 자동 IDA 심볼 해석, RIP 상대 인코딩, _↔. 이름 보정 기능을 갖춘 Keypatch의 포크.
Keypatch(Nguyen Anh Quynh & Thanh Nguyen 제작)를 기반으로 Euarno가 수정한 강화 포크입니다.
핵심 개선 사항: x86/x64 어셈블리에서 IDA 심볼 이름을 직접 사용할 수 있으며, 플러그인이 자동으로 주소를 해석하고 올바른 RIP-relative / rel32 인코딩을 생성합니다.
Keypatch 대화 상자에서 심볼 이름이 포함된 명령어를 직접 입력할 수 있으며, 주소와 오프셋을 수동으로 계산할 필요가 없습니다:
call rc4_crypt ; rel32 상대 오프셋 자동 계산
jmp main ; 위와 동일
lea rcx, enc_0 ; x64: lea rcx, [rip + disp32] 자동 생성
lea rax, Format ; 위와 동일
_ ↔ .)IDA는 때때로 데이터베이스의 .을 _로 표시합니다(예: enc.0이 enc_0으로 표시). 플러그인은 자동으로 _ → . 변형을 시도하여 조회하므로 IDA 내부 저장 형식을 신경 쓸 필요가 없습니다.
| 유형 | 예시 | 처리 방식 |
|---|---|---|
| CALL / JMP / Jcc | call func_name | 심볼 → 절대 주소, Keystone이 rel32 계산 |
| LEA(단독 심볼) | lea rcx, symbol | x64: → lea rcx, [rip + disp32]x86: → lea ecx, [addr] |
| LEA(복합 피연산자) | lea rcx, [rbp+0x120+Str] | 심볼만 주소 값으로 치환하고 표현식 구조는 유지 |
| MOV offset | mov rax, offset symbol | x64: lea rax, [rip + disp32]로 변환범위를 벗어나면 mov rax, imm64 사용 |
메모리 접근 [symbol] | mov rax, qword ptr [symbol] | [symbol] → [0xADDR], Keystone이 자동 인코딩 |
| 즉시값 심볼 | push symbol | 심볼 → 0xADDR |
어셈블 실패 시 출력 창에 다음이 표시됩니다:
Keypatch: Keystone error: Invalid operand (KS_ERR_ASM_INVALIDOPERAND)
Keypatch: input asm : lea rcx, [rip + 0x176E3]
Keypatch: fixed asm : LEA RCX, [RIP + 0x176E3]
Keypatch: address : 0x140001966
pip install keystone-engine
keypatch.py를 IDA 플러그인 디렉터리에 복사합니다:
| 시스템 | 경로 |
|---|---|
| Windows | %APPDATA%\Hex-Rays\IDA Pro\plugins\ 또는 <IDA 설치 디렉터리>\plugins\ |
| macOS | ~/.idapro/plugins/ 또는 <IDA 설치 디렉터리>/plugins/ |
| Linux | ~/.idapro/plugins/ 또는 <IDA 설치 디렉터리>/plugins/ |
IDA를 재시작하면 됩니다.
0x140001966 위치에서 rc4_crypt로 점프하는 명령어를 patch한다고 가정합니다:
Assembly: call rc4_crypt
플러그인이 rc4_crypt의 주소를 자동으로 해석하고 rel32 오프셋을 계산하여 올바른 E8 xx xx xx xx 인코딩을 생성합니다.
Assembly: lea rcx, enc_0
플러그인이 자동으로:
enc_0(내부 이름은 enc.0일 수 있음) 해석 → 주소 0x140013050disp32 = 0x140013050 - (0x140001966 + 7)lea rcx, [rip + 0x176E3] 생성nop)를 입력하면 전체 범위에 자동으로 채워짐lea와 [symbol]의 RIP-relative 주소 지정 범위는 ±2GB입니다. 심볼이 범위를 벗어나면 플러그인이 오류를 표시합니다.push symbol을 사용할 경우 심볼 주소가 0x7FFFFFFF 이하여야 합니다(imm32 부호 확장). 그렇지 않으면 경고가 발생합니다. lea reg, symbol + push reg로 변경하는 것을 권장합니다.lea rcx, sym; call func 형태의 다중 문장 심볼 해석은 현재 지원하지 않습니다. 한 줄씩 patch하십시오._ ↔ . 이름 보정, x64 RIP-relative 인코딩 지원, 강화된 오류 출력본 수정 버전은 MIT 라이선스로 배포됩니다. 자세한 내용은 LICENSE 파일을 참조하십시오.
원본 Keypatch 코드의 저작권은 원작자에게 있으며, GPL v2에 따라 배포됩니다.