2009-06-02 6 views
1

Ich versuche, ein Programm in Assembly zu schreiben und die resultierende ausführbare Datei als klein wie möglich. Einige von dem, was ich tue, erfordert Windows-API-Aufrufe von Funktionen wie WriteProcessMemory. Ich hatte einige Erfolge mit dem Aufruf dieser Funktionen, aber nach dem Kompilieren und Verknüpfen kommt mein Programm im Bereich von 14-15 KB heraus. (Von einer Quelle von weniger als 1 KB) Ich habe auf viel, viel weniger gehofft.Windows-API-Aufrufe von Assembly bei gleichzeitiger Minimierung der Programmgröße

Ich bin sehr neu zu tun Low-Level-Dinge wie diese, so dass ich nicht wirklich weiß, was getan werden müsste, um das Programm kleiner zu machen. Ich verstehe, dass das exe-Format selbst ziemlich viel Platz in Anspruch nimmt. Kann etwas getan werden, um das zu minimieren?

Ich sollte erwähnen, dass ich NASM und GCC verwende, aber ich kann leicht ändern, wenn das helfen würde.

+0

Schreiben Sie das gesamte Programm in Assembly? –

+1

Aus persönlicher Neugier, in welcher Umgebung ist eine 15kb ausführbare Datei zu groß? – Nate

+0

Ja, das gesamte Programm wird zusammengebaut. Was ich mache, ist eher eine persönliche Herausforderung als alles Praktische. – takteek

Antwort

3

Siehe Tiny PE für eine Reihe von Tipps und Tricks, die Sie verwenden können, um die endgültige Größe Ihrer ausführbaren Datei zu reduzieren. Seien Sie gewarnt, dass einige der späteren Techniken in diesem Artikel äußerst fragil sind.

0

Ich empfehle das Dienstprogramm DumpBin (oder GNUs objdump) zu verwenden, um zu bestimmen, was den meisten Platz beansprucht. Das können Ressourcendateien, riesige globale Variablen oder ähnliches sein.

2

Die standardmäßige Abschnittsausrichtung für die meisten PE-Dateien ist 4K, um mit dem natürlichen Systemspeicher-Layout übereinzustimmen. Wenn Sie einen .data-, .text- und .resource-Bereich haben - das sind bereits 12K. Das meiste davon wird Nullen und Platzverschwendung sein.

Es gibt ein paar Dinge, die Sie tun können, um diese Verschwendung zu minimieren. Verringern Sie zuerst die Abschnittsausrichtung auf 512 Bytes (die für nasm/gcc benötigten Optionen sind nicht bekannt). Zweitens, füge die Abschnitte zusammen, so dass du nur einen einzigen Textabschnitt hast. Dies kann jedoch für moderne Maschinen mit eingeschaltetem NX-Bit ein Problem sein. Diese Sicherheitsfunktion verhindert die Änderung von ausführbaren Codeabschnitten von Dingen wie Viren.

Es gibt auch eine Reihe von PE-Komprimierungstools, die Ihr PE komprimieren und bei der Ausführung dekomprimieren.

+0

Das macht NX nicht. Seiten, die ausführbaren Code enthalten, sind auf normalen Betriebssystemen auch ohne die NX-Funktion schreibgeschützt. Was NX Ihnen bietet, sind schreibgeschützte Datenseiten, die * nicht * ausführbar sind. Daher wird im Stapelspeicher ein Pufferüberlauf verursacht, der eine Rücksprungadresse überschreibt und dazu führt, dass die Ausführung zu einem Maschinencode springt, der ebenfalls Teil des Pufferüberlaufs ist und nicht funktioniert. Springen zum Stack-Speicher segfaults, da im Stack-Speicher keine Ausführungsberechtigung aktiviert ist.Sie werden Probleme haben, Text mit Daten/BSS-Abschnitten auf jedem System zu kombinieren, das Text schreibgeschützt macht, aber Sie können '.rodata' mit' .text' kombinieren. –

0

FWIW, die kleinsten Programme, die ich mit ML oder ML64 zusammenbauen kann, liegen in der Größenordnung von 3kb. (Das ist nur Hallo Welt sagen und beenden.)

0

Gib mir ein kleines C-Programm (nicht C++), und ich werde Ihnen zeigen, wie man eine 1 ko .exe damit machen. Die kleinste Größe der ausführbaren Datei, die ich empfehle, ist 1K, da sie bei einigen Windows nicht ausgeführt werden kann, wenn sie nicht mindestens diese Größe hat.

Sie müssen nur mit Linker-Schalter spielen, um es zu ermöglichen! Ein guter Linker, dies zu tun, ist polink.

Und wenn Sie alles in Assembly tun, ist es noch einfacher. Geh einfach ins MASM32-Forum und du wirst viele Programme wie dieses sehen.

+0

IMO FASM ist viel besser für diese pupose geeignet. Es kann ausführbare Dateien direkt erstellen und Sie können Abschnitte selbst definieren. –

+0

Ja, FASM ist nett. Sie können DB Ihre gesamte ausführbare Datei und das ist der beste Weg, diese kleinen ausführbaren Dateien zu erreichen. Heureusement, ich habe es geschafft, meine Geisteskrankheit bei 1ko zu stoppen :) – toto

Verwandte Themen