• ベストアンサー

txtとして破綻なく読めるexeファイルは作れるか?

タイトルどおりですが分かりにくいと思いますので説明します。 ここにあるtxtファイルがあるとします。 そのファイルはtxtファイルとして正常に開くことができ、再保存してもファイル内容が壊れることはありません。 そしてそのファイルの拡張子をtxtからexeに変更するだけで、実行可能で、何らかの動作をします。 …と、このようなファイルを作ることは可能か? ということが質問です。 制御文字の文字コードに相当する機械語を使わずに実行可能形式のファイルが作れるか? と言い換えることもできます。 文字コードはUnicodeやShift_JISなど一般的なものであればなんでも構いません。 また、もし無理なら最低で何バイト書き換えれば実行可能になるファイルが作れますか?

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10359)
回答No.9

他の方が書いている通り、exeは無理ですが、comでいいなら、任意のcomファイルに対してcom2txtを使えばテキストと改行だけからなるcomファイルが出来ます。 http://www.vector.co.jp/soft/dos/util/se004841.html 確かASCIIの英数字と若干の記号だけしか使ってなかったと思います。

SortaNerd
質問者

お礼

回答ありがとうございます。 もうあったんですね。 仕組みをじっくり調べてみます。

その他の回答 (8)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.8

Unicode でいいとすると, 実質的に C800~CFFF 以外は全部使っていいことになるのでかなり反則っぽい気がするんだけど.... ちなみに MS-DOS (や Windows) は拡張子に騙されない (実際にファイルの中身を見る) ので「拡張子は exe だけど実際には com」というフォーマットでファイルを作ることができます. で com モデルを使うと「何もしない」最短のプログラムは int 20h, つまり機械語に直すと CD 20 になります. これは Shift_JIS で解釈すると「半角かたかなのヘ」+「半角空白」.

SortaNerd
質問者

お礼

回答ありがとうございます。 >Unicode でいいとすると, 実質的に C800~CFFF 以外は全部使っていい そんなに多いのですか。未定義部分などもう少しあった気もしますが…。 >拡張子は exe だけど実際には com そんなことができたのですか。してみるとNo3さんのa\nも実際はcomとして動作していたわけですね。 610D0Aで…POPして即値とレジスタをOR。あまり意味のある動作ではありませんね。 >int 20h こんなに簡単にできるんですね。ためしに作ってみました。 次はもう少し意味のある動作をするものを作ってみたいと思います。

  • furyfox
  • ベストアンサー率56% (58/103)
回答No.7

>バイト数を書いてあるだけでうまい値を当てはめればテキストで >読める部分だけでかけそうな気がしてしまいます。 実行対象のCPUの情報等も入っています。 例えばIntel386以降だと 0x014cとか入っています。(この0x01が表示できないと思います) 他にもセクション数、作成日時、ビットフラグがたっていたりします。 それに実行部は純粋な機械語なのです。 そこにはニーモックやアドレス、レジスタ等の情報が指定されているわけですが txtで見れるコードだけでは無理です。 どらぐらいの割合で非印字コードが含まれるかは プログラムの種類による影響が大きいのでわかりません。 BASE64等を使って意図的に割合の大きいプログラムは作れるでしょうが それでもデコード部分は機械語ですから。

SortaNerd
質問者

お礼

回答ありがとうございます。 なるほど、CPU名はどうしようもないですね。セクション数は適に数を合わせて作成日時はデタラメを書いても、ビットフラグが鬼門ですね。 >txtで見れるコードだけでは無理です。 >それでもデコード部分は機械語ですから。 まあ自分としてもあまり可能性が高いとは思っていませんが、試してみもせずに否定されるのはあまり納得がいきません。 …と思っていたらNo9さんのソフトで可能なようですよ。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.6

★回答者 No.1、No.3 です。 ・バッチファイルで思い出しました。  バッチファイルの先頭に機械語の16進ダンプ(数字文字列)を追加して、拡張子を  『com』や『exe』にすると実行できたような事を思い出しました。ただし、昔の  MS-DOS という OS 上で動く場合で Windows の OS でどうなるかは分かりません。 ・また、その方法も『なぜ?』この16進の数字列をバッチファイルの先頭に『:』文字で  コメントアウトしているのに動くの?と不思議でした。→よって詳しい仕組みが全く  分かりません。→『過去に経験しました』という事なので、こちらの路線で調べてみたら  何か発見できるかも…。 最後に: ・上記の仕組みが分かっても Windows 上で動作するかどうかは不明です。 ・また、基本的にテキストとして読める文字コード部分(機械語)だけで『exe』の実行可能  ファイルが出来るとは思えません。単なる好奇心で出来そうか、どうかという事ならば  私は『無理じゃないの?』とアドバイスします。 ・以上。おわり。→今後の参考意見として下さい。

SortaNerd
質問者

お礼

>バッチファイルの先頭に機械語 興味深い情報をありがとうございます。その機械語の内容が分からないことには何とも言えませんが、バッチファイルも奥が深いものですね。

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.5

OSとして何を使用するかの条件がついていないので..... LinuxやUNIX等のUNIX系OSでは、拡張子のEXEは実行 モジュールとしての意味を持たないので、拡張子に EXEを使ったスクリプトを作れば、テキストのみで 実行形式のファイルが作れますが?

SortaNerd
質問者

補足

すいません。Windowsを考えています。 また、スクリプトのようなものではなく、純粋に機械語で書いてあるにもかかわらずテキストとしても読めてしまうようなものを求めています。

  • furyfox
  • ベストアンサー率56% (58/103)
回答No.4

無理です。 exeはPEフォーマットと呼ばれるフォーマットですが txtファイルで(メモ帳)で見れるということは 全てのバイナリがアスキーコードの英数字及び記号 と SJISのコードのみで 構成されなければならずPEフォーマットのヘッダからして既に無理です。 詳しくは「PEフォーマット」で検索してください。 (変換しても良いのならBASE64にすれば可能ですけどね) >また、もし無理なら最低で何バイト書き換えれば実行可能になるファイルが作れますか? それは元の実行ファイルのサイズにもよります。 半分ぐらいは書き換えになると思いますが。 もし掲示板やメール等でテキスト文書としてexeファイルを送りたいとかなら 上記に書いたとおりBASE64で可能です。

SortaNerd
質問者

お礼

回答ありがとうございます。 PEフォーマットのヘッダを調べてみましたが、バイト数を書いてあるだけでうまい値を当てはめればテキストで読める部分だけでかけそうな気がしてしまいます。 >元の実行ファイル 少々勘違いされているようですが、特に元のファイルというものがあるわけではなく、なるべく印字可能文字だけで書けるコードを作ったときにそのコードに非印字可能文字がいくつ含まれているかという質問です。 実行する動作は文字を表示するなりファイルを作成するなり、何らかの確認可能な動作をすればOKです。 >もし掲示板やメール等でテキスト文書としてexeファイルを送りたいとかなら そういうわけではありませんが、BASE64というのも面白そうですね。 BASE64のデコードプログラムが書ければどんなプログラムでも作れますし。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★よくは分かりませんが、最低『3バイト』で何かが出来ました。 ・メモ帳を開き『a』という1文字と改行を入力します。→『3バイト』  そして適当にテキスト・ファイルに保存して下さい。 ・それで拡張子を『.exe』にリネームすると見た目上は MS-DOS アプリケーション用の  アイコンに見えます。ダブル・クリックするとすぐに画面が消えてしまいます。 ・そこで『コマンド・プロンプト』を起動してから実行します。  実行すると私の環境では『KKCFUNC が組み込まれました.』というメッセージとともに  『マイクロソフトかな漢字変換 バージョン 2.51』となり、プロンプト入力待ちになりました。  その後、普通にコマンド入力可能になります。→このとき、プロンプトのパスがロング  ネームからショートネームに代わりました。  ロングネーム『C:\Documents and Settings\(ユーザ名)\My Documents\My HomePage』  ショートネーム『C:\DOCUME~1\(ユーザ名)\MYDOCU~1\MYHOME~1』 ・なお、ファイル内容は『a』~『e』の5文字を試しましたが、実行後にエラーが出なかったのは  『a』文字だけでした。→『f』~『z』や『A』~『Z』を試したら何か発見できるかも知れませんね。 ・以上。よく分かりませんがこの回答は『3バイト』かな?

SortaNerd
質問者

お礼

回答ありがとうございます。 不思議な現象ですね。ただそれは本当に実行ファイルができているのか疑わしいと思います。 たったの3バイトでできる命令は限られています。起こったことの大半はその命令とは関係ないところで起こっているものと思います。 ただ、このような現象がテキストで、しかもたった3バイトで引き起こされるというのは非常に興味のあることです。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

拡張子がbatなら、このような実行可能なファイルは出来ますが、exeでは、出来ないとおもいます。 私は、今まで、exeの場合、テキストファイルとして読めるものは、作れない、と考えていました。又、それが、特に問題になることもありませんでした。むしろ、質問者様が、どうしてこのような質問をされたかに、非常に興味があります。差し支えなければ、その理由を教えていただけませんでしょうか。

SortaNerd
質問者

補足

そういえばbatもありましたね。さすがにbatではあまり面白くないので対象外にします。 そもそもbatではあまり自由なコードが書けないですよね。 質問理由ですが、単に好奇心からです。 普通に考えたらtxtとして読めるexeなんて作れるとは考えもしませんが、それができたらちょっと面白いのではないか、と。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★無理だと思いますが…。 ・『exe』の実行可能ファイルは、EXEヘッダというバイナリ部分が必ず必要ですので、  テキストとして読めるようなコード部分ではありません。ですので、この質問に対する  回答は不可能な事だと思います。 ・昔、『com』の実行可能ファイルがあったころ、テキストの文章に数バイトの機械語を  追加するだけで実行可能ファイルな『com』に出来ました。拡張子を『com』にすれば  確かに実行されました。→これは、『com』モデルが『exe』形式のようにバイナリ部分の  ヘッダが特にないため、テキスト文章の先頭に数バイトの機械語コードを付加するだけで  実行可能なファイル『com』に出来たのです。→『exe』では無理だと思います。 ・以上。参考までに。→機械語コードの部分はやっぱりバイナリですよ。

SortaNerd
質問者

補足

comについてはあまり知らなかったのですが、どうやらexeより作りやすそうですね。実行できるなら別にexeでなくとも構いません。 >機械語コードの部分はやっぱりバイナリですよ。 ですから、テキストで読める機械語だけを使って何か意味のあるコードが書けないかと言っているんですが。

関連するQ&A

専門家に質問してみよう