문제

나는 컴파일러 마법에 대해 잘 알고 있지 않습니다. 인간이 읽을 수있는 코드를 변환하는 행위 (또는 진짜 기계 코드에 대한 읽기 가능한 조립 지침)는 로켓 과학이 마법과 결합 된 것입니다.

이 질문의 주제를 Win32 Executables (.exe)로 좁힐 것입니다. 이 파일을 전문화 된 시청자로 열면 다양한 장소에 흩어져있는 문자열 (일반적으로 문자 당 16b)을 찾을 수 있지만 나머지는 쓰레기 일뿐입니다. 읽을 수없는 부분 (대다수)은 기계 코드 (또는 이미지 등과 같은 리소스 등)라고 생각합니다.

기계 코드를 읽는 간단한 방법이 있습니까? exe를 파일 스트림으로 열고 바이트로 바이트를 읽으면 어떻게 이러한 개별 바이트를 어셈블리로 바꿀 수 있습니까? 이것들 사이에 간단한 매핑이 있습니까? 지시 바이 테스 그리고 어셈블리 교육?

.exe는 어떻게 작성됩니까? 명령 당 4 바이트? 더? 더 적은? 일부 응용 프로그램은 이와 같은 실행 파일을 만들 수 있음을 알았습니다. 예를 들어 ACD에서는 일련의 이미지를 슬라이드 쇼로 내보낼 수 있습니다. 그러나 이것이 반드시 SWF 슬라이드 쇼 일 필요는 없으며 ACD See는 실행 파일을 생성 할 수 있습니다. 그게 어떻게 끝났어?

EXE 파일 내부에서 무슨 일이 일어나는지 이해하려면 어떻게해야합니까?

도움이 되었습니까?

해결책

ollydbg EXE를 읽을 수있는 지침으로 분해하고 지침을 하나씩 실행할 수있는 멋진 도구입니다. 또한 API가 프로그램에서 사용하는 기능과 가능하면 (스택에서 인수가 발견되는 한) 제공하는 주장을 알려줍니다.

일반적으로 CPU 지침은 길이가 다양하고 일부는 바이트이며, 다른 바이트는 2 개, 3 개, 4 개 등입니다. 대부분 지침이 예상하는 데이터의 종류에 따라 다릅니다. CPU가 CPU 레지스터에서 메모리의 장소로 데이터를 이동하도록 CPU에게 또는 그 반대의 경우에도 "mov"와 같은 일부 지침은 일반화됩니다. 실제로, 8 비트, 16 비트, 32 비트 데이터, 다른 레지스터에서 데이터를 이동하기위한 데이터를 처리하기위한 여러 가지 "Mov"지침이 있습니다.

폴 카터 박사를 데리러 갈 수 있습니다 PC 어셈블리 언어 자습서 이는 조립 및 인텔 386 CPU 운영 방식에 대해 이야기하는 무료 엔트리 레벨 책입니다. 대부분은 현대 소비자 인텔 CPU에도 적용됩니다.

EXE 형식은 Windows에만 해당됩니다. 입력 지점 (예 : 첫 번째 실행 가능한 명령어)은 일반적으로 EXE 파일 내 동일한 장소에서 발견됩니다. 한 번에 모두 설명하기가 어렵지만, 내가 제공 한 자료는 최소한 호기심을 치료하는 데 도움이되어야합니다! :)

다른 팁

기계 코드를 어셈블리 언어로 바꾸는 분해기가 필요합니다. 이것 Wikipedia 링크 프로세스를 설명하고 자유 분해에 대한 링크를 제공합니다. 물론, 당신이 어셈블리 언어를 이해하지 못한다고 말하면, 이것은 매우 유익하지 않을 수 있습니다. 여기서 정확히 무엇을하려고합니까?

당신이 보는 실행 파일은 Microsofts PE (휴대용 실행 가능) 형식입니다. 본질적으로 컨테이너는 프로그램에 대한 일부 운영 체제 별 데이터를 보유하고 있으며 프로그램 데이터 자체가 여러 섹션으로 나뉩니다. 예를 들어 코드, 리소스, 정적 데이터는 별도 섹션에 저장됩니다.

섹션의 형식은 그 안에있는 것에 따라 다릅니다. 코드 섹션은 실행 가능한 대상 아키텍처에 따라 기계 코드를 보유합니다. 가장 일반적인 경우 이것은 Microsoft PE Binaries의 Intel X86 또는 AMD-64 (EM64T와 동일)입니다. 기계 코드의 형식은 CISC이며 8086 이상으로 시작됩니다. CISC의 중요한 측면은 지시 크기가 일정하지 않다는 것입니다. 가치있는 것을 얻기 위해 올바른 장소에서 읽기 시작해야한다는 것입니다. 인텔은 X86/X64 명령어 세트에 좋은 매뉴얼을 게시합니다.

Disassembler를 사용하여 기계 코드를 직접 볼 수 있습니다. 매뉴얼과 함께 소스 코드를 대부분 추측 할 수 있습니다.

MSIL EXE가 있습니다. .NET 실행 파일은 Microsofts 중간 언어를 보유하고 있습니다. 여기에는 기계 별 코드가 아니라 .NET CIL 코드가 포함되어 있습니다. 이 사양은 ECMA에서 온라인으로 제공됩니다.

이들은 반사기와 같은 도구로 볼 수 있습니다.

EXE 파일의 내용은 다음에 설명되어 있습니다 휴대용 실행 파일. 파일로드 방법에 대한 코드, 데이터 및 OS에 대한 지침이 포함되어 있습니다.

기계 코드와 어셈블리 사이에는 1 : 1 매핑이 있습니다. 분해 된 프로그램은 리버스 작업을 수행합니다.

i386에는 고정 된 수의 바이트가 없습니다. 일부는 단일 바이트이고 일부는 훨씬 더 길다.

명령 줄에서 디버그를 사용할 수 있지만 어렵습니다.

C:\WINDOWS>debug taskman.exe
-u
0D69:0000 0E            PUSH    CS
0D69:0001 1F            POP     DS
0D69:0002 BA0E00        MOV     DX,000E
0D69:0005 B409          MOV     AH,09
0D69:0007 CD21          INT     21
0D69:0009 B8014C        MOV     AX,4C01
0D69:000C CD21          INT     21
0D69:000E 54            PUSH    SP
0D69:000F 68            DB      68
0D69:0010 69            DB      69
0D69:0011 7320          JNB     0033
0D69:0013 7072          JO      0087
0D69:0015 6F            DB      6F
0D69:0016 67            DB      67
0D69:0017 7261          JB      007A
0D69:0019 6D            DB      6D
0D69:001A 206361        AND     [BP+DI+61],AH
0D69:001D 6E            DB      6E
0D69:001E 6E            DB      6E
0D69:001F 6F            DB      6F

그것이 보이는 것처럼 당신에게 외국인이라면, 나는 디버거 나 분리기가 도움이 될 것이라고 생각하지 않습니다. 먼저 어셈블러 프로그래밍을 배워야합니다. 프로세서의 아키텍처 (인텔에서 다운로드 할 수있는 많은 문서화)를 연구하십시오. 그런 다음 대부분의 기계 코드가 컴파일러에 의해 생성되므로 컴파일러가 코드를 생성하는 방법을 이해해야합니다. 많은 작은 프로그램을 작성한 다음 C/C ++가 무엇을 바꾸는 지 확인하기 위해 분해하는 가장 간단한 방법입니다.

이해하는 데 도움이되는 몇 권의 책 :-

아이디어를 얻으려면 흥미로운 코드에서 중단 점을 설정 한 다음 CPU 창으로 이동하십시오.

더 관심이 있으시면 -AL 매개 변수를 사용하여 무료 파스칼로 짧은 조각을 컴파일하는 것이 더 쉽습니다.

FPC를 사용하면 -A 매개 변수를 사용하여 생성 된 어셈블러를 다량의 어셈블러 형식 (TASM, MASM, GAS)으로 출력 할 수 있으며, 원래 PASCAL 코드를 주석 (및 그 이상)에 쉽게 상호 참조 할 수 있습니다.

분해 된 .exe의 어셈블러와 달리 컴파일러 생성 어셈블러이기 때문에 더 상징적이고 따라갈 수 있습니다.

Win32 EXE 형식 MSDN에서

약간의 Windows C 소스 코드를 가져 와서 Visual Studio에서 빌드 및 디버깅을 시작하는 것이 좋습니다. 분해보기로 전환하고 명령을 넘어갑니다. C 코드가 기계 코드로 어떻게 컴파일되었는지 확인하고 단계별로 실행되는 것을 볼 수 있습니다.

이 질문과 관련하여 여전히 CD 21과 같은 것을 읽은 사람이 있습니까?

나는 한 쇼에서 Sandra Bullock을 기억하고 실제로 16 진수의 스크린을 읽고 프로그램이 무엇을하는지 알아 냈습니다. 현재 버전의 읽기 행렬 코드와 비슷합니다.

CD 21과 같은 내용을 읽으면 다양한 다양한 조합을 어떻게 기억하십니까?

당신의 호기심과 이해 수준은 모두 내가 한 시점에있는 곳입니다. 나 고도로 추천하다 코드 : 컴퓨터 하드웨어 및 소프트웨어의 숨겨진 언어. 이것은 여기서 묻는 모든 질문에 대답하지는 않지만 컴퓨터의 완전히 흑인 마법 측면에 대해 밝힐 것입니다. 두꺼운 책이지만 읽기 쉽습니다.

ACD See는 아마도 .exe 파일이 파일 길이 또는 파일의 예상 부분의 길이를 넘어서 오류를 확인하지 않는다는 사실을 활용하고있을 것입니다. 이로 인해 자체를 열고 주어진 지점을 넘어서 모든 것을 데이터로로드하는 .exe 파일을 만들 수 있습니다. 이것은 적절하게 쓰여진 .exe의 끝에서 해당 데이터를 해결함으로써 주어진 데이터 세트에서 작동하는 .exe를 만들 수 있기 때문에 유용합니다.

(정확히 ACD가 무엇을 보는지 전혀 모르겠다. 하다 알고 약간 프로그램이 그런 식으로 생성됩니다.)

낮은 수준의 어셈블리에 익숙합니다 (그리고 "매크로"가 아니라 그 황소가 아닌 낮은 수준의 어셈블리를 의미합니다)는 아마도 필수 일 것입니다. 원시 기계 코드 자체를 직접 읽으려면 일반적으로 16 진 편집기를 사용합니다. 그러나 지침이 무엇을하는지 이해하기 위해 대부분의 사람들은 해체 당사를 사용하여이를 적절한 조립 지침으로 변환 할 것입니다. 당신이 기계 언어 자체를 이해하고 싶은 소수자 중 하나라면, 나는 당신이 원한다고 생각합니다. Intel® 64 및 IA-32 아키텍처 소프트웨어 개발자 매뉴얼. 2 권 특히 기계 코드 자체를 읽는 방법과 어셈블리와 관련된 방법에 대한 쿼리와 관련된 명령어 세트를 구체적으로 다룹니다.

모든 명령어는 CPU 내의 특수 메모리 영역에 보관 된 기계 코드에 있습니다. 초기 인텔 서적은 지침을 위해 기계 코드를 제공 했으므로이를 이해하기 위해 그러한 책을 얻으려고 노력해야합니다. 분명히 오늘날 기계 코드는 쉽게 사용할 수 없습니다. 좋은 점은 16 진수를 기계 코드로 되돌릴 수있는 프로그램입니다. 또는 수동으로 _ !! 지루한

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top