Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
rdx — Rust로 작성된 네이티브 APK 및 DEX 디컴파일러 | Kitploit
도구/GitHubGitHub/ch0pin/rdx
Android SecurityStatic AnalysisCode AnalysisDynamic Code Analysis (DAST)Mobile App PentestingReverse EngineeringMobile SecurityUtilities & FrameworksBinary Analysis
GitHubch0pin/rdx

rdx

Rust로 작성된 네이티브 APK 및 DEX 디컴파일러

261201일 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
저장소 보기

JADX 출처 표기 및 네이티브 DEX 포팅

src/native_dex.rs의 초기 Rust DEX 파서는 JADX v1.5.6의 파싱 로직을 각색한 것으로, 커밋 28ff15e4ae69950aebea110a13e5ab895d234dfc에 고정되어 있습니다. JADX의 저작권은 Skylot과 그 기여자들에게 있으며, 해당 Android Open Source Project 및 기타 업스트림 고지는 NOTICE에 보존되어 있습니다.

참조 구현은 DEX 입력 플러그인으로, DexReader, sections/DexHeader, sections/SectionReader, sections/DexClassData, utils/Leb128을 포함합니다.

RDX 수정 사항은 파서 로직을 검사된 바이트 접근, 명시적 오류 전파, RDX 소유의 클래스/멤버 표현을 사용하여 Rust로 변환합니다. 네이티브 소스 이미터는 새로운 RDX 코드입니다. 이는 초기이자 부분적인 파서 및 네이티브 엔진 구현이며, JADX의 디컴파일 파이프라인 전체를 포팅한 것도, 동등한 출력 범위를 주장하는 것도 아닙니다.

아래 파일들은 고정된 릴리스에서 다운로드한 수정되지 않은 사본입니다:

  • LICENSE: https://raw.githubusercontent.com/skylot/jadx/v1.5.6/LICENSE (Git blob 8dada3edaf50dbc082c9a125058f25def75e625a).
  • NOTICE: https://raw.githubusercontent.com/skylot/jadx/v1.5.6/NOTICE (Git blob 5c0b69a0f5298e0b329e33e860f7626f0c2c3891).

업스트림 NOTICE 전체가 보존되며, 여기에는 역사적인 번들 라이브러리 및 아이콘 고지가 포함됩니다. 보존한다고 해서 Rust 파서가 그러한 라이브러리나 자산을 모두 포함한다는 의미는 아닙니다. Java 구현과 그 런타임 의존성은 더 이상 배포되지 않습니다.

각색된 파서를 포함하는 배포판은 해당 라이선스와 고지를 포함해야 합니다. 추가 업스트림 파일에서 파생된 변경 사항은 그 고지를 유지하고 포팅이 확장됨에 따라 이 소스 매핑을 확장해야 합니다.

네이티브 Android 바이너리 XML 디코딩

src/native_resources.rs는 고정된 JADX v1.5.6 jadx-core/src/main/java/jadx/core/xmlgen/BinaryXMLParser.java의 청크 디스패치, 네임스페이스, 엘리먼트 및 타입 지정 속성 파싱을 네이티브 Rust로 매핑합니다. 문자열 풀 리더와 경계가 지정된 XML 이미터는 RDX 코드입니다. 디코더는 입력/청크/문자열 경계를 검증하고, UTF-8/UTF-16 풀을 지원하며, Java 런타임 없이 일반적인 Android 타입 지정 속성 값을 처리합니다. 리소스 ID는 숫자로 유지됩니다: ARSC 심볼 조회와 매니페스트 enum/flag 이름은 아직 포팅되지 않았습니다. 이는 완전한 업스트림 리소스 하위 시스템이 아닙니다.

네이티브 Java 재구성

src/native_java/는 각색된 DEX 리더 위에 놓인 RDX의 보수적인 Rust 레지스터-값 로어링 및 Java 이미션 계층입니다. 지원되는 타입 지정 명령어, 전방 분기, 단순 루프 및 전방 스위치를 명시적 효과 구체화와 생성된 소스 매핑으로 처리합니다. 배열/타입 opcode 처리는 AOSP DEX 명령어 명세를 따릅니다. 이는 JADX의 CFG/SSA/타입 추론 파이프라인의 포트가 아니며 그 재구성 범위를 주장하지 않습니다. 지원되지 않는 메서드는 네이티브 DEX 출력을 유지합니다.

기본 블록 파이프라인 포트

src/native_cfg.rs는 고정된 JADX BlockSplitter.java의 분할/연결 접근 방식을 각색합니다. Rust 구현은 검사된 DEX 코드 단위에서 직접 동작하고, goto 명령어와 원래 오프셋을 유지하며, 페이로드 데이터를 제외하고, 예외적 엣지에 대해 보호된 명령어를 보수적으로 격리합니다. 아직 JADX의 합성 블록 변환, SSA 또는 영역 구성을 구현하지 않습니다. 지배자 분석은 아래에 설명된 별도의 단계입니다. 이 단계는 별도의 코퍼스 감사를 통해 노출됩니다; GUI 소스 렌더러는 여전히 기존 레지스터-값 로어링을 사용합니다. 남은 패스에 대해서는 docs/jadx-port-plan.md를 참조하십시오.

src/native_dominators.rs는 고정된 DominatorTree.java를 각색합니다: Cooper/Harvey/Kennedy 반복적 즉시 지배자 알고리즘, 선행자 교집합 및 지배 프런티어 순회. Rust 수정 사항은 원래 블록 ID를 보존하고, 반복적 역-후위 순회를 사용하며, 작업/프런티어 저장을 제한하고, 블록별 지배자 비트셋 대신 트리 구간을 지배 쿼리에 사용합니다. 가상 진입 선행자가 메서드 진입으로의 역방향 엣지를 처리합니다. 도달 가능성은 정상 및 보수적 예외적 엣지를 통한 실제 메서드 진입에서 시작됩니다; 연결이 끊긴 핸들러 블록은 도달 불가능으로 보고됩니다. 이는 지배자 분석이며, 완전한 BlockProcessor 변환 패스가 아닙니다.

SSA를 위한 명령어 피연산자

src/native_ir.rs는 고정된 InsnDecoder.java의 명령어 패밀리 피연산자 매핑을 각색합니다. 검사된 원시 DEX 피연산자 리더는 AOSP 명령어 형식을 따르며 RDX 코드입니다. 오프셋/opcode, 순서가 지정된 레지스터 읽기 및 쓰기, 워드 폭, 리터럴, 인덱스 참조 및 보수적 예외 발생 동작을 유지합니다. 업스트림과 달리 아직 풀 항목을 해석하거나 호출 결과를 병합하거나 타입 추론을 수행하지 않습니다. 호출 인수는 시그니처 해석 전까지 순서가 지정된 원시 레지스터 워드로 유지됩니다. src/native_calls.rs는 이제 메서드 풀 항목을 해석하고 수신자/인수 워드를 유효 프로토타입별로 그룹화하며, 동일한 고정된 InsnDecoder invoke/결과 규칙을 따릅니다. 와이드 인수, 배열 소유자, 다형적 보조 프로토타입 및 채워진 배열을 처리하고, 인접한 타입 지정 move-result 명령어를 연결합니다. 사용자 정의 invoke는 호출 지점 메타데이터 누락을 명시적으로 거부합니다. 이는 시그니처 바인딩이며, 가상 디스패치 해석이나 SSA가 아닙니다.

레지스터 범주는 추론된 Java 타입이 아니라 저장 폭/참조 제약을 설명합니다. CFG와 피연산자 디코딩은 하나의 명령어 폭 디코더를 공유합니다; 이 분석 파이프라인이 구축되는 동안 기존 소스 렌더러는 별도로 유지됩니다.

추가 네이티브 메타데이터 및 타입 지정 로어링

src/native_dex_metadata.rs는 AOSP DEX 형식에서 인코딩된 값, try/catch 핸들러 목록 및 공유 클래스/필드/메서드/매개변수 애너테이션 세트를 디코딩합니다. 검사된 오프셋, 할당/작업 예산, 공유 핸들러 저장 및 Rust 표현은 RDX 코드입니다. src/native_java/annotations.rs는 일반적인 Java 애너테이션 값을 렌더링하며, 타입/enum 링크와 이스케이프된 문자열/문자를 유지합니다. 애너테이션 배치는 고정된 AnnotationGen.java를 따릅니다. 빌드/런타임 애너테이션이 표시되며, DEX 폴백 본문이 있는 메서드의 경우도 포함됩니다. 시스템 애너테이션은 메타데이터로 유지됩니다; Throws는 throws 절로도 렌더링됩니다. 지원되지 않는 Java 값은 명시적으로 표시됩니다. 애너테이션 기본값과 디버그 메타데이터는 완전히 재구성되지 않습니다.

src/native_java/numeric.rs, strings.rs, liveness.rs 및 예외 렌더러는 DEX 명령어 시맨틱 위에 놓인 RDX 구현입니다. 그 보수적 폴백 경계와 독립적인 Rust 동작 픽스처는 docs/native-engine.md와 docs/validation.md에 문서화되어 있습니다. 이들은 업스트림 Java 코드를 실행하거나 내장하지 않습니다.

네이티브 SSA

src/native_ssa.rs는 고정된 JADX SSATransform.java의 live-in으로 정리된 지배 프런티어 phi 삽입 및 이름 변경을 각색합니다. Rust 각색은 반복적 순회, 경계가 지정된 워드 아이덴티티 및 합성 정상-성공 블록을 사용하여 쓰기 전 예외 상태를 보존합니다. 후자는 업스트림의 이름 변경 후 try-엣지 복구를 대체합니다. Phi 단순화는 아직 포팅되지 않았습니다; 부분 타입 추론은 아래에 설명되어 있습니다. native_call_values.rs는 기존 시그니처 제약을 SSA 워드에 연결합니다. 업스트림 Java는 실행되지 않습니다.

SSA 타입 경계 및 생성자 아이덴티티

src/native_types.rs는 고정된 JADX TypeInferenceVisitor.java 및 TypeUpdate.java의 할당/사용-경계 분리 및 전파 시퀀스를 각색합니다. 경계가 지정된 Rust 워크리스트, 워드 쌍 검사, 리터럴 대안 및 명시적 미해결/충돌 결과는 RDX 각색입니다. 이는 부분 추론입니다: 배열-요소 리스너가 이제 로드 타입과 저장 제약을 전파합니다. 일반적인 역방향 배열 추론, 참조 최소 상한, 제네릭 및 변환 삽입은 아직 불완전합니다.

src/native_constructors.rs는 고정된 ConstructorVisitor.java에서처럼 SSA 할당 체인을 따릅니다. RDX는 할당 지배를 검사하고 원점과 원래 호출된 소유자를 유지합니다. 다른 소유자는 계층 구조가 그것이 할당 타입의 조상임을 증명할 때만 재타게팅 대상으로 표시됩니다. this에서 증명된 조상을 통한 체이닝은 고정된 ConstructorInsn.java를 따릅니다. 이 분석은 명령어를 제거하거나 이동하지 않고, 초기화 상태 유효성을 확립하지 않으며, 생성자를 이미트하지 않습니다.

native_java/allocation_lowering.rs의 경계가 지정된 중첩-할당 경로는 이제 이러한 SSA 생성자 바인딩을 소비합니다. 정확한 할당/invoke 아이덴티티와 RDX 효과-이벤트 검사가 공유-캡처 Java 표현식을 게이팅합니다. 이 통합은 전체 JADX 영역/코드 생성 파이프라인의 포트가 아닙니다; 소유자-재타게팅 이미션, 예외 영역 및 일반 초기화 상태 검증은 이 경로에서 여전히 지원되지 않습니다.

native_hierarchy.rs의 배열 할당 관계는 JLS 4.10.3을 따릅니다: 참조 컴포넌트 공변성, 불변 원시 컴포넌트 및 표준 Object/Cloneable/Serializable 상위 타입. 디스크립터 중첩은 경계가 지정됩니다; 누락된 외부 클래스 관계는 알 수 없는 상태로 유지됩니다.

작은 플랫폼 계층 구조에는 Throwable / Serializable 및 SQLException / Iterable에 대한 검증된 인터페이스 엣지도 포함됩니다. 이러한 사실은 이전의 예외 전용 부모 그래프에서 발생하던 거짓 음성 하위 타입 답변을 피합니다; 이들은 완전한 Android 플랫폼 클래스패스를 구성하지 않습니다.

할당 인수 내의 빌더 호출

경계가 지정된 할당 디코더는 고정된 SimplifyVisitor.convertInvoke의 비체이닝 빌더-사용 패턴에 따라 무시된 StringBuilder.append(String) 결과를 인식합니다. RDX는 실제 생성자/append 호출과 정확한 효과 추적을 유지합니다; 업스트림의 전체 문자열-연결 변환을 수행하지 않습니다. 문서화된 수신자-반환 계약을 가진 정확한 최종 플랫폼 클래스와 오버로드만 허용됩니다; 임의의 플루언트처럼 보이는 메서드는 지원되지 않습니다. StringBuilder.append(String)을 참조하십시오.

조상-소유자 슈퍼클래스 호출

native_java/method.rs의 클래스 invoke-super 이미션은 고정된 InsnGen.callSuper/getClassForSuperCall의 슈퍼클래스 처리를 따릅니다. RDX는 DEX 메서드 소유자가 직접 부모와 같을 것을 요구하는 대신, 경계가 지정된 불변 계층 구조를 사용하여 엄격한 슈퍼클래스 조상을 증명합니다. super.method(...)를 이미트하고 탐색 메타데이터에 원래 DEX 시그니처를 유지합니다. 수신자는 여전히 현재 인스턴스여야 합니다. 인터페이스 기본값, 둘러싸는 클래스 한정-super 호출 및 불완전/모호한 조상은 지원되지 않습니다. 클래스/인터페이스 디스패치 구분은 AOSP의 invoke-kind 문서에 명시되어 있습니다.

읽기 가능한 할당 스테이징

고정된 JADX ConstructorVisitor.processInvoke는 원래의 NEW_INSTANCE를 제거하고 생성자 invoke를 제자리에서 대체합니다; 그런 다음 InsnGen이 new Class(arguments)를 이미트합니다. 관련 업스트림 소스:

  • ConstructorVisitor 84–110행
  • InsnGen 생성자 출력
  • InsnNode 재정렬 분류

RDX의 네이티브 allocation.rs는 더 엄격한 표현식 재구성을 우선시합니다. 평면 윈도우에 대해서만 순서가 지정된 캡처 선언을 스테이징하고 생성자 위치에 new를 배치할 수 있으며, 이는 업스트림의 읽기 가능한 재구성 접근 방식과 일치합니다. 업스트림의 더 광범위한 재정렬 분류와 달리, RDX는 기록된 모든 cast/call/read/string 이벤트를 원래 순서대로 검사합니다. 의도적인 할당 재배치는 클래스 초기화, 링키지 및 할당 실패 타이밍을 변경할 수 있습니다; 출력 범위가 완전한 시맨틱 동등성을 확립하지는 않습니다.

동기화 영역 재구성

src/native_java/synchronized.rs는 고정된 jadx-core/src/main/java/jadx/core/dex/visitors/regions/maker/SynchronizedRegionMaker.java의 진입/본문/모니터-종료 재구성 접근 방식을 각색합니다. Rust 구현은 경계가 지정된 CFG 순회, 디코딩된 레지스터-쓰기 및 예외 커버리지 검사, 정확한 정리 검증, 중첩/다중-해제/혼합 예외 형태의 보수적 거부를 추가합니다. 이는 부분 구현이며, 업스트림 영역 메이커의 완전한 포트가 아닙니다. 원래 SPDX/라이선스 조건 및 고지는 위 파일에 의해 계속 커버됩니다.

클래스 및 패키지 표시 별칭

native_java/names.rs는 고정된 JADX의 RenameVisitor.java, 특히 checkClassName과 checkPackage에서 원래 아이덴티티와 유효한 소스 별칭의 분리를 따릅니다. RDX는 JADX의 구성 가능한 별칭 제공자와 전역 충돌 패스 대신 기존의 단사 UTF-8 16진수 별칭 체계를 사용합니다. 헤더, 생성자, 타입 피연산자 및 임포트는 별칭을 사용합니다; 소스 링크는 원래 DEX 이름을 유지합니다. 이는 완전한 RenameVisitor 포트가 아닙니다.

동기화 영역 하위 집합은 추가로 DEX 보호 구간 밖의 비예외 루프 래치를 처리하고, 증명된 모니터 영역 내부에 완전히 있는 루프를 이미트합니다. 이는 증명된 해제를 제외한 모든 예외 발생 본문 명령어에 대한 커버리지를 요구하면서 고정된 메이커의 모니터-영역 분리를 유지합니다.

중첩 중복-정리 재구성

native_java/finally_regions.rs는 고정된 JADX의 MarkFinallyVisitor.java의 중복-정리 인식 접근 방식을 사용합니다. 이는 경계가 지정된 Rust 하위 집합이며, 완전한 방문자 포트가 아닙니다: 하나의 안정적-입력 void 정리 호출, 하나의 정상 복사본, catch-all 재던지기, 그리고 종료 경로가 있는 둘러싸는 타입 지정 catch. 이미트하기 전에 원래의 명령어별 예외 디스패치, 제어 흐름 경계, 정리 피연산자 및 소스 링크를 검사합니다. 지원되지 않는 중첩 레이아웃은 여전히 폴백됩니다.

정확한 Android 프레임워크 예외 메타데이터는 플랫폼 선언을 기반으로 합니다: ActivityNotFoundException, RemoteException, 및 IBinder.transact.

Frida 클립보드 액션

src/frida_snippet.rs의 메서드-스니펫 UI 및 로깅 형식은 JADX FridaAction을 따릅니다. Rust 생성기는 정확한 DEX 심볼 디스크립터를 읽고, 항상 정확한 오버로드를 선택하며, 위치 기반 인수 이름을 사용하고, 그 캡처된 오버로드를 호출합니다. 각 스니펫은 Java.perform 내부로 범위가 지정되어 붙여넣은 스니펫이 서로의 메서드 핸들을 덮어쓸 수 없습니다. 클래스 전체 및 필드 스니펫은 구현되지 않았습니다.

도구 다운로드