2009-06-02 7 views
1

アセンブリでプログラムを作成し、実行可能ファイルをとしてと小さくしようとしています。私がやっていることのいくつかは、WriteProcessMemoryのような関数へのWindows API呼び出しを必要とします。私はこれらの関数を呼び出すことでいくつかの成功を収めましたが、コンパイルとリンクの後、私のプログラムは14〜15 KBの範囲で出てきます。 (1 KB未満のソースから)私はそれよりもはるかに少ないと思っていました。プログラムサイズを最小限に抑えながらアセンブリからのWindows API呼び出し

私はこのような低レベルのことをするのがとても新しいので、プログラムを小さくするために何をする必要があるか分かりません。私は、exe形式自体はかなりのスペースを占めることを理解しています。それを最小限に抑えるために何かできますか?

私はNASMとGCCを使用していますが、それが助けになるならば簡単に変更できます。

+0

アセンブリ全体でプログラムを書いていますか? –

+1

個人的な好奇心の外に、どのような環境で15kbの実行可能ファイルが大きいのですか? – Nate

+0

はい、プログラム全体が組み立てられます。私がしていることは、実用的なものよりも個人的な挑戦のほうが多いです。 – takteek

答えて

3

Tiny PEを参照して、実行可能ファイルの最終サイズを減らすためのヒントとヒントをご紹介します。その記事の後の技術のいくつかは非常に脆弱であることに注意してください。

0

DumpBinユーティリティ(またはGNUのobjdump)を使って、最も多くの領域を占めるものを判断することをお勧めします。それは、リソースファイル、巨大なグローバル変数、またはそのようなものかもしれません。

2

ほとんどのPEファイルのデフォルトセクションアライメントは、自然なシステムメモリレイアウトに合わせて4Kです。 .data、.text、.resourceセクションがある場合は、すでに12Kです。そのほとんどは0になり、スペースが無駄になります。

この廃棄物を最小限に抑えるためにできることはいくつかあります。まず、セクションの配置を512バイトに減らします(nasm/gccに必要なオプションがわからない場合)。次に、単一の.textセクションしか持たないようにセクションをマージします。これは、NXビットがオンになっている現代のマシンでは問題になります。このセキュリティ機能は、コードの実行可能セクションをウイルスなどから変更することを防ぎます。

そこにPE圧縮ツールがあり、実行時にPEを圧縮して解凍します。

+0

これはNXのことではありません。実行可能コードを保持するページは、NX機能がなくても通常のOSで読み取り専用です。 NXが提供するものは*実行可能ではない*読み書き可能なデータページです。したがって、スタックメモリ内のバッファオーバーフローはリターンアドレスを上書きし、実行をバッファオーバーフローの一部であるマシンコードにジャンプさせても動作しません。スタックメモリには実行許可が有効になっていないため、スタックメモリセグメンテーションにジャンプします。テキストを読み込み専用にするシステムでは、テキストをdata/bssセクションと結合するのに問題がありますが、 '.rodata'と' .text'を組み合わせることができます。 –

0

FWIWは、MLまたはML64を使用してアセンブルできる最小のプログラムは3kbのオーダーです。

0

小さなCプログラム(C++ではなく)を教えてください。それで、1 ko .exeを作る方法を説明します。私が推奨する実行可能ファイルの最小サイズは、それが少なくともこのサイズでないなら、いくつかのWindowsで動かないので、1Kです。

これを実現するには、リンカスイッチを使用するだけで済みます。 これを行うにはリンカーが良いです。

アセンブリですべてを行うと、それはさらに簡単です。 MASM32フォーラムに行くと、このようなプログラムがたくさん見られます。

+0

IMO FASMは、このようなポーズにはるかに適しています。実行可能ファイルを直接作成でき、セクションを自分で定義することができます。 –

+0

さて、FASMはいいですね。実行可能ファイル全体をDBすることができます。これが、これらの小さな実行可能ファイルを実現する最善の方法です。 Heureusement、私は1koで私の精神病を止めることができた:) – toto

関連する問題