• ベストアンサー

このようなプログラム言語はありますか?

簡単に言うと、 「自分自身のプログラムを実行して、自分自身のプログラム自体を書き換えてしまう」 このようなプログラムを作成できるプログラム言語ってあるのでしょうか? 無いとしたら、なぜ無いのか推測でいいので答えてください。 わかりにくい説明ですみません。m(__)m

質問者が選んだベストアンサー

  • ベストアンサー
noname#35109
noname#35109
回答No.11

コンパイルを必要とする言語で考えると, コンパイルしないとダメなので大変なのです。 最初からコンパイルしないプログラムだと,簡単にできますよ。 ---kakikae.vbs------------------------------ Dim fso, f Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.CreateTextFile("A:\kakikae.vbs",True) f.Write "msgbox " & Chr(34) & "私はすでに死んでいます。" & Chr(34) ------------------------------------------ たったこれだけ。 上の点線内の4行をメモ帳などテキストエディタにコピペして, フロッピーディスクに,「kakikae.vbs」というファイル名で保存し, そのVBSを「ダブルクリック」して開いてみてください。 「kakikae.vbs」自体が「kakikae.vbs」によって書き替わります。 書き替わることによって,元のプログラムは死にます。 (死んだヤツが「死んだ」と言うのだろうか?) フロッピーディスクがAドライブでない場合は, 3行目の A:\ を B:\ などに書き替えてください。 また,ドライブは,Aドライブである必要はありません。任意のフォルダでも動作します。 勝手に,HD内でプログラムを動作させるのは悪いかなと思ったのと, フォルダ構造はPCによって違うので無難なAドライブにしただけです。 JavaScriptをされているということですが, 工夫すればJavaScriptでも同様なことはできると思います。 サーバー上にあるHTMLに貼り付いたJavaScriptや .jsファイル では大したことはできません。 ローカルに保存した .jsファイル やJavaScriptを組み込んだHTAファイルだとかなり強烈なことができます。 JSはVBSに比べて,若干制約が多いのと,動作が不安定になります。 上記のものを改良すると,自己増殖も可能ですし,ウイルスも作れます。 今回は自分自身をターゲットにしていますが,自分自身以外のファイルを削除したり,別の場所にコピーすることもできます。 また他のファイルも生成可能で,レジストリの書き替えなどもバキバキにこなすことができます。 つまりPC内をぐちゃぐちゃにしてしまうのは簡単。 また,「kakikae.vbs」 みたいなVBSを自動作動させるVBSを作れば,「kakikae.vbs」 をダブルクリックする必要さえなくなります。 つまり,いわゆる時限爆弾的な物もできます。 改良すると危険な物にもなります,扱いには注意してください。 また,くれぐれも犯罪行為には使用しないでください。

rouden
質問者

お礼

VBScriptですか! 大変参考になりました。 ウイルスを作成する気はまったくないので、誤解しないでください。 回答ありがとうございました。

その他の回答 (14)

noname#35109
noname#35109
回答No.15

ANo.11とANo.13です。 >> それでウィルスを作るとかPCを破壊とかは、さらに別の話というか、 >> このような公の場に投稿するには少々論外な話題では…。 そうですね。ごもっともだと思います。 いや,「自分自身を書き換える」とか「自分自身を消す」を延長すると,どうなるのかな? と想像してしまった物でつい書いてしまいました。 すみません。

rouden
質問者

お礼

回答してくれた皆さんのおかげで、参考になるデータがたくさん集まりました。 本当にありがとうございました。

  • taseki
  • ベストアンサー率66% (155/233)
回答No.14

ANo.11とANo.13の補足をさせていただくと、 これは厳密にはWSHです。言語の範疇とは少し違います。たとえばDOSのバッチでも同じことが可能ですし。 皆さんおっしゃっているように、インタプリタならできるものが多いですね。これも同様です。 しかし、差し出がましいですが、それでウィルスを作るとかPCを破壊とかは、さらに別の話というか、それこそCやアセンブラほか出てきた言語のほとんど全てで言えるし、このような公の場に投稿するには少々論外な話題では…。

rouden
質問者

お礼

2回目ですが、ウイルスは作成する気はありませんので・・・。 実際の話、自分、ある「アンインストール用」ソフトで自分のPCファイルを一部壊滅させた過去があるので・・・。 回答ありがとうございました。

noname#35109
noname#35109
回答No.13

#11です。 補足です。 日頃はVBSの方をよく使うので,書きませんでしたが, JavaScriptでもVBScriptとほぼ同様の書き方で,同じ事ができました。 特に工夫は必要なかったです。 ---kakikae.js------------------------- var fso,f; fso = new ActiveXObject("Scripting.FileSystemObject") f = fso.CreateTextFile("A:\kakikae.js", true); f.WriteLine("WScript.Echo(" + "\"" + "私はすでに死んでいます。" + "\"" + ");"); ------------------------------------ VBSと似ていますね,そっくりです。 若干,書き方が違うだけです。 このJSもVBS同様,Aドライブに「kakikae.js」というファイルネームで保存すると,自分自身を書き替えます。 下で書くのを忘れていましたが,パスは A:\ などから始まる絶対パスでなくても良いです。 パスを取って,  CreateTextFile("kakikae.js", true); としても,自分自身を書き替えます。VBSも同様です。 ちなみに,「自分自身を削除」はもっと簡単で, JSの場合, ---sakujyo.js------------------------- var fso,f; fso = new ActiveXObject("Scripting.FileSystemObject") f = fso.DeleteFile("A:\sakujyo.js"); ------------------------------------ で行けます。 やったことはないですが,JSでもレジストリの書き替えなど,かなりハードなこともできそうですね。 ネット上の動作では見ることができない,JSの恐い一面だと思います。 VBScriptもJavaScriptも,本来インターフェイスを持たないスクリプトです。 ボタン操作などGUIな環境で上のような動作をさせるには,HTMLなどインターフェイスが必要です。 でもHTMLに上記のようなスクリプトを貼り付けると,危険すぎてブラウザが拒絶反応をすると思います。 上のようなスクリプトをGUI環境で実行するには,下でも書きましたHTAに貼り付けるのが最も簡単で楽だと思います。 http://www.microsoft.com/japan/msdn/workshop/author/hta/overview/htaoverview.asp 意外と身近に,面白いプログラムがあるものでしょう。

参考URL:
http://wwwroy.hi-ho.ne.jp/mutaguchi/wsh/
rouden
質問者

お礼

身近にあっても、面白いと言うか、恐ろしいと言うか、悩むところです・・・・。 「JScript」のプログラム参考になります。 回答ありがとうございました。

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.12

>実行ファイルを実行中に削除することが、条件によっては可能です。 Dosにdelコマンドを渡す以外で可能なのでしょうか? (コード終了直前にDosコマンドに削除命令を渡して、 直後Dosコマンドから削除されるという方法) ::DeleteFileではアクセス拒否されるのでそれ以外の方法でしょうか? 話が横道にそれてすみません。

rouden
質問者

お礼

ある意味、自分に聞かれても困ります。 回答ありがとうございました(?)。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.10

ちょっとだけ補足。 Windows 2000/XPにおいては、自分自身であるところの実行ファイルを実行中に削除することが、条件によっては可能です。(=できる場合と、できない場合がある。) ただし、実行中に削除できた場合、これも条件によってはその後継続しての実行に支障をきたします。 仕事で調査したことがあるので、これは自信を持っていえます。どんな条件だったか、どんなエラーが出るのだったかは忘れてしまいましたが・・・(すみません)

rouden
質問者

お礼

うわ~残念・・・。 でも、できることがわかっただけでも良いです。 回答ありがとうございました。

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.9

>無いとしたら、なぜ無いのか推測でいいので答えてください 基本的に実行コードを作成するプログラムというのがコンパイラ の事だからです。 しかし、コンパイルする必要の無いインタプリタ言語 例えばperl等を使えば、単にテキストを吐き出すだけでいいので 比較的簡単にできると思います。 またCやJava等でインタプリタ言語のような仕組みを作ることで 可能でしょう。 Windowsの場合ですが、実行ファイルは自分自身の書き換え が可能です。(ちなみに削除は不可) ですから実行ファイルの形式さえ理解していれば C/C++でも、実行部を書き換える事が可能です。 (もちろん、ごり押しで全てアセンブラで書くという方法もあります。) ファイルのフッタ(末尾)に独自に定義したバイトコードみたいなものを 書いてそれを実行部で解析して実行させるという方法が可能だと思います。 この方法だと自分自身が書き換わっているように見えますし C/C++で比較的簡単に作れるでしょう。

rouden
質問者

お礼

>ファイルのフッタ(末尾)に独自に定義したバイトコードみたいなものを書いてそれを実行部で解析して実行させる なるほど、たしかに自分自身が書き換わっているように見えるかもしれない面白い方法ですね。 回答ありがとうございました。

回答No.8

何と言っても、Prolog でしょう。 データとプログラムに区別はありません。 したがって、プログラムをデータとして読み込んで、処理することが可能です。 手続き型でなく、論理型といわれる言語なんで、とっつきにくいかもしれません。 只、問題によっては、他の言語の仕様のレベルを書くだけで、解決できるものもあります。 フリーの処理系は、 http://www.swi-prolog.org/ からダウンロードできます。

rouden
質問者

お礼

「Prolog」ですか・・・。 フリーの処理系をダウンロードしようとしましたが、英語でホームページが読めませんでした(T_T) ちなみに、英語は読めませんが、「C言語」とか「JavaScript」などのプログラム言語は読めますので誤解しないでください。 回答ありがとうございました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.7

Smalltalkもできますね。 全般にインタプリタ型の言語では自己書き換えできるものが多いです。 他の方も書いておられますが、昔のアセンブラのプログラムは自己書き換えするものが多かったです。

rouden
質問者

お礼

「Smalltalk」ですか! 聞いたことがありますが、これまた自分の専門外です。 何はともあれ 回答ありがとうございました。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.6

Windows DLLの「遅延読み込み」は、動的に関数のコール先を書き換えるコードによって実現しています。 「起動時読み込み」のDLLの場合コール先の書き換えはOSがやってくれますが、「遅延読み込み」の場合はこの書き換えを行うライブラリ関数が実行プログラム自身にリンクされており、その関数が書き換えを行うので、全体として見れば「プログラムが自身のコードを書き換えている」と言えなくもないかと思います。 また、「プログラムの書き換え」をもう少し広義にとらえて「プログラムファイルの書き換え」まで含めることにすると、これはもう数え切れないほどたくさんのプログラムが「自分自身であるところのプログラムファイル」を書き換えています。 DOS全盛の頃は、コマンドラインスイッチのデフォルトを変更すると、その内容をEXEファイルに書き込むものが多数ありました。 Windowsになってからも、例えばEXE内のリソースファイルを書き換えるようなプログラムで自分自身のリソースを書き換えれば、やはり同じようなことになります。

rouden
質問者

お礼

「遅延読み込み」とか出てきて、なんかさらに難しくなってきましたが、少し調べてみます。 回答ありがとうございます。

  • Kon1701
  • ベストアンサー率24% (1445/5856)
回答No.5

Lispでもできますね。 あと、アセンブラでやったことがあります。(意図しないでデータを実行してしまうことは無数にありますが) で、そのとき問題になったのがキャッシュです。命令とデータは別のキャッシュにはいります。命令の書き換えはメモリへのデータの書き換えと同じなので、命令キャッシュとは別です。だから、キャッシュをフラッシュしないと書き換え前の命令を実行してしまったりしました。キャッシュのフラッシュ、そのときは全て無効にしていました。部分的なフラッシュが出来なかったのか、時間がかかったのか、ちょっと憶えていませんが。 命令書き換えが行われないのは、これだけが理由ではないでしょうけど。 そういえば、アセンブラの時代、自殺プログラム、というのがありましたね。メモリを全てクリアし、最後には自分自身もクリアしてしまう、というものです。

rouden
質問者

お礼

自殺プログラム -> メモリを全てクリアし、最後には自分自身もクリアしてしまう 危ないプログラムですね・・・。 自分も「BASIC」で同じようなものを作ったことがあります。 回答ありがとうございました。

関連するQ&A

専門家に質問してみよう