2011-12-22 2 views

답변

11

짧은 대답 : 수 없습니다.

긴 대답 : C/C++의 컴파일 프로세스는 매우 손실됩니다. 컴파일러는 코드에 대한 높은 수준과 낮은 수준의 최적화를 수행하며 결과 어셈블리 코드는 원래 코드와 닮지 않은 것보다 더 자주 발생합니다. 또한 시장에는 여러 컴파일러가 있고 (각각 다른 버전이 있습니다), 각 출력마다 조금씩 다르게 출력됩니다. 어떤 컴파일러가 사용되었는지에 대한 지식이 없으면 디 컴파일의 임무는 더욱 절망적입니다. 가장 좋았던 점은 C 코드가 여기저기서 약간의 부분 디 컴파일을 할 수있는 몇 가지 도구에 대해 들었지만 여전히 많은 어셈블리 코드를 읽어야한다는 것입니다.

그렇다면 소프트웨어의 복제 방지가 어렵고 특별한 어셈블리 기술이 필요한 이유 중 하나입니다.

+1

참고 : .NET과 Java는 완전히 다른 짐승이며 훨씬 더 큰 규모로 디 컴파일이 가능합니다 (디 컴파일러를 혼란스럽게 할 수있는 코드 obfuscator가 있음에도 불구하고). –

+0

C DLL이 특정'.jar' 파일에 액세스하고 있다는 것을 알고 있다면 반드시 DLL에 하드 코드해야하고 디 컴파일로 올 필요가 있을까요? –

+1

말하기 어렵다. .DLL/.EXE 파일에 임의의 "자원"을 추가 할 수 있습니다. 그런 식으로 저장하면 디 컴파일 할 필요가 없습니다. 리소스 뷰어 도구를 사용하여 압축을 풀 수 있습니다. 그런 다음 Java 인 .jar 파일을 디 컴파일 할 수 있습니다. 그러나 .dll 파일에 파일을 임베딩하는 또 다른 자작 (homebrew) 방법이 있으며, 그 중 하나를 사용한다면 운이 없다. 프로그램이 실행 중일 때 임시 폴더 또는 다른 것으로 추출되는 경우이 파일을 가져올 수 있습니까? –

0

할 수 있습니다,하지만 어느 정도까지 :

    (DLL 대신 심볼의 인덱스를 통해 내부에 존재하는 기능을 참조 할 수 있습니다)
  1. 기호가 제거되었을 수 있습니다 코드를 변경할 수
  2. 최적화
  3. 일부 명령어의 조합은 ... C
  4. 내가 잊을 수있는 몇 가지 다른 것들로 변환되지 않을 수 있습니다
+1

5. 컴파일러가 때때로 함수를 인라인 할 수 있습니다. –

3

이 코드가 작동해야하는 운영 체제의 C, 어셈블리 및 복잡성에 정통한 경우에도 가능하지만 매우 어려우며 엄청난 시간이 필요합니다.

최적화는 컴파일 된 코드를 사람이 인식 할 수 없거나 이해할 수 없게 만듭니다.

또한 디스어셈블러가 정보를 잃어 버리면 (예 : 동일한 명령어가 다른 방식으로 인코딩 될 수 있고 나머지 코드가 많은 디스어셈블러 (또는 사용자)가 받아들이지 않는 특정 인코딩에 의존하는 경우) 계정의 경우 결과로 생성 된 디스 어셈블리가 불완전하거나 부정확하게됩니다.

자체 수정 코드도 문제를 복잡하게 만듭니다.

주제 및 사용 가능한 도구에 대한 자세한 내용은 this question을 참조하십시오.

+1

자체 수정 코드가 C64에서 엉망이었습니다.최신 프로세서는 코드가 수정 될 때 캐싱 및 멀티 스레딩에 문제가 있습니다. 나는 C/C++ 컴파일러가 자체 수정 코드를 생성 할 수 있는지 잘 모르겠다. (하지만 여전히 +1을 얻는다.) – LittleFunnyMan