2009-09-30 16 views
32

Plik .exe jest plikiem, który może być uruchamiany przez system Windows, ale co dokładnie zawiera? Język złożenia, który jest specyficzny dla procesora? Lub jakieś pośrednie oświadczenie, które jest rozpoznawane przez okna, które zamienia je w zestaw dla konkretnego procesora? Co dokładnie robi system Windows z plikiem, gdy "wykonuje" go?co zawiera plik .exe?

Odpowiedz

39

MSDN ma artykuł "An In-Depth Look into the Win32 Portable Executable File Format", który opisuje strukturę pliku wykonywalnego.

Zasadniczo .exe zawiera kilka plam danych i instrukcje, w jaki sposób powinny być ładowane do pamięci Niektóre z tych sekcji zawierają kod maszynowy, który można wykonać (inne sekcje zawierają dane programu, zasoby, informacje o relokacji, informacje o importowaniu itd.).

Proponuję uzyskać kopię Windows Internals, aby uzyskać pełny opis tego, co się dzieje po uruchomieniu exe.

Dla natywnego pliku wykonywalnego kod maszyny jest zależny od platformy. Nagłówek .exe wskazuje, z jakiej platformy pochodzi .exe.

Podczas pracy rodem EXE z poniższych sytuacji rażąco (-i):

  • Obiekt proces tworzenia.
  • Plik exe jest wczytany do pamięci tego procesu. Różne sekcje pliku .exe (kod, dane itp.) Są odwzorowywane osobno i mają różne uprawnienia (kod jest wykonywany, dane to odczyt/zapis, stałe są tylko do odczytu).
  • Przeniesienia występują w rozszerzeniu .exe (adresy są załatane, jeśli plik .exe nie został załadowany na preferowanym przez siebie adresie).
  • Tabela importowania jest chodzona i zależne biblioteki DLL są ładowane.
  • Pliki DLL są odwzorowywane w podobny sposób do plików .exe, przy zachowaniu delokalizacji i załadowaniu zależnych bibliotek DLL. Zaimportowane funkcje z bibliotek DLL są rozwiązywane.
  • Proces rozpoczyna wykonywanie przy początkowym stub w pliku NTDLL.
  • Początkowy program ładujący uruchamia punkty wejściowe dla każdej biblioteki DLL, a następnie przeskakuje do punktu wejścia pliku .exe.

Zarządzane pliki wykonywalne zawierają MSIL (Microsoft Intermediate Language) i mogą być kompilowane, aby mogły być ukierunkowane na dowolny procesor obsługiwany przez CLR. Nie jestem zaznajomiony z wewnętrznym działaniem programu ładującego CLR (jakiego kodu źródłowego początkowo uruchamia pasek startowy CLR i zacząć interpretować MSIL) - być może ktoś inny może to rozwinąć.

+0

Cholera, pokonaj mnie! :) –

9

1 i 0!

This wikipedia link poda wszystkie potrzebne informacje w formacie Portable Executable używanym w aplikacjach Windows.

+0

Chciałem zająć ci fałszywą odpowiedź, dopóki nie zobaczyłem, że "To" było w rzeczywistości linkiem, a nie odniesieniem do "1's and 0's". Mam nadzieję, że nie przeszkadza mi, jeśli zmienię go tak, aby był nieco jaśniejszy. – paxdiablo

+5

W moim dniu nie mieliśmy 1s, które musieliśmy zrobić z 0s –

12

Mogę powiedzieć, co zawierają dwa pierwsze bajty w plikach .exe - "MZ". Mam na myśli postacie "MZ".

Faktycznie przedstawia: Marka Żbińskiego. Facet, który zaprojektował format pliku exe.

http://en.wikipedia.org/wiki/Mark_Zbikowski

+4

Śliczni i intrygujący (zdecydowanie będę podążał za tym łączem), ale nie niezwykle istotne dla danego pytania. – Twisol

+0

Tak, mimo interesującego fragmentu, wyjaśnia on tylko dwa pierwsze bajty pliku PE. To niewiele, procentowo. – paxdiablo

+0

Po prostu z ciekawości: czy zaprojektował go dla Microsoftu? – MasterMastic

1

plik EXE jest naprawdę typ pliku zwanym Portable wykonywalny. Zawiera dane binarne, które mogą być odczytane przez procesor i wykonane (zasadniczo instrukcje x86.) Istnieje również lot danych nagłówka i innych różnych treści. Rzeczywisty kod wykonywalny znajduje się w sekcji o nazwie .text i jest przechowywany jako instrukcje maszynowe (zależne od procesora). Ten kod (jak również inne części .EXE) są umieszczane w pamięci, a procesor jest wysyłany do niego, gdzie rozpoczyna wykonywanie. (Zauważ, że faktycznie dzieje się o wiele więcej interfejsów, to jest uproszczone wyjaśnienie).