2011-10-19 2 views
1

実行時に実行中のOSをアセンブリ言語で判断する方法は何ですか?実行時に実行中のOSをアセンブリ言語で判断する方法は何ですか?

これを判断する直接的な方法がある場合、それはすばらしいでしょう。

私はJavascriptでどのようなブラウザを使っているのかを判断する方法を考えていました... Intelのアセンブリのような低レベル言語でOSやCPUのアーチを決定する類似のテクニックはありますか?

おかげで、 Chenz

+2

私はこれをまっすぐにしましょう:あなたはアセンブリで書いていますが、実行しているOSがわからないのですか? – Stu

+0

なぜこれを行う必要がありますか? – bdonlan

+0

@bdonlan:ウイルスの書き込みは最も明白です – James

答えて

3

CPUアーキテクチャが決定するために、次のツー不可能になります。マシンコードはCPUアーキテクチャによって大きく異なります。したがって、1つのアーキテクチャを除くすべてのアーキテクチャでクラッシュしない検出コードを記述することは非常に困難です。確かに、あなたはアセンブリー(とマシンコード)を異なるCPUアーキテクチャー上でまったく異なる言語と考えることができます。を調べることができるものは、は基本的にmachine code polyglotでなければなりません。あなたは、x86のいくつかのフレーバーにしている知っていれば、あなたはプロセッサの機能に関する情報を取得するためにCPUID命令を使用することができるかもしれない、と述べた

。また、64ビットモードであるかどうかを知るために制御レジスタを読み取ることもできます。

OSの検出に関しては、これも非常に困難です。異なるOSは異なるシステムコールエントリポイントを持ち、間違ったOSのエントリポイントを使用しようとするとクラッシュするだけです(実際には、Windowsはブート時のシステムコールエントリポイントのアドレスも変えます)。 は、ウィンドウのTIBを調べることができますが、FS:[0x0]にアクセスしようとすると、他のOSでクラッシュする可能性があります。

一般的に言えば、アセンブリを書くときには、あなたがどのような種類のシステムを使用しているかが分かります。移植性が必要な場合は、Cなどの高水準言語で記述します。

+0

忘れてしまいましょう:実行可能なヘッダから始めましょう! – Stu

+0

@Stu、私は生のマシンコード(ある種のスタブローダーによって呼び出される)を想定しています。実行可能なヘッダーは確かに別の問題です。フォーマットAがファイルをマジックナンバーXで始まり、フォーマットBがマジックナンバーYで始まるファイルにしたいのであれば、完全に固まってしまいます。 – bdonlan

+0

CPUIDはクールです。そして、私は、エンディアンを決定することが可能かもしれないと思う。はい、生のマシンコードです。実行可能なヘッダーについては、実行中のコードでマジックナンバーを読み込んでいる可能性があります。 –

1

いいえ、これを行うマシンコードはありません。 は、異なるアーキテクチャーに対していくつかの異なるシェルコードを与え、そのコードが伝搬するたびにランダムに1つを選択します。それが正常に実行されれば、マシンに感染しますが、ごみの場合、おそらく不正な命令を出してプロセスが殺され、ユーザーは健康なマシンで別の日に暮らしています。

+0

あなたは素晴らしいです。私はこのすばらしい洞察がなければ何ができるのか分かりません。 –

+0

私は受け入れられた答えの点を楽しみにしています! – James

+0

実行中のOSの種類を決定する単一のC関数を提供します。 –

0

一般に、C(++)またはアセンブリ言語プログラムでOSを確実に決定することはできません。

WindowsのGetSystemInfo()/GetNativeSystemInfo()のような異なるOSバージョンで使用できる機能を使用して、同じOSの異なる「互換性」バージョンを区別することはできますが、DOS、Linuxでは使用できませんその他のOS

異なるOSでOSの関数を呼び出す方法が異なるため、アセンブリ言語のサブルーチンで見つけにくいです。OSに間違って実行すると、プログラムがクラッシュします。クラッシュを防ぐために、何らかの例外やシグナルハンドラをインストールする必要がありますが、それもOS固有のものです。

汎用CPUレジスタの内容からOSを推測することは、その値が何らかの形でOSを反映しているとは保証されず、場合によっては将来発生する可能性もあります将来OSをアップデートするとき(セキュリティパッチのインストールなど)。

あなたがCのsystem()機能を使用して、このようなWindows用verおよびLinux用uname -aとしてシェルコマンドを実行することができるかもしれませんが、コンソールウィンドウで、このコマンドの出力を抽出し、バックプログラムにそれをコピーするには何のポータブルな方法はありません分析のため。

関連する問題