C로 작성된 것으로 생각되는 DLL을 디 컴파일하려고합니다. 어떻게해야합니까?C로 작성된 DLL을 디 컴파일 할 수 있습니까?
답변
짧은 대답 : 수 없습니다.
긴 대답 : C/C++의 컴파일 프로세스는 매우 손실됩니다. 컴파일러는 코드에 대한 높은 수준과 낮은 수준의 최적화를 수행하며 결과 어셈블리 코드는 원래 코드와 닮지 않은 것보다 더 자주 발생합니다. 또한 시장에는 여러 컴파일러가 있고 (각각 다른 버전이 있습니다), 각 출력마다 조금씩 다르게 출력됩니다. 어떤 컴파일러가 사용되었는지에 대한 지식이 없으면 디 컴파일의 임무는 더욱 절망적입니다. 가장 좋았던 점은 C 코드가 여기저기서 약간의 부분 디 컴파일을 할 수있는 몇 가지 도구에 대해 들었지만 여전히 많은 어셈블리 코드를 읽어야한다는 것입니다.
그렇다면 소프트웨어의 복제 방지가 어렵고 특별한 어셈블리 기술이 필요한 이유 중 하나입니다.
할 수 있습니다,하지만 어느 정도까지 :
-
(DLL 대신 심볼의 인덱스를 통해 내부에 존재하는 기능을 참조 할 수 있습니다)
- 기호가 제거되었을 수 있습니다 코드를 변경할 수
- 최적화
- 일부 명령어의 조합은 ... C
- 내가 잊을 수있는 몇 가지 다른 것들로 변환되지 않을 수 있습니다
5. 컴파일러가 때때로 함수를 인라인 할 수 있습니다. –
이 코드가 작동해야하는 운영 체제의 C, 어셈블리 및 복잡성에 정통한 경우에도 가능하지만 매우 어려우며 엄청난 시간이 필요합니다.
최적화는 컴파일 된 코드를 사람이 인식 할 수 없거나 이해할 수 없게 만듭니다.
또한 디스어셈블러가 정보를 잃어 버리면 (예 : 동일한 명령어가 다른 방식으로 인코딩 될 수 있고 나머지 코드가 많은 디스어셈블러 (또는 사용자)가 받아들이지 않는 특정 인코딩에 의존하는 경우) 계정의 경우 결과로 생성 된 디스 어셈블리가 불완전하거나 부정확하게됩니다.
자체 수정 코드도 문제를 복잡하게 만듭니다.
주제 및 사용 가능한 도구에 대한 자세한 내용은 this question을 참조하십시오.
자체 수정 코드가 C64에서 엉망이었습니다.최신 프로세서는 코드가 수정 될 때 캐싱 및 멀티 스레딩에 문제가 있습니다. 나는 C/C++ 컴파일러가 자체 수정 코드를 생성 할 수 있는지 잘 모르겠다. (하지만 여전히 +1을 얻는다.) – LittleFunnyMan
참고 : .NET과 Java는 완전히 다른 짐승이며 훨씬 더 큰 규모로 디 컴파일이 가능합니다 (디 컴파일러를 혼란스럽게 할 수있는 코드 obfuscator가 있음에도 불구하고). –
C DLL이 특정'.jar' 파일에 액세스하고 있다는 것을 알고 있다면 반드시 DLL에 하드 코드해야하고 디 컴파일로 올 필요가 있을까요? –
말하기 어렵다. .DLL/.EXE 파일에 임의의 "자원"을 추가 할 수 있습니다. 그런 식으로 저장하면 디 컴파일 할 필요가 없습니다. 리소스 뷰어 도구를 사용하여 압축을 풀 수 있습니다. 그런 다음 Java 인 .jar 파일을 디 컴파일 할 수 있습니다. 그러나 .dll 파일에 파일을 임베딩하는 또 다른 자작 (homebrew) 방법이 있으며, 그 중 하나를 사용한다면 운이 없다. 프로그램이 실행 중일 때 임시 폴더 또는 다른 것으로 추출되는 경우이 파일을 가져올 수 있습니까? –