• ベストアンサー

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

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

  • rouden
  • お礼率92% (121/131)

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

  • ベストアンサー
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

  • BASIC言語のプログラムについて

    もし条件が成立したら、行番号の○○から○○までを実行するというようなプログラム、 つまり、GOTOのように指定した行番号に飛んでしまうだけで元の行に戻らないのではなく、指定した行番号からある程度の行までを実行したら、その命令をした次の行から実行するようなプログラムはどのように作れば良いのでしょうか。 一応、調べてはみたのですが、自分でも何と言えば良いのかあまりわからないということもあり、見つかりませんでした。 BASIC言語初心者ということもあり、わかりにくい説明かもしれませんが、お願いします。

  • Javaのプログラムから、C言語のプログラムを呼び出す方法

    こんばんわ。 もうすぐ2008年もおしまいですね。 本日お聞きしたいのは、タイトルの通り、 Javaで書いたプログラムで、C言語のプログラムを呼び出し、 実行するプログラムはどのように書いたらよいかということです。 実際に行いたい内容は以下の通りです。 ・JavaからC言語で書かれたNN.exeを呼び出し、実行する。 です。 どのようなプログラムで呼び出すことができるのでしょうか。 あまりプログラムの知識がなく、説明に不備がありましたらすいません。 お力添え、宜しくお願いいたします。

  • プログラム言語について・・・

    レポートをやっているのですが分からなくて・・・ ベンチマークテストで使用されるプログラムは「      」で書かれ、いろいろな機種で実行可能です。 この問題に空欄のところです。 プログラム言語をいれればいいのでしょうか?

  • プログラム言語の覚え方

    こんばんは、お世話になります。 私は、いつもプログラム言語の例題を勉強するときは、 まずそのプログラムの仕組み、動作や意味などを理解して 覚えてようとするのですが、 それも一つなのですが、 やっぱりその例題自体を暗記して覚えたいのですが、 何か覚えるのにいい方法はないでしょうか? ご教示お願いします。

  • プログラムの言語について

    プログラムの言語について 私は今プログラムの勉強をしてるんですが 自分はどんな言語からいこうかと思っています 私は将来的にコンピュータ関係の仕事をしたいと思っています といってもソフト開発かゲームプログラマーとか細かいことはまだ考えていないんですが そんなことも考えて 今は、プログラムの構造を理解するために言語を勉強すれば良いのか それとも、将来役に使う見込みのある言語を勉強すればいいのかわかりません わたしはHSPという言語?をつかってゲームを作ったりしています なの、変数の定義などあまり細かいことはわからなくても プログラムがどんなのかというものはちょっとわかります そもそも、言語が変わることで、”どうすればいいの~~”くらいに変わるものですか? あと、言語にはいろいろありますが、個々にどんなことに特化しているなどのことはあるでしょうか また、お勧めの言語などがありましたら、使いやすい(あなたが使っていて満足な)エディタなどあれば ご紹介よろしくお願いします

  • C言語のプログラム集

    こんにちは。C言語のテキストにはプログラムとその説明が書いていますが、 このC言語のプログラムが多くのっているような本はありますか?本屋さんで探したのですが、プログラムがものすごく多くのっているようなものがなかったので、もしお分かりの方がおられましたが、本の紹介をお願いします。

  • windows自体のプログラム言語

    ウィンドウズ自体もプログラム言語によって作られていると思うのですが ウィンドウズ自体はどういうプログラム言語で書かれているのですか? ご存知の方ご回答よろしくお願い致します。

  • C言語プログラムを用いた画像表示プログラム

    おはようございます。 お時間ありましたら、ご教授よろしくお願いいたします。 C言語を使って、画像の表示、画像の処理ができるプログラムを作成したいのですが、私自身、JAVAを少しかじった程度の知識しかなくなかなかうまくいきません。 やっかいなことに、ただ画像を表示させるだけでなく、JPEGライブラリを用いた(JPEG画像を読み込んで処理できる)C言語プログラムのプログラムを作成したいのですがうまくいかずご質問させていただきました。 参照できるサイト、ご自信の作られたプログラム、プログラムを経験されている方の記述など教えていただければ幸いです。 明確な質問ではないのでご回答が非常に難しいと思いますが、よろしくお願いいたします。 早朝からお忙しいと思いますが、お時間がありましたら是非ご教授よろしくおねがいします。

  • ラダープログラムはプログラム言語ですか

     制御盤の制御では、シーケンサ(PC)を使って専用ラダーソフトで作成されることが多いのですが、これもプログラム言語の一種でしょうか。  また、C言語などの構造化に適したプログラム言語にくらべて、ラダーソフトは規模が大きくなると非常に見にくくなります。 それでも、このスタイルのプログラミングが支持されてているのは、なぜでしょうか?

  • VBAと似たプログラム言語を教えてください。

    仕事場ではエクセルVBAを使い簡単なプログラムを作ってエクセルをいじっているのですが、自宅にはofficeがありません。 自宅でも似たようなプログラム言語を使って簡単な個人用アプリケーションを作りたいのですが、何か良い言語はないでしょうか? 言語、フォーム作成、共にわかりやすいのがあればいいのですが。

専門家に質問してみよう