Oli가 그의 답변에서 이미 지적했듯이 실행 파일의 원본 소스 코드는 얻을 수 없습니다.
소스 코드를 컴파일하는 동안 (일반적으로 광범위하게 받아 들여 지도록 컴파일되므로 소스 코드를 실행 파일로 "변환하는 전체 프로세스") 많은 정보가 손실됩니다.
C 프리 프로세서는 다음과 같은 작업을 수행합니다.
- 전 처리기 지시문 (
#
문) 해석, 실행 및 제거
- 댓글 제거
- 불필요한 공백 제거
반면에 소스 코드를 컴파일하는 동안 손실되지 않은 것은 기능적으로 동등한 소스 코드로 기술적으로 되돌릴 수 있습니다.
이 때문입니다:
- 이진 명령어는 어셈블리 명령어와 1 : 1의 일치 성을 갖습니다. 어셈블리 소스 코드의 어셈블 링은 단지 대응 테이블에 기초한 어셈블리 명령어를 이진 명령어로 변환하는 것에 불과하다. 단일 이진 명령은 항상 식별 가능하고 단일 어셈블리 명령으로 되돌릴 수 있습니다 .
- 조립 설명서 에는 C 명령어와 1 : 1의 일치 성이 없습니다 . C 소스 코드의 컴파일은 일반적으로 C 테이블을 해당 테이블을 기반으로하는 어셈블리 명령으로 변환하는 것만이 아니라 실제로는 반대입니다. 일반적으로 C 명령어는 여러 (종종 컴파일러에 따라 다름) 어셈블리 명령어로 변환됩니다. 그러나, 다수의 조립 명령의 패턴은 일반적으로 식별 가능하고 단일 C 명령으로 되돌릴 수있다 ;
실행 파일을 기능적으로 동등한 소스 코드로 되돌리려는 목적으로 디 컴파일러라는 도구가 있습니다. 그러나 결과는 일반적으로 원래 소스 코드와는 거리가 멀다 (그리고 보통 컴파일 할 수 없다).
이 프로그램을 고려하십시오 :
#include <stdio.h>
#define MESSAGE "Literal strings will be recovered" // This preprocessor directive won't be recovered
/*
This comment and the comment above won't be recovered
*/
int main(int argc, char* argv[]) {
printf(MESSAGE);
return 0;
}
실행 파일로 컴파일하고 소스 코드로 다시 컴파일하면 일반적으로 얻는 것입니다 (이 특정 경우 gcc
/ Boomerang 사용 ).
// address: 0x80483fb
int main(int argc, char **argv, char **envp) {
printf("Literal strings will be recovered");
return 0;
}
예상대로 :
- 전 처리기 지시문이 없습니다
- 주석이 누락되었습니다 (
// address: 0x80483fb
디 컴파일러가 추가 한 제외 ).
- 불필요한 공백이 없습니다 (디 컴파일러가 추가 한 줄 바꿈 및 표 제외)
이것은 또한 꽤 좋은 결과입니다. 인라인 어셈블리 명령어를 코드에 넣는 것은 드문 일이 아닙니다.
asm("assembly_instruction");
__asm__("assembly_instruction");
결론은 (다른 답변에서 이미 지적했듯이) 실행 파일의 원본을 얻을 수는 없습니다 *.
그러나 실행 파일과 운에 따라 디 컴파일러를 사용하여 무언가를 얻을 수 있습니다.
strings
필터 프로그램은 특정 이진 프로그램이 무엇인지 또는 무엇인지 식별하는 데 매우 유용 할 수 있다는 점에 주목할 가치가 있습니다. 이진 파일과 프로그램의 메시지를 보면 파일의 내용과 기능에 대해 많은 정보를 얻을 수 있습니다.