기계 코드를 어셈블리 코드나 심지어 C 코드로 변환할 수 있는 좋은 FOSS 유틸리티가 있습니까?

기계 코드를 어셈블리 코드나 심지어 C 코드로 변환할 수 있는 좋은 FOSS 유틸리티가 있습니까?

x86 32비트 또는 64비트 소프트웨어를 구입했지만 소스 코드를 받지 못했고 소프트웨어를 수정해야 하는 경우 기계어 코드를 다시 고급 언어 또는 최소 어셈블리 코드로 변환해야 합니다.

기계어 코드를 C로 변환하는 좋은 유틸리티가 있나요?

프로그램이 C++, Objective C 또는 다른 컴파일러가 아닌 C 컴파일러로 컴파일되었는지 식별하려고 한다고 가정합니다.

감사해요.

답변1

기계어에서 소스 언어로 복귀하는 것을 호출합니다.디컴파일. 디스어셈블리(기계어에서 어셈블리 언어로)는 objdump -d;로 수행할 수 있습니다. objdump표준 binutils 개발 도구 제품군의 일부입니다. 디컴파일러는 이 프로세스에서 유용한 도구가 될 수 있지만, 코드를 수정하고 다시 컴파일하기 위해 디컴파일하는 것은 프로그램의 동작을 수정하는 효과적인 방법이 아닙니다. 소스 코드를 사용 가능하게 만드는 데 많은 시간이 걸리며 소스 코드는 유지 관리 가능한 형태가 아닙니다.

프로그램 작동 방식을 이해하는 첫 번째 단계는 디버깅 도구입니다. 프로그램이 어떤 시스템 호출과 라이브러리 호출을 하는지 확인하려면 strace및 같은 도구를 사용하세요 . ltrace프로그램 지침을 단계별로 실행하려면 Gdb와 같은 디버거를 사용하세요.

운이 좋다면 구성 파일이나 환경 변수를 통해 원하는 동작을 얻을 수 있습니다. 다음 단계는 프로그램에 연결하고 일부 기능을 자신의 버전으로 바꾸는 것입니다.LD_PRELOAD이러한 함수의 자체 버전을 정의하는 링크 라이브러리.

디컴파일은 호환 가능한 네트워크 프로토콜이나 파일 형식으로 다른 프로그램을 작성하는 등 프로그램에서 사용하는 알고리즘을 이해하는 데 도움이 되는 경우가 많습니다. 일반적으로 프로그램의 동작을 수정하는 것이 목표인 경우에는 그다지 유용한 도구가 아닙니다.

답변2

와, 몇몇 프로젝트가 있군요! 하지만 가지고 놀 수 있는 장난감이 몇 가지 있습니다.

(첫 번째 인수로 all 및 bin을 사용합니다.)

조금:

xxd -b        # xxd for hexdump (?): `-b` is `-bits`

8진수:

od            # octal dump

16진수:

hexdump       # these two share the hexdump(1) man page
hd            # symbolic link to hexdump
od -t x1      # `-t` for type, `x1` for hexadecimal with 1 byte per integer
xxd

끈:

strings

기계 코드:

objdump -D    # object dump: `-D` is `--disassemble-all`

마지막으로 중요한 것은,file

꼭 확인해보세요이것질문.

관련 정보