아쉽게도 소스코드를 잃어버렸고, 리눅스에서는 gcc로 만든 출력파일만 있어서 지금은 컴퓨터에 접근할 수 없습니다. 출력 파일을 소스 파일(Linux의 c)로 변환하는 방법이 있습니까?
답변1
그래서 당신은 소를 가지고 있는데 실수로 그것을 햄버거로 만들었고 이제는 소를 돌려받기를 원합니다.
죄송합니다. 작동하지 않습니다.
백업에서 소스 파일을 복원하면 됩니다.
아, 백업이 없군요. 불행히도 우주는 당신에게 휴식을 주지 않습니다.
당신은 할 수디컴파일바이너리 파일. 이는 소스 코드를 제공하지는 않지만 다음을 제공합니다.일부동일한 동작을 갖는 소스 코드. 디버그 바이너리가 아닌 이상 변수 이름을 얻을 수 없습니다. 최적화 없이 컴파일하지 않으면 정확히 동일한 논리를 얻을 수 없습니다. 당연히 댓글은 받지 않습니다.
나는 사용했다부메랑일부 프로그램을 디컴파일하면 결과가 기계 코드보다 더 읽기 쉽습니다. 이것이 최고의 도구인지는 모르겠습니다. 어쨌든 기적을 기대하지 마십시오.
답변2
실행 파일을 리버스 엔지니어링할 때 일반적으로 사용되는 몇 가지 도구가 있습니다.
- "file" 명령은 파일 경로를 첫 번째 인수로 사용하므로 (대부분의 경우) 어떤 유형의 실행 파일이 있는지 확인할 수 있습니다.
- 디스어셈블러는 실행 파일의 기능을 정확하게 보여 주지만 특정 아키텍처에 대한 어셈블리 코드를 작성하지 않았거나 디스어셈블리 경험이 있는 사용자는 읽기가 어렵습니다.
- Boomerang, Hex-rays 및 Snowman과 같은 디컴파일러는 더 높은 가독성을 제공할 수 있지만 실제 변수 이름이나 원본 프로그램의 구문을 복구할 수 없으며 특히 실행 파일을 만드는 엔지니어가 사용할 때 100% 신뢰할 수 없습니다. 다음 명령 이러한 패키지 없이 테스트되었으며 보안을 더욱 난독화하려고 시도합니다.
- 데이터 흐름 다이어그램 또는 테이블. 이를 자동화하는 무료 도구는 없지만 어셈블리를 출력하는 텍스트 파서 위에 Python 또는 Bash 스크립트(sed 또는 Perl로 작성 가능)가 도움이 될 수 있습니다.
- 믿거나 말거나, 연필과 종이는 프로세스와 아이디어를 기록하는 데 사용됩니다.
내가 본 대부분의 경우 코드를 처음부터 다시 작성하거나, 어셈블리 언어 프로그램으로 유지하거나, 이전 버전에 변경 요청을 다시 적용하여 다시 빌드해야 했습니다.
답변3
당신이 하고 싶은 일은 "디컴파일링" 이라고 합니다. 시중에는 많은 디컴파일러가 있으며 여기서 모두 다루기는 불가능합니다.
그러나 일반적으로 C 소스 코드에서 실행 가능한 기계어 코드로의 변환은 손실이 발생합니다. 예를 들어:
- 댓글은 되돌릴 수 없게 손실됩니다.
- 변수 이름이 누락되었습니다.
- 때로는 성능을 위해 루프를 풀기도 합니다.
- 기능 일정이 변경될 수 있음
코드는 작성된 방식으로 컴파일되는 경우가 거의 없습니다. 요즘 대부분의 컴파일러는 최적화를 위해 코드를 완전히 변경합니다. 따라서 디컴파일할 때 컴파일러는 소스 코드가 어떻게 생겼는지 추측만 할 수 있고 소스 코드가 무엇인지 알 수 있는 방법이 없습니다.당신의코드는 사라졌기 때문입니다. 디컴파일러가 좋다면 적어도 동등한 실행 파일로 다시 컴파일되는 코드를 얻은 다음 천천히 읽을 수 있는 것으로 재구성하기 시작할 수 있습니다. 그러나 디컴파일러는 전혀 읽을 수 없는 스파게티 코드를 생성할 가능성이 높으며 이를 해독하는 것은 엄청난 골칫거리가 될 것입니다. 때로는 결국 이렇게 될 수도 있습니다.더 적은프로그램을 처음부터 다시 작성해 보세요.