실행 파일을 다시 C 소스 코드로 변환


14

불행히도 내 소스 코드를 잃어 버렸고 리눅스에서 gcc로 만든 출력 파일이 있고 내 PC에 액세스 할 수 없습니다. 출력 파일을 소스 파일로 변환하는 방법이 있습니까 (linux 아래의 c)?


원하는 것을 디 컴파일러라고합니다. 이 답변에 대한 도움을 얻을 수 있습니다 : stackoverflow.com/questions/193896/whats-a-good-c-decompiler
— Eric Renouf

디 컴파일러 모듈이있는 IDA Pro는 실제로 큰 실행 파일에서 작동하는 유일한 실용적인 솔루션입니다.
— fpmurphy

@ fpmurphy1 IDA Pro와 비슷한 품질의 호퍼를 보유하고 있으며 라이센스는 가격의 일부입니다.
— Rui F Ribeiro

@ fpmurphy1 아직 Avast에서 생성 한 코드의 품질을 볼 수 없었습니다. 더 이상 누가 Intel 32 비트 플랫폼을 사용합니까? 게다가 저는 수십 년 동안 Wintel을 사용하지 않았습니다. unix.stackexchange.com/questions/418354/…를 참조하십시오 . 가격의 차이는 상당히 중요하지만 개인 라이센스의 경우 1500USD에서 5000USD 또는 AFAIK와 같은 상업용 라이센스의 일부 강탈 가치에 이르기까지 Hex-rays / IDA pro 시작, Hopper는 100USD 단일 사용자의 경우 130, 단일 컴퓨터의 경우 130입니다.
— Rui F Ribeiro

@RuiFRibeiro. 내가 조사하는 많은 악성 코드는 여전히 32 비트입니다.
— fpmurphy

답변:


25

그래서 당신은 소를 가졌지 만 실수로 그것을 햄버거로 바 꾸었습니다.

죄송합니다. 그런 식으로 작동하지 않습니다.

백업에서 소스 파일을 복원하면됩니다.

아, 당신은 백업이 없었습니다. 불행히도, 우주는 당신에게 휴식을주지 않습니다.

바이너리 를 디 컴파일 할 수 있습니다 . 그것은 당신에게 당신의 소스 코드를 제공하지 않습니다,하지만 당신에게주지 일부 동일한 동작과 소스 코드를. 디버그 바이너리가 아닌 한 변수 이름을 얻을 수 없습니다. 최적화없이 컴파일하지 않으면 정확히 같은 논리를 얻을 수 없습니다. 분명히, 당신은 의견을 얻지 못할 것입니다.

Boomerang 을 사용 하여 일부 프로그램을 디 컴파일했으며 결과는 머신 코드보다 더 읽기 쉽습니다. 그것이 최고의 도구인지는 모르겠습니다. 어쨌든 기적을 기대하지 마십시오.


1
부메랑은 다소 깔끔하게 보입니다. 문서가 gcc -O4를 참조하는 것이 부끄러운 일입니다. 메모리가 제대로 작동하면 -O3를 넘어서는 아무것도하지 않기 때문입니다. 당신의 마지막 문장은 물론 첫 다섯 문장은 매우 유효합니다. 즉, 정기적으로 백업하는 것이 중요하다는 점을 강조 할 때 나머지는 유효하지 않다는 것은 아닙니다. +1
— Pryftan

6

실행 파일을 리버스 엔지니어링 할 때 일반적으로 몇 가지 도구가 있습니다.

  1. "file"명령은 파일 경로를 첫 번째 매개 변수로 사용하므로 어떤 유형의 실행 파일이 있는지 (대부분의 경우) 결정할 수 있습니다.
  2. 특정 아키텍처에서 어셈블리 코드를 작성하지 않거나 디스 어셈블리에 경험이있는 사용자에게는 실행 파일의 기능을 정확하게 보여 주지만 읽기 어려운 디스어셈블러
  3. Boomerang, Hex-rays 및 Snowman과 같은 디 컴파일러는 약간 더 가독성을 제공 할 수 있지만 원래 프로그램의 실제 변수 이름 또는 구문을 복구하지 않으며 특히 실행 파일을 만든 엔지니어가 테스트 한 경우 100 % 신뢰할 수 없습니다 이러한 패키지와 보안을 더 난독 화하려고했습니다.
  4. 데이터 흐름도 또는 테이블. 자동 으로이 작업을 수행 할 수있는 무료 도구는 없지만 어셈블리 출력의 텍스트 파서 (sed 또는 Perl로 작성 가능)의 맨 위에있는 Python 또는 Bash 스크립트가 도움이 될 수 있습니다.
  5. 흐름과 아이디어를 적는 연필과 종이.

필자가 본 대부분의 경우 코드를 처음부터 다시 작성하거나 어셈블리 언어 프로그램으로 유지 관리하거나 변경 요청을 이전 버전에 다시 적용하여 재구성해야했습니다.


1
# 1 : 결함도 있지만 사실입니다. # 3 : 상업적인 것 같아요? 나는 학문적으로 궁금합니다 (중복 백업이 있으므로 해당 유형이 필요하지 않습니다). # 4 : cflow (소스를 사용하지만 바이너리에 작동하는 일부가 있습니다-물론주의 사항이 있습니다). 당신이 무엇을하는지에 따라 다른 사람들이 있습니다. 그래픽 출력에 관해서는 해당 유형의 그래픽 출력이 마음에 들지 않거나 필요하지 않기 때문에 도움이 될 수 없습니다 (실제로 산만 함). # 5 : 매우 그렇습니다. 물론 여기에서 텍스트 파일을 사용할 수도 있습니다.
— Pryftan

3

당신이하고 싶은 것은 "디 컴파일"입니다. 많은 디 컴파일러가 있으며 여기에 모두 포함시키는 것은 실용적이지 않습니다.

그러나 일반적인 설명으로 C 소스에서 실행 가능한 머신 코드로의 변환은 손실됩니다. 예를 들어 :

  • 댓글이 돌이킬 수없는 손실
  • 변수 이름이 사라졌습니다
  • 때때로 성능을 위해 루프가 풀립니다.
  • 기능 재배치 가능

코드가 작성된대로 컴파일되는 경우는 드 rare니다. 요즘 대부분의 컴파일러는 코드를 극적으로 변경하여 최적화합니다. 당신이 컴파일 때, 컴파일러는 그것이 무엇인지 알 수있는 방법이 없습니다, 같은 소스 코드를 보았다해야하는지 추측 할 수 당신 이 사라 있기 때문에, 코드가되었다. 디 컴파일러가 양호하면, 얻은 코드는 최소한 동등한 실행 파일로 다시 컴파일 할 수 있으며 천천히 읽을 수 있도록 리팩토링을 시작할 수 있습니다. 그러나 디 컴파일러는 절대로 읽을 수없는 스파게티 코드를 생성 할 가능성이 높으며,이를 해독하는 데 큰 어려움이 있습니다. 때로는 프로그램을 처음부터 다시 작성하는 작업 이 줄어들 수도 있습니다 .


주석의 주제에 대해 최근에 주목 한 것은-디 컴파일러가 주석을 읽을 수 있는지 또는 디 컴파일러가 이러한 유형의 것을 찾을 것으로 기대하지는 않습니다. -C 주석을 버리지 마십시오. 처리 된 지시문의 주석을 제외한 모든 주석은 출력 파일로 전달되며, 지시문과 함께 삭제됩니다. 부작용과 -CC 옵션의 부작용을 모두 강조합니다 (ccc 대신 gcc에 해당). 그것이 OP에 적용될 것으로 기대하지는 않지만 일부에게는 관심이있을 것입니다.
— Pryftan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.