
IDA Pro 플러그인으로, 어셈블리 패턴, 바이트 시퀀스, 문자열/이름 참조, 크기 제약 조건으로 함수를 필터링하며, 규칙 기반 검색 및 고급 바이너리 복사를 지원합니다.
FindFunc는 IDA Pro 플러그인으로, 특정 어셈블리 또는 바이트 패턴을 포함하거나, 특정 이름이나 문자열을 참조하거나, 기타 다양한 제약 조건을 충족하는 코드 함수를 찾습니다.
FindFunc는 2022 HexRays IDA Pro 플러그인 대회에서 3위를 차지했습니다!

FindFunc의 주요 기능은 사용자가 IDA Pro의 코드 함수가 충족해야 하는 일련의 "규칙" 또는 제약 조건을 지정할 수 있도록 하는 것입니다. FF는 모든 규칙을 충족하는 모든 함수를 찾아 나열합니다(현재 모든 규칙은 AND 결합입니다). 예외: 규칙을 "반전"시켜 부정 일치로 만들 수 있습니다. 이러한 규칙은 "AND NOT"에 해당합니다.
FF는 처리 시간을 최소화하기 위해 규칙을 스마트한 순서로 스케줄링합니다. 기능 개요:
"Find Functions" 버튼은 기존 결과를 지우고 새 검색을 시작하며, "Refine Results"는 이전 검색 결과만을 고려합니다.
FF의 보조 기능은 명령어의 바이너리 표현을 다음 옵션으로 복사하는 것입니다:
자세한 내용은 아래 "고급 복사" 섹션을 참조하세요. 이 기능은 바이트 패턴 규칙과 완벽하게 보완됩니다!
FindFunc는 외부 패키지 의존성이 없는 IDA Pro 파이썬 플러그인입니다. 저장소를 다운로드하고 'findfuncmain.py' 파일과 'findfunc' 폴더를 IDA Pro 플러그인 디렉토리에 복사하여 설치할 수 있습니다. IDA 9.0+의 경우 저장소를 플러그인 디렉토리에 직접 클론할 수도 있습니다. 어느 쪽이든 빌드는 필요하지 않습니다.
요구 사항: python3 환경의 IDA Pro 8.x (8.3+). FindFunc는 x86/x64 아키텍처 전용으로 설계되었습니다. Windows 10 + 11에서 IDA 8.3 - 9.2, python 3.11로 테스트되었습니다.
현재 다음 여섯 가지 규칙을 사용할 수 있습니다. 성능 영향에 따라 무거운 순서에서 가벼운 순서로 정렬되어 있습니다. 큰 데이터베이스의 경우, 먼저 저렴한 규칙으로 후보 함수를 줄인 후, 코드 규칙과 같은 무거운 매칭을 수행하는 것이 좋습니다. FF는 규칙을 자동으로 스마트하게 스케줄링합니다.
주어진 어셈블리 코드 조각을 포함하는 함수를 필터링하는 규칙입니다. 이는 IDA의 텍스트 디스어셈블리 표현에 대한 텍스트 검색이 아니라, 기본 명령어의 고급 매칭을 수행합니다. 조각은 한 줄에 하나씩 여러 연속 명령어를 포함할 수 있습니다. 함수 청크가 지원됩니다. 리터럴 어셈블리 외에도 특수 와일드카드 매칭을 지원합니다:
추가 예제:
mov r64, [r32 * 8 + 0x100]
mov r, [r * 8 - 0x100]
mov r64, [r32 * 8 + imm]
pass
mov r, word [eax + r32 * 8 - 0x100]
any r64, r64
push imm
push any
주의사항: IDA에서 어셈블리를 복사할 때 주의하세요. IDA는 지역 변수 이름 및 기타 정보를 명령어에 혼합하여 매칭 실패를 초래합니다. 또한 레이블은 지원되지 않습니다("call sub_123456").
코드 패턴은 가장 비용이 많이 드는 규칙이며, 코드 규칙만 있는 경우 FF는 전체 데이터베이스를 디스어셈블할 수밖에 없습니다. 이는 매우 큰 바이너리의 경우 최대 몇 분까지 걸릴 수 있습니다. 아래 성능에 대한 참고 사항을 참조하세요.
함수는 주어진 즉시값을 적어도 한 번 어떤 위치에 포함해야 합니다. 즉시값은 명령어의 바이너리 표현에 고정된 값입니다. 즉시값 0x100과 일치하는 명령어 예:
mov eax, 0x100
mov eax, [0x100]
and al, [eax + ebx*8 + 0x100]
push 0x100
즉시값은 클립보드에서 규칙 목록으로 직접 붙여넣을 수 있습니다. 참고: IDA는 모든 크기와 모든 위치의 즉시값을 광범위하게 매칭합니다. 4바이트 또는 8바이트의 특정 너비를 알고 있다면 바이트 패턴이 더 빠를 수 있지만(거짓 양성 발생 가능성이 있음).
함수는 주어진 바이트 패턴을 적어도 한 번 포함해야 합니다. 패턴은 IDA의 바이너리 검색과 동일한 형식이므로 와일드카드를 지원합니다. 고급 복사 기능과 완벽하게 일치합니다!
예:
11 22 33 44 aa bb cc
11 22 33 ?? ?? bb cc -> ??는 모든 바이트 가능
바이트 패턴은 클립보드에서 규칙 목록으로 직접 붙여넣을 수 있습니다. 참고: 패턴 매칭은 매우 빠르며 일치 항목을 빠르게 줄이는 좋은 후보입니다!
함수는 주어진 문자열을 적어도 한 번 참조해야 합니다. 문자열은 Python의 'fnmatch' 모듈에 따라 매칭되므로 와일드카드 같은 매칭을 지원합니다. 매칭은 대소문자를 구분하지 않습니다. 다음 형식의 문자열이 고려됩니다: [idaapi.STRTYPE_C, idaapi.STRTYPE_C_16] (Config 클래스에서 변경 가능).
예:
참고: 문자열 매칭은 빠르며 후보를 빠르게 줄이는 좋은 선택입니다!
함수는 주어진 이름/레이블을 적어도 한 번 참조해야 합니다. 이름/레이블은 Python의 'fnmatch' 모듈에 따라 매칭되므로 와일드카드 같은 매칭을 지원합니다. 매칭은 대소문자를 구분하지 않습니다.
예:
참고: 이름 매칭은 매우 빠르며 후보를 빠르게 줄이는 데 이상적입니다!
함수의 크기는 주어진 범위 내에 있어야 합니다: "min <= functionsize <= max". 데이터는 "min,max" 형식의 문자열로 입력됩니다. 함수의 크기는 모든 청크를 포함합니다.
참고: 함수 크기 매칭은 매우 빠르며 후보를 빠르게 줄이는 데 이상적입니다!
편의를 위해 FF는 다음 키보드 단축키를 사용할 수 있습니다:
추가 GUI 사용법
어셈블리의 바이너리 패턴을 검색하고 싶지만 하드코딩된 주소와 값(즉시값)을 제외하거나, 명령어의 실제 opcode만 검색하고 싶은 경우가 많습니다. FindFunc는 디스어셈블리 팝업 메뉴에 세 가지 복사 옵션을 추가하여 이를 쉽게 만듭니다:
모든 명령어 바이트를 16진수 문자열로 클립보드에 복사하여 바이트 패턴 규칙(또는 IDA의 바이너리 검색)에 사용합니다.
B8 44332211 mov eax,11223344
68 00000001 push 1000000
66:894424 70 mov word ptr ss:[esp+70],ax
다음과 같이 복사됩니다:
b8 44 33 22 11 68 00 00 00 01 66 89 44 24 70
주어진 명령어에 대해 즉시값을 마스킹한 명령어 바이트를 복사합니다. 예:
B8 44332211 mov eax,11223344
68 00000001 push 1000000
66:894424 70 mov word ptr ss:[esp+70],ax
다음과 같이 복사됩니다:
b8 ?? ?? ?? ?? 68 ?? ?? ?? ?? 66 89 44 24 ??
모든 명령어 바이트를 16진수 문자열로 클립보드에 복사하되, 실제 opcode가 아닌 바이트(sib, modrm 포함, 레거시 접두사는 유지)를 마스킹합니다.
B8 44332211 mov eax,11223344
68 00000001 push 1000000
66:894424 70 mov word ptr ss:[esp+70],ax
다음과 같이 복사됩니다:
b8 ?? ?? ?? ?? 68 ?? ?? ?? ?? 66 89 ?? ?? ??
opcode와 즉시값은 유지하지만 mod r/m 등을 마스킹하는 조합입니다. 참고: 특정 레지스터를 요구하는 경우에도 opcode를 유지합니다. 예:
B8 44332211 mov eax,11223344
opcode B8을 유지합니다.
참고: 이는 IDA API를 사용한 "최선의 노력"이므로 일부 경우에만 부분적으로 작동할 수 있습니다. 100% 정확한 솔루션을 위해서는 전용 x86 디스어셈블 라이브러리를 제공해야 합니다.
코드 패턴 규칙으로도 유사한 결과를 얻을 수 있지만, 사용자 상호작용과 실제 검색 모두에서 이 방법이 더 빠를 수 있습니다.
선택한 디스어셈블리를 IDA에 표시된 그대로 클립보드에 복사합니다.
성능에 대한 간략한 설명: