역컴파일러
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
역컴파일러는 기계어 또는 중간 언어로 작성된 프로그램을 원래의 소스 코드와 유사한 형태로 변환하는 소프트웨어 도구이다. 역컴파일 과정은 로더, 디스어셈블리, 관용구 인식, 프로그램 분석, 데이터 흐름 분석, 타입 분석, 구조화, 코드 생성 등의 단계를 거쳐 이루어진다. 역컴파일러는 실행 파일의 이진 파일을 로드하고 분석하며, 기계어를 중간 표현 형식으로 변환하고, 코드의 의미를 파악하여 고급 언어와 유사한 형태로 재구성한다. 신경망을 활용한 역컴파일러도 개발되고 있다. 역컴파일은 저작권법과 관련하여, 소프트웨어 상호 운용성을 위해 필요한 경우 제한적으로 허용되며, 국가별로 관련 법규가 존재한다.
더 읽어볼만한 페이지
- 역공학 - 역어셈블러
역어셈블러는 기계어 코드를 어셈블리어로 변환하는 도구이며, 리버스 엔지니어링, 보안 분석 등 다양한 분야에서 활용된다. - 유틸리티 소프트웨어 종류 - 데이터 압축
데이터 압축은 디지털 데이터의 크기를 줄여 저장 공간을 절약하고 전송 속도를 향상시키는 기술로, 모르스 부호에서 시작하여 ZIP, JPEG, LZ77 등 다양한 방식으로 발전해 왔으며, 무손실 압축과 손실 압축으로 나뉘고 최근에는 인공지능 기술을 활용하여 효율성을 높여 다양한 분야에서 활용되고 있다. - 유틸리티 소프트웨어 종류 - 바이러스 검사 소프트웨어
바이러스 검사 소프트웨어는 악성 소프트웨어의 감염을 탐지, 제거 또는 차단하는 소프트웨어로, 다양한 기술을 사용하여 악성코드를 식별하고 시스템을 감시하며, V3, 노턴 안티바이러스, 알약 등 다양한 종류가 존재한다. - 컴파일러 - 바이너리 재컴파일러
- 컴파일러 - 링커 (컴퓨팅)
링커는 여러 모듈로 된 목적 파일을 결합해 실행 가능한 프로그램을 만들고, 정적/동적 링킹으로 라이브러리를 연결하며, 심볼 해결 및 재배치로 변수와 함수를 메모리 주소에 연결하는 소프트웨어 도구이다.
역컴파일러 | |
---|---|
개요 | |
종류 | 컴퓨터 프로그램 |
목적 | 실행 가능한 코드를 사람이 읽을 수 있는 소스 코드로 변환 |
관련 용어 | 디스어셈블러 역공학 |
상세 정보 | |
설명 | 컴파일러와 반대되는 기능을 수행하여, 기계어 코드를 분석하여 원래의 소스 코드와 유사한 코드를 생성하는 도구임. |
특징 | 완벽한 복원은 어려움. 소스 코드의 주석, 변수명, 함수명 등은 복원되지 않음. |
활용 분야 | 악성 코드 분석 소프트웨어 보안 취약점 분석 소프트웨어 호환성 문제 해결 저작권 침해 분석 리버스 엔지니어링 |
동작 원리 | |
분석 단계 | 기계어 코드 분석 제어 흐름 분석 데이터 흐름 분석 |
코드 생성 단계 | 소스 코드 생성 코드 최적화 (일부) |
종류 | |
유형 | 정적 디컴파일러 동적 디컴파일러 |
지원 언어 | C 언어 C++ Java .NET Python |
유의 사항 | |
법적 문제 | 소프트웨어의 라이선스 계약 위반 및 저작권 침해 가능성에 유의해야 함. |
2. 디자인
역컴파일러는 역컴파일 과정에서 각각의 특별한 과정을 수행하는 것들의 집합으로 생각될 수 있다.
역컴파일러는 전체 역컴파일 과정의 특정 측면에 기여하는 일련의 단계로 구성된 것으로 생각할 수 있다.
;로더
: 로더는 실행 파일 또는 중간 언어 프로그램의 이진 파일 형식을 로드하고 분석하는 역할을 수행한다.[5] 펜티엄, 파워PC와 같은 아키텍처 및 프로그램 시작 지점(entry point) 등의 기본적인 정보를 파악한다.[5]
: 심볼 테이블 및 디버그 데이터가 있다면 함께 로드하며, C 언어의 `main` 함수와 같이 사용자가 작성한 코드의 시작점을 찾는다. 이때 런타임 초기화 코드는 제외된다.[5]
: 코드와 연결된 라이브러리를 식별하여 라이브러리 인터페이스를 제공하고, 사용된 컴파일러 정보를 통해 코드 관용구를 파악하는 데 활용한다.[5]
;디스어셈블리
: 기계어 명령어들의 디스어셈블리를 기계와 독립적인 중간 표현 형식(IR: intermediate representation)으로 변환한다. 예를 들어, 펜티엄 기계 명령어 `mov eax, [ebx+0x04]`는 `eax := m[ebx+4];`와 같은 IR로 번역될 수 있다.
;관용구
: 개별 명령어의 의미만으로는 파악하기 어려운, 결합된 의미를 가지는 코드 시퀀스(관용구)를 인식하고, 알려진 IR 형태로 변환한다. 예를 들어, x86 어셈블리 코드에서 `cdq eax; xor eax, edx; sub eax, edx`는 `eax := abs(eax);`로 변환될 수 있다.
: 몇몇 관용적 결과들은 머신에 독립적이다. 즉 오직 하나의 명령어에 관련된다. 예를 들면, `xor eax, eax`는 `eax` 레지스터를 비우는 명령이다. 이것은 `a xor a = 0` 같은 머신에 독립적인 간단한 규칙으로 간소화될 수 있다.
: 일반적으로 명령어 순서에 영향을 덜 미치게 하기 위해서 가능한 한 관용적 결과들에 대한 탐지는 늦추는게 좋다. 예를 들면, 컴파일러의 명령어 스케줄 단계에서는 다른 명령어를 관용적 결과에 삽입하거나 순서를 바꾸는 경우가 있다. 디스어셈블리 단계의 패턴 매칭 과정에서 바뀐 패턴을 인식하지 못할 수도 있다. 다음 단계에서 명령어 집합 표현들은 더 더 복잡한 표현들로 바뀌고 고전적인 형태로 수정하며 바뀐 관용구는 고급 패턴에 맞게 된다.
: 서브루틴 호출, 예외 처리 그리고 스위치 문으로 컴파일러 관용구를 인식하는 것은 특히 중요하다. 또한 몇몇 언어들은 문자열이나 긴 정수에 대한 광범위한 지원을 가진다.
;프로그램 분석
: 역컴파일러의 중간 표현(IR)에 대해 다양한 프로그램 분석을 수행할 수 있다. 특히, 표현식 전달은 여러 명령어들의 의미를 더 복잡한 표현식으로 통합하는 분석 기법이다. 예를 들어, 다음과 같은 어셈블리 코드를
```asm
mov eax,[ebx+0x04]
add eax,[ebx+0x08]
sub [ebx+0x0C],eax
```
: 표현식 전달을 통해 아래와 같은 IR로 변환할 수 있다.
```
m[ebx+12] := m[ebx+12] - (m[ebx+4] + m[ebx+8]);
```
: 이렇게 변환된 표현식은 더 고급 언어와 유사하며, 기계어 레지스터 `eax`의 사용을 제거하였다. 추가적인 분석을 통해 `ebx` 레지스터도 제거할 수 있다.
;데이터 흐름 분석
: 레지스터 내용, 임시 변수, 로컬 데이터 등이 정의되고 사용되는 위치는 데이터 흐름 분석을 통해 추적될 수 있다. 같은 분석은 임시 변수 및 로컬 데이터가 사용하는 위치에도 적용될 수 있다. 그 후 다른 이름은 값 정의 집합과 사용에 연결되어 구성된다. 같은 지역 변수의 위치는 원본 프로그램의 다른 부분의 변수들과 함께 사용될 수 있다. 더 심한 경우는, 실제로 절대 일어나지 않거나 현실에서는 중요하지 않지만, 데이터 흐름 분석 시에 값이 이러한 두 사용 사이에서 흐르는 경로를 인식하는 것이 가능할 수 있다. 좋지 않은 경우, 이것은 타입들의 결합으로서 위치에 대한 정의의 필요성으로 이어질 수 있다. 역컴파일러는 사용자에게 명백히 이러한 비자연스러운 의존성을 깨게 허용함으로써 더 깨끗한 코드로 만들 수 있다. 이것은 물론 변수가 잠재적으로 초기화 없이 사용됐다는 것이고, 원본 프로그램에서 문제가 나타나게 된다.
;타입 분석
: 좋은 기계어 코드 역컴파일러는 타입 분석을 수행한다. 레지스터나 메모리 위치들이 사용되는 방식은 위치의 가능한 타입에 대한 제약으로 귀결된다. 예를 들면, `and` 명령어는 피연산자가 정수라는 것을 의미한다. 즉, 프로그램은 부동소수점 값이나 포인터에서 동작하는 명령을 사용하지 않는다. `add` 명령어는 3가지 제약으로 귀결되는데, 피연산자가 정수거나 아닐 수 있기 때문이다. 나머지 하나는 두 피연산자가 다를 경우에 생기는 제한이다.[6]
: 다양한 고급 표현들은 구조체나 배열들의 인식을 촉발하는 것으로 인식될 수 있다. 그러나 기계어나 C 같은 고급 언어들의 포인터 연산을 허용하는 자유 때문에 많은 가능성을 구별하는 것은 어려운 일이다.[6]
;구조화
: 역컴파일링의 끝에서 두 번째 단계는 IR을 `while` 루프와 `if/then/else` 조건문 같은 고급 구조체로 만드는 것이다.[7] 예를 들어, 다음과 같은 기계어 코드가 있다고 가정해 보자.
```asm
xor eax, eax
l0002:
or ebx, ebx
jge l0003
add eax,[ebx]
mov ebx,[ebx+0x4]
jmp l0002
l0003:
mov [0x10040000],eax
```
: 이것은 다음과 같이 변환될 수 있다.[7]
```c
eax = 0;
while (ebx < 0) {
eax += ebx->v0000;
ebx = ebx->v0004;
}
v10040000 = eax;
```
: 구조화되지 않은 코드는 이미 구조화된 코드보다 구조화된 코드로 변환하기가 더 어렵다. 해결책으로는 일부 코드 복제 또는 부울 변수 추가가 있다.[7]
;코드 생성
: 최종 단계는 역컴파일러의 백엔드에서 고급 언어를 생성하는 것이다. 컴파일러가 여러 다른 아키텍처에 따른 여러 다른 기계어를 생성하는 백엔드를 가지듯이 역컴파일러도 여러 고급 언어 별로 생성할 수 있는 백엔드를 갖는다.
: 코드 생성 바로 직전에 그래픽 사용자 인터페이스 형태를 사용하여 IR의 상호적인 수정을 허용하는 것이 바람직하다. 이것은 사용자에게 주석을 달거나 포괄적이지 않은 변수와 함수 이름들을 집어넣게 할 수 있다. 그러나 이것들은 역컴파일링 후에 하는 것처럼 쉽게 할 수 있다. 사용자는 구조적인 면을 바꾸고 싶어할 수도 있다(while
루프를 for
루프로 바꾼다든지). 이것들은 간단한 텍스트 에디터로는 쉽게 수정될 수 없지만, 소스 코드 리팩토링 도구들이 이 과정에서 도와준다고 하더라도 말이다. 마지막으로 결과 코드를 더욱 읽기 쉽게 하기 위하여, 부정확한 IR은 고쳐지거나 바뀌어야 한다.
2. 1. 로더
로더는 실행 파일 또는 중간 언어 프로그램의 이진 파일 형식을 로드하고 분석하는 역할을 수행한다.[5] 펜티엄, 파워PC와 같은 아키텍처 및 프로그램 시작 지점(entry point) 등의 기본적인 정보를 파악한다.[5]심볼 테이블 및 디버그 데이터가 있다면 함께 로드하며, C 언어의 `main` 함수와 같이 사용자가 작성한 코드의 시작점을 찾는다. 이때 런타임 초기화 코드는 제외된다.[5]
코드와 연결된 라이브러리를 식별하여 라이브러리 인터페이스를 제공하고, 사용된 컴파일러 정보를 통해 코드 관용구를 파악하는 데 활용한다.[5]
2. 2. 디스어셈블리
기계어 명령어들의 디스어셈블리를 기계와 독립적인 중간 표현 형식(IR: intermediate representation)으로 변환한다. 예를 들어, 펜티엄 기계 명령어 `mov eax, [ebx+0x04]`는 `eax := m[ebx+4];`와 같은 IR로 번역될 수 있다.2. 3. 관용구
개별 명령어의 의미만으로는 파악하기 어려운, 결합된 의미를 가지는 코드 시퀀스(관용구)를 인식하고, 알려진 IR 형태로 변환한다. 예를 들어, x86 어셈블리 코드에서 `cdq eax; xor eax, edx; sub eax, edx`는 `eax := abs(eax);`로 변환될 수 있다.몇몇 관용적 결과들은 머신에 독립적이다. 즉 오직 하나의 명령어에 관련된다. 예를 들면, `xor eax, eax`는 `eax` 레지스터를 비우는 명령이다. 이것은 `a xor a = 0` 같은 머신에 독립적인 간단한 규칙으로 간소화될 수 있다.
일반적으로 명령어 순서에 영향을 덜 미치게 하기 위해서 가능한 한 관용적 결과들에 대한 탐지는 늦추는게 좋다. 예를 들면, 컴파일러의 명령어 스케줄 단계에서는 다른 명령어를 관용적 결과에 삽입하거나 순서를 바꾸는 경우가 있다. 디스어셈블리 단계의 패턴 매칭 과정에서 바뀐 패턴을 인식하지 못할 수도 있다. 다음 단계에서 명령어 집합 표현들은 더 더 복잡한 표현들로 바뀌고 고전적인 형태로 수정하며 바뀐 관용구는 고급 패턴에 맞게 된다.
서브루틴 호출, 예외 처리 그리고 스위치 문으로 컴파일러 관용구를 인식하는 것은 특히 중요하다. 또한 몇몇 언어들은 문자열이나 긴 정수에 대한 광범위한 지원을 가진다.
2. 4. 프로그램 분석
역컴파일러의 중간 표현(IR)에 대해 다양한 프로그램 분석을 수행할 수 있다. 특히, 표현식 전달은 여러 명령어들의 의미를 더 복잡한 표현식으로 통합하는 분석 기법이다. 예를 들어, 다음과 같은 어셈블리 코드를```asm
mov eax,[ebx+0x04]
add eax,[ebx+0x08]
sub [ebx+0x0C],eax
```
표현식 전달을 통해 아래와 같은 IR로 변환할 수 있다.
```
m[ebx+12] := m[ebx+12] - (m[ebx+4] + m[ebx+8]);
```
이렇게 변환된 표현식은 더 고급 언어와 유사하며, 기계어 레지스터 `eax`의 사용을 제거하였다. 추가적인 분석을 통해 `ebx` 레지스터도 제거할 수 있다.
2. 5. 데이터 흐름 분석
레지스터 내용, 임시 변수, 로컬 데이터 등이 정의되고 사용되는 위치는 데이터 흐름 분석을 통해 추적될 수 있다. 같은 분석은 임시 변수 및 로컬 데이터가 사용하는 위치에도 적용될 수 있다. 그 후 다른 이름은 값 정의 집합과 사용에 연결되어 구성된다. 같은 지역 변수의 위치는 원본 프로그램의 다른 부분의 변수들과 함께 사용될 수 있다. 더 심한 경우는, 실제로 절대 일어나지 않거나 현실에서는 중요하지 않지만, 데이터 흐름 분석 시에 값이 이러한 두 사용 사이에서 흐르는 경로를 인식하는 것이 가능할 수 있다. 좋지 않은 경우, 이것은 타입들의 결합으로서 위치에 대한 정의의 필요성으로 이어질 수 있다. 역컴파일러는 사용자에게 명백히 이러한 비자연스러운 의존성을 깨게 허용함으로써 더 깨끗한 코드로 만들 수 있다. 이것은 물론 변수가 잠재적으로 초기화 없이 사용됐다는 것이고, 원본 프로그램에서 문제가 나타나게 된다.2. 6. 타입 분석
좋은 기계어 코드 역컴파일러는 타입 분석을 수행한다. 레지스터나 메모리 위치들이 사용되는 방식은 위치의 가능한 타입에 대한 제약으로 귀결된다. 예를 들면, `and` 명령어는 피연산자가 정수라는 것을 의미한다. 즉, 프로그램은 부동소수점 값이나 포인터에서 동작하는 명령을 사용하지 않는다. `add` 명령어는 3가지 제약으로 귀결되는데, 피연산자가 정수거나 아닐 수 있기 때문이다. 나머지 하나는 두 피연산자가 다를 경우에 생기는 제한이다.[6]다양한 고급 표현들은 구조체나 배열들의 인식을 촉발하는 것으로 인식될 수 있다. 그러나 기계어나 C 같은 고급 언어들의 포인터 연산을 허용하는 자유 때문에 많은 가능성을 구별하는 것은 어려운 일이다.[6]
2. 7. 구조화
역컴파일링의 끝에서 두 번째 단계는 IR을 `while` 루프와 `if/then/else` 조건문 같은 고급 구조체로 만드는 것이다.[7] 예를 들어, 다음과 같은 기계어 코드가 있다고 가정해 보자.```asm
xor eax, eax
l0002:
or ebx, ebx
jge l0003
add eax,[ebx]
mov ebx,[ebx+0x4]
jmp l0002
l0003:
mov [0x10040000],eax
```
이것은 다음과 같이 변환될 수 있다.[7]
```c
eax = 0;
while (ebx < 0) {
eax += ebx->v0000;
ebx = ebx->v0004;
}
v10040000 = eax;
```
구조화되지 않은 코드는 이미 구조화된 코드보다 구조화된 코드로 변환하기가 더 어렵다. 해결책으로는 일부 코드 복제 또는 부울 변수 추가가 있다.[7]
2. 8. 코드 생성
최종 단계는 역컴파일러의 백엔드에서 고급 언어를 생성하는 것이다. 컴파일러가 여러 다른 아키텍처에 따른 여러 다른 기계어를 생성하는 백엔드를 가지듯이 역컴파일러도 여러 고급 언어 별로 생성할 수 있는 백엔드를 갖는다.코드 생성 바로 직전에 그래픽 사용자 인터페이스 형태를 사용하여 IR의 상호적인 수정을 허용하는 것이 바람직하다. 이것은 사용자에게 주석을 달거나 포괄적이지 않은 변수와 함수 이름들을 집어넣게 할 수 있다. 그러나 이것들은 역컴파일링 후에 하는 것처럼 쉽게 할 수 있다. 사용자는 구조적인 면을 바꾸고 싶어할 수도 있다(
while
루프를 for
루프로 바꾼다든지). 이것들은 간단한 텍스트 에디터로는 쉽게 수정될 수 없지만, 소스 코드 리팩토링 도구들이 이 과정에서 도와준다고 하더라도 말이다. 마지막으로 결과 코드를 더욱 읽기 쉽게 하기 위하여, 부정확한 IR은 고쳐지거나 바뀌어야 한다.3. 기타 기술
신경망을 사용하는 역컴파일러가 개발되었다. 이러한 역컴파일러는 시간이 지남에 따라 정확도를 향상시키기 위해 기계 학습으로 훈련될 수 있다.
4. 합법성
대부분의 컴퓨터 프로그램들은 저작권 법들에 포함된다. 비록 지역마다 어느 정도가 저작권에 포함되는지는 다 다르지만, 일반적으로 개발자에게 프로그램에 대한 배타적인 권한을 준다.[8] 이러한 권리들은 복사본에 대한 권리를 포함한다. (심지어 RAM으로 만들어지는 복사도 포함한다.[9]) 역컴파일 과정이 여러 복사본을 만드는 것과 관련되어 있기 때문에 역컴파일은 허가 없이는 법적으로 금지되어 있다. 그러나 소프트웨어 상호 운용성을 달성하는데 이것이 꼭 필요한 단계이므로 저작권 법(미국과 유럽 모두)은 한정된 범위 까지는 허가한다.
;대한민국
저작권법 개정으로 유연한 권리 제한 규정이 적용되어, 소프트웨어 개발사가 정하는 이용 약관 등에 의해 공개된 프로그램에 대해 리버스 엔지니어링을 금지하고 있는 경우에도 저작권 침해가 되지 않는다고 해석된다.[1] 그러나 약관과의 관계, 특히 계약법적 효력에 대한 검토는 여전히 필요하다.
;미국
미국에서 대부분의 컴퓨터 프로그램은 저작권법에 포함되며, 개발자에게 프로그램에 대한 배타적인 권한을 부여한다.[8] 이러한 권리에는 복사본에 대한 권리가 포함되는데, RAM으로 만들어지는 복사도 포함된다.[9] 역컴파일 과정은 여러 복사본을 만드는 것과 관련되어 있어 허가 없이는 법적으로 금지되지만, 소프트웨어 상호운용성을 달성하기 위해 필요한 경우 저작권법(미국과 유럽 모두)은 한정된 범위에서 허용한다.
저작권법의 공정 사용(fair use) 조항에 따라, 특정 조건 하에서 역컴파일이 허용될 수 있다. ''세가 대 아콜레이드'' 사건에서 법원은 세가가 게임 콘솔의 소프트웨어 잠금 메커니즘을 우회하기 위해 역컴파일을 수행하는 것을 허용했다. 디지털 밀레니엄 저작권법(DMCA)은 보안 테스트 및 평가(제1201조(i)항), 리버스 엔지니어링(제1201조(f)항)에 대한 예외 조항을 두고 있다.
;유럽 연합(EU)
유럽 연합(EU)에서는 컴퓨터 프로그램 지침(Directive on the legal protection of computer programs)[2]의 제6조는 다음 조건 하에 역컴파일을 허용한다. 제6조에 반하는 계약 조항은 무효(null and void)이다. (제9조)[2]
4. 1. 대한민국
저작권법 개정으로 유연한 권리 제한 규정이 적용되어, 소프트웨어 개발사가 정하는 이용 약관 등에 의해 공개된 프로그램에 대해 리버스 엔지니어링을 금지하고 있는 경우에도 저작권 침해가 되지 않는다고 해석된다.[1] 그러나 약관과의 관계, 특히 계약법적 효력에 대한 검토는 여전히 필요하다.4. 2. 미국
미국에서 대부분의 컴퓨터 프로그램은 저작권법에 포함되며, 개발자에게 프로그램에 대한 배타적인 권한을 부여한다.[8] 이러한 권리에는 복사본에 대한 권리가 포함되는데, RAM으로 만들어지는 복사도 포함된다.[9] 역컴파일 과정은 여러 복사본을 만드는 것과 관련되어 있어 허가 없이는 법적으로 금지되지만, 소프트웨어 상호운용성을 달성하기 위해 필요한 경우 저작권법(미국과 유럽 모두)은 한정된 범위에서 허용한다.저작권법의 공정 사용(fair use) 조항에 따라, 특정 조건 하에서 역컴파일이 허용될 수 있다. ''세가 대 아콜레이드'' 사건에서 법원은 세가가 게임 콘솔의 소프트웨어 잠금 메커니즘을 우회하기 위해 역컴파일을 수행하는 것을 허용했다. 디지털 밀레니엄 저작권법(DMCA)은 보안 테스트 및 평가(제1201조(i)항), 리버스 엔지니어링(제1201조(f)항)에 대한 예외 조항을 두고 있다.
4. 3. 유럽 연합 (EU)
유럽 연합(EU)에서는 컴퓨터 프로그램 지침(Directive on the legal protection of computer programs)[2]의 제6조는 다음 조건 하에 역컴파일을 허용한다. 제6조에 반하는 계약 조항은 무효(null and void)이다. (제9조)[2]5. 주요 역컴파일러
모카 디컴파일러
JD 디컴파일러
JAD 디컴파일러
https://varaneckas.com/jad/ JAD Java 디컴파일러 다운로드 미러 - Java 역컴파일러
.NET 리플렉터
닷픽
JEB 디컴파일러 (안드로이드 달빅, 인텔 x86, ARM, MIPS, 웹어셈블리, 이더리움)
기드라
IDA 프로(IDA Pro), 선택적 유료 기능으로 디컴파일러 포함
바이너리 닌자
https://pypi.org/project/uncompyle6/ uncompyle6 (파이썬 바이트코드 1.0부터 3.8까지)
https://www.red-gate.com/products/dotnet-development/reflector/ .NET 디컴파일러: 모든 .NET 코드 디컴파일 .NET Reflector
http://www.backerstreet.com/rec/rec.htm REC Studio 4 - 리버스 엔지니어링 컴파일러
http://boomerang.sourceforge.net/ Boomerang Decompiler - 오픈 소스 역컴파일러
https://varaneckas.com/jad/ JAD Java 디컴파일러 다운로드 미러 - Java 역컴파일러
5. 1. Java
- 모카 디컴파일러
- JD 디컴파일러
- JAD 디컴파일러
- [https://varaneckas.com/jad/ JAD Java 디컴파일러 다운로드 미러] - Java 역컴파일러
5. 2. 기타
- .NET 리플렉터
- 닷픽
- JEB 디컴파일러 (안드로이드 달빅, 인텔 x86, ARM, MIPS, 웹어셈블리, 이더리움)
- 기드라
- IDA 프로(IDA Pro), 선택적 유료 기능으로 디컴파일러 포함
- 바이너리 닌자
- [https://pypi.org/project/uncompyle6/ uncompyle6] (파이썬 바이트코드 1.0부터 3.8까지)
- [https://www.red-gate.com/products/dotnet-development/reflector/ .NET 디컴파일러: 모든 .NET 코드 디컴파일 .NET Reflector]
- [http://www.backerstreet.com/rec/rec.htm REC Studio 4 - 리버스 엔지니어링 컴파일러]
- [http://boomerang.sourceforge.net/ Boomerang Decompiler] - 오픈 소스 역컴파일러
- [https://varaneckas.com/jad/ JAD Java 디컴파일러 다운로드 미러] - Java 역컴파일러
참조
[1]
문서
デジタル化・ネットワーク化の進展に対応した柔軟な権利制限規定に関する基本的な考え方
https://www.bunka.go[...]
[2]
문서
Council Directive 91/250/EEC of 14 May 1991 on the legal protection of computer programs
http://eur-lex.europ[...]
[3]
웹인용
Why Decompilation
http://www.program-t[...]
Program-transformation.org
2005-04-11
[4]
서적
Compiler Construction: 11th International Conference, proceedings / CC 2002
Springer-Verlag
[5]
저널
Decompilation of Binary Programs
1995-07
[6]
서적
Programming languages and systems: 8th European Symposium on Programming Languages and Systems
https://archive.org/[...]
Springer-Verlag
[7]
문서
C. Cifuentes.
[8]
서적
Information technology law
https://archive.org/[...]
Cavendish
[9]
문서
http://www.copyright[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com