2011-02-16 1 views
3

우리는 exe를 가지고 있습니다, 쉽게 어셈블리로 변환 될 수 있습니까? 소프트웨어 제작자가이를 방지/차단할 수있는 방법이 있습니까?모든 프로그램을 어셈블리로 변환 할 수 있습니까?

+3

조립을 의미합니까? – moatPylon

+0

related : [Windows .exe를 "디 컴파일"할 수 있습니까? 아니면 적어도 어셈블리를 볼 수 있습니까?] (http://stackoverflow.com/questions/273145/is-it-possible-to-decompile-a-windows-exe-or-at-least-view-the-assembly) –

+0

그는 exe를 분해하여 값을 수정 한 다음 다시 빌드하는 것을 의미합니다. –

답변

2

한 마디로, 아니요. 당신이 누군가에게 당신이주는 책을 읽고 분석하는 것을 막을 수는없는 것처럼.

4

실행 파일은 컴퓨터 프로세서에서 실행되도록 설계되었습니다 (따라서 이름). 어셈블리 언어는 컴퓨터 프로세서가 실행하는 컴퓨터 코드 위에있는 계층입니다. 프로그램을 기계 코드로 실행할 수 있으면 어셈블리로 읽을 수 있습니다.

다음과 같은 상황이 발생할 수 있습니다. 독점적 인 C/C++ 작성 프로그램이 클라이언트에 배포되고 있습니다. 일부 클라이언트는 정직한 의도가 없으며 프로그램을 어셈블리로 디 컴파일하여 일부 지침 (예 : 프로그램의 악의적 인 사용을 막고 프로그램의 시험 기능을 무기한으로 연장하는 프로그램)을 변경 한 다음 프로그램을 다시 컴파일합니다.

그런 경우 또는 이와 유사한 경우 모든 프로그램을 실행하지 않을 경우 단순히 디스크의 데이터로만 인식해야합니다. 누구든지 해당 데이터를 읽고 원하는대로 변경할 수 있습니다. 이것이 정말로 문제가된다면, 프로그램을 보호하는 또 다른 방법을 생각해 내야 할 것입니다. 예를 들어 중요한 로직을 실행하는 웹 서비스에 위임하고 결과를 다시 보냅니다. 예를 들면 Google 웹 검색 엔진에서 실행되는 Google의 검색 알고리즘입니다. 아무리 정확하게 작동하는지 아무도 모릅니다.

+0

나는 내 코드를 '보호'하려고하지 않는다. 나는 자유 소프트웨어 운동을지지하여 어쨌든 내 소스 코드를 제공 할 것이다. :) – LarryTheCat

+0

Larry, 나는 자유 소프트웨어 운동도지지하지만 돈은 어딘가에서왔다. ;)이 문제와 비슷한 문제가 있다면 이의 제기가 없었을 것입니다. –

2

"변환 된"은 컴파일 된 것을 의미하며, 이는 기계 코드로 컴파일 된 것을 의미합니다. 그렇습니다. 모든 상자에서 실행되는 모든 코드가 기계 코드로 실행됩니다. 특정 언어의 경우 언어 런타임 라이브러리가 필요없는 독립 실행 형 실행 파일을 만드는 데 도구가 있는지 여부에 따라 응답이 다릅니다.

"변환 된"경우 어셈블리에서 수동으로 코딩하는 것을 의미하는 경우 다른 답변을 참조하십시오. 우리는 코드를 작성하는 데 오랜 시간이 걸리기 때문에 그렇게하지 않습니다.

난독 처리와 관련하여 첫 번째 단락에서 언급 한 변환/컴파일은 실제로이 작업을 수행하지 않습니다. Java 또는 C#과 같은 것을 "컴파일"하면 소스가 런타임 라이브러리에 많은 포인터로 변환됩니다. 이러한 포인터는 쉽게 리버스 엔지니어링 할 수 있으며 원래 코드가 다시 생성됩니다.

6

아니요. 프로그램이 이해할 수있는 경우에만 시스템에서 프로그램을 실행할 수 있습니다. 이해가된다면 아마도 어셈블리 코드로 변환 될 수있는 기계어 코드에있을 것입니다.

가능한 작업은 코드 난독 화 방법을 사용하여 해체 된 이진 파일을 최대한 이해하기 어렵게 만드는 것입니다.

http://en.wikibooks.org/wiki/X86_Disassembly/Code_Obfuscation

편집 : 시간과 충분한 자원과, 물론, 그 추가 하시겠습니까, 누군가가 결국 난독 화 코드를 읽는 방법을 알아낼 것이다. 피할 수없는 일입니다. 난독 화가하는 일은 리버스 엔지니어링을 가능한 한 불편한 것으로 만들어 시간을 투자할만한 가치가 없게 만드는 것입니다. 따라서 리버스 엔지니어링을 잘못하려는 사람 만 그렇게 할 것입니다.

1

나는 maranas가 지금까지 가장 좋은 대답을 가지고 있다고 생각하지만, 당신이 프로그램을 분해 할 수 있다고 생각한다고 덧붙였다. 먼저이 방법을 생각해보십시오. 실제로 실행 가능하다면 의미는 프로세서에 의해 실행될 수 있습니다. 그렇다면 절대적으로 프로세서가 할 수있는 것과 똑같은 방법으로 바이너리를 파싱 할 수 있습니다. 즉, 모든 비트와 바이트를 구문 분석하여 인간이 읽을 수있는 형태의 ascii/어셈블러로 변환합니다. 이것은 프로그램을 실행할 수있는 경우 항상 가능합니다.

자, 가지고있는 모든 파일이 .exe 파일 인 경우 작동하지 못하도록 할 수있는 것들이 있습니까? 예를 들어 암호화와 같은 것들과 마라 노드에 대한 대답이 많습니다. 하드웨어 또는 사용자 암호 또는 .exe 파일에 포함되어 있지 않은 항목에있는 경우 알아낼 수 없으며 게임이 끝났습니다.

필자는 디스어셈블러의 여러 해에 걸쳐 여러 가지 트릭을 보았으며 때로는 고의적 인 경우도 있었지만 때로는 의도하지 않았습니다. 예를 들어, Michael Abrash의 Assembly of Zen을 읽으면 8088/86의 프리 페처에 대한 토론이 있다고 생각하는 것 같습니다. 토론은 한 프로세서를 다른 프로세서와 교신하는 방법입니다 (캐시가 캐시되기 전 이었음을 기억하십시오). 해커를 물리 칠 수 있습니다. 당신이 할 수있는 일은 한 명령어가 다음 명령어를 수정하도록하는 것입니다. 이 명령은 두 번째 명령이 이미 가져와 져서 파이프에 있었기 때문에 완벽하게 실행됩니다. 따라서 수정 된 명령은 메모리에만 있었기 때문에 수정되지 않은 명령이 실행되었습니다. 당연히 이는 명령이 램에서 수정 될 때 한 번만 실행되는 코드 여야했습니다. 디버거가 수정 된 명령어를 실행하고 충돌하거나 이와 같은 작업을 수행하기 때문에 디버거로 코드를 한 번씩 실행하는 것을 막을 수있었습니다. 그리고 디스어셈블러가 프로그램을 시뮬레이션하려고 시도하고 하드웨어가 다시 작동하는 방식에 대해 설명하지 않으면 잡초로 이어질 것입니다. 또한 0의 직후에 0으로 즉각적인 레지스터를로드하는 것을 사용하는 것을 보았습니다. 무조건 분기와 동일한 0 인 경우 (실제로 레지스터가 0이 아니었다 고 가정하면)이 데이터를 따릅니다. 디스어셈블러가 작동하지 않게하십시오. 이 기능을 사용하려면 가변 단어 길이 명령을 사용해야합니다. 인간이 어떤 일이 있었는지 파악하는 것은 그리 어렵지 않으며 명령이 아닌 데이터 도구 (시뮬레이터가 아닌 자동화 된 도구)를 사용하는 데이터 단어를 피하기 위해 분해 과정을 조정합니다. 트릭 목록은 계속됩니다 ...

귀하의 프로그램이 프로세서에 의해 실행될 수 있다면 그렇습니다. 그렇다면 절대적으로 기계어 코드를 사람이 읽을 수있는 어셈블러 형식으로 다시 변환 할 수 있습니다. 네, 할 수있는 일이 있습니다. 특히, 해독기가 실행 파일 만보고 해독 할 수 있고 해체를 방지 할 수있는 하드웨어 기능을 사용하는 것이 좋습니다. 사용자가 하드웨어에 대해 물리적으로 액세스 할 수있는 보안 조치가있는 경우와 마찬가지로 하드웨어에서 프로그램을 실행할 수있는 경우 보안 측정 값을 무시하고 해체 할 수 있습니다.