• 締切済み

エミュレータ上での動作の検出

あるプログラムが、 自分自身がエミュレータ上で動いているかどうかを 検出する方法はあるのでしょうか。 お答えいただければ幸いです。 宜しくお願いいたします。

みんなの回答

noname#21649
noname#21649
回答No.3

>エミュレータ側にいかなる実装をしようとも、 >かつ、装置の本来の実行速度をあらかじめ入手することなく >検出する方法という都合のよいものはやはりないのでしょうか。 所詮ソフトですよ。かって.symdeb.exeのトレース(エミュレーターの一つ)をしていると実行速度の差からハングアップするコピープロテクトとかありましたが.ことごとく破るソフトが開発されています。だから簡単に避けられてしまいます。 >2つのコマンドの実行時間の違いから検出するといった方法が 特定のコマンドの実行速度を測定する方法は使えません。というのは.現在のOSは原則としてマルチタスクです。したがって.優先度の高いタスクが起動されると該当コマンドが待ち行列につながれてしまいますから.この待ち時間の影響を考慮しなければならないためです。Winでctrl+shift+delを押しただけで実行中のタスクが暴走した(エミュレーター上の動作として通常とは異なる動作をした)なんてことになりかねません。 ioやメモリー直接アクセスはスーパーバイザー(Winではデバドラ・BIOS)上での動作ですから.必要に応じて最高優先度を指定できます。つまり.実行優先度を最高優先度に.割り込み処理を一切抑止できる特権タスクを自前で作り実行するから可能です。しかし.osを含めて一般のタスクは優先度を低く押さえています(時計が遅れたというような事は一般のタスクの優先度の上げ過ぎから発生する)。 お話の内容では.マルチタスク処理を脅かす致命的障害になりかねません。不可能でしょう。

noname#21649
noname#21649
回答No.2

WInのMS-DOSエミュレーターの検出ならば.バージョン取得(Int21 ??かInt2f ??)でたしかVer7以上ならばエミュレーターと検出できます。 あとはioポートをダイレクトに操作する入出力をして.実機との時間差からエミュレータと判断する方法もあります。たたし.実機情報を持っていればですけと。 フロッピーを細工できるのであれば.ギャップにフラグを入れていてキャップを読み取れるかとする方法があります。一部のエミュレーターは標準フォーマットしか対応していないために.ギャッブを適当にいじると読めなくなりますから。 最後は.romの直接読み取りで.機種によってはramに比べて1ウェイト遅くしてある機種があります。RamとROMの読み取り速度の違いから検出できる場合があります。

tarotaro
質問者

補足

ご回答ありがとうございます。 求めていたものにかなり近いお答えを頂きまして嬉しく思います。 お答えから察するに基本的には、 (1)エミュレーターや装置に、検出を可能とする特別な仕掛けがあり、それを利用する方法 (2)装置の本来の実行時間をあらかじめ入手しておく方法 の2種類のようですね。 フロッピーの方法はエミュレータ側で対応することも可能だと受け取りました。 エミュレータ側にいかなる実装をしようとも、 かつ、装置の本来の実行速度をあらかじめ入手することなく 検出する方法という都合のよいものはやはりないのでしょうか。 たとえば2つのコマンドの実行時間の違いから検出するといった 方法があれば嬉しいのですが。

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.1

「エミュレータ上で動作している」なんて事がわかったらエミュレータの意味が半減するのではないでしょうか。 (完全なエミュレーションとは呼べなくなる) エミュレータ側に「環境がエミュレータである」ことを示すような仕組みが組み込まれている場合は別ですが… ただ、「エミュレータ」といっても、ICEやターミナルエミュレータ、ゲーム機エミュレータなど多種多様ですから具体的な環境示していただければ経験者の方ならわかるかもしれません。

tarotaro
質問者

補足

早速のご回答有難うございます。 エミュレータの限界に関心がありましたので、この様な質問を致しました。 想定する環境としては、Windows等のOS上で 動くプログラムが、本来のOS上ではなく、 そのOS上で動いているOSエミュレータ上で 動くときを考えています。

関連するQ&A