실행 파일을 다시 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.