0

これを前置きするために、はい、これは実行可能ファイルを外部から制御するプロジェクトです。いいえ、これには悪意はありません。このプロジェクトの最終結果は、とにかく何の役にも立ちません。XPの32ビットインストールでcygwinでこれを書いています。

私がする必要があるのは、COMファイルの最初の数ビットをジャンプ命令に変更して、実行時にCOMファイルの最後にジャンプするようにすることです。アセンブラのマニュアルを調べて、そのコマンドのバイト数を調べて、Cでハードコーディングできるようにしましたが、うまくいきませんでした。

最初の質問:Cでこれを行うことはできますか?COMフ​​ァイルの代わりにそれを実行するようにCOMファイルの先頭にOpCodesを挿入することができたように私には思えます。

2番目の質問:ファイルに挿入できるように、OpCodeのリソースをどこで見つけることができるか誰かが知っていますか?または、Jump命令のバイト数を知っている人はいますか?

これの信憑性について質問がある場合は、遠慮なく質問してください。

4

3 に答える 3

1

インテル®64およびIA-32アーキテクチャーソフトウェア開発者マニュアル第2巻A命令セットリファレンスでは、命令のエンコードについて説明していJMPます(リアルモードはIA-32のサブセットです)。

(現在のコードセグメント内の)16バイトのニアジャンプの場合は0xE9、ジャンプ先の相対オフセットの後に使用します。ジャンプがCOMファイルの最初のバイトである場合、オフセットはアドレスに相対的0x103です。COMファイルの最初の命令は常にアドレス0x100にロードされ、ジャンプは3バイトのジャンプに続く命令に相対的です。

于 2012-11-11T11:22:32.313 に答える
1

XPでは、debug.exeが必要です。単にそれを開始し、「a」
タイプのjmp ff00でコードの記述を開始し、対応する16進ダンプが表示されなかった場合は「u」で結果を分解します。

于 2012-11-12T17:03:50.890 に答える
0

まず、プログラムが必ずオペレーティングシステム、ABI、およびマシン命令セットに固有であることに注意してください。(たとえば、Linux/x86-64またはLinux/PowerPCでは実行されません)

マシン命令をバイトシーケンスとしてCに書き込むことができます。どのバイトを書き込む必要があるか(つまり、適切なジャンプ命令のエンコーディング)はあなたに任されています!!!!!

もちろん、これは移植性のあるCではありません。しかし、基本的には、memcpy適切なソースバイトゾーンを使用して行うことができます。

たぶん、asmjitGNUlightningのようなライブラリがあなたにインスピレーションを与えるかもしれません。

おそらくそれらを直接使用することはできませんが、それらのコードを研究することはあなたを助けるかもしれません。

その他の参照については、x86ウィキペディアのページも参照してください。

于 2012-11-10T23:19:30.550 に答える