C言語関係掲示板

過去ログ

No.412.自己解凍書庫を作るプログラム

[戻る] [ホームページ]
No.2856

実行ファイルの後に付いているデータ
投稿者---HyperBeat(2002/10/05 04:28:03)
http://hyper-beat.escape.to/


実行ファイルの最後にファイルデータを付けたいのですがどうすればいいのですか?
また後で付けたデータを取り出すにはどうすればよいのですか?

No.2859

Re:実行ファイルの後に付いているデータ
投稿者---ともじ(2002/10/05 11:54:32)


>実行ファイルの最後にファイルデータを付けたいのですがどうすればいいのですか?
>また後で付けたデータを取り出すにはどうすればよいのですか?

ひょっとするとこれは、実行ファイル自身の最後尾に特定のファイル
データを挿入したいということでしょうか。
もしそうであれば、それは危険ですので仕様を変更した方が
よろしいのではないでしょうか。


No.2860

Re:実行ファイルの後に付いているデータ
投稿者---とおり(2002/10/05 19:11:11)


横からすいません。
Windowsプログラムのリソースのように、これができると便利かも、と私も思っていました。
テストしてみたところ、実行時に自分自身をファイルとして開くことはできました。
ですが、危険という言葉が気になります。
ちょっと思いつかないので、理由を教えていただけないでしょうか。


No.2861

Re:実行ファイルの後に付いているデータ
投稿者---ともじ(2002/10/05 20:41:44)


こんばんは。

>Windowsプログラムのリソースのように、これができると便利かも、と私も思っていました。
>テストしてみたところ、実行時に自分自身をファイルとして開くことはできました。
>ですが、危険という言葉が気になります。
>ちょっと思いつかないので、理由を教えていただけないでしょうか。

危険という言葉は予測不可能なことが起こるかもしれません、
という意味で使いました。

実行ファイルは全てがメモリにロードされているという保証はなく、
実行中にディスクに一部が置かれている可能性があります。
その場合、ディスクに置かれている実行ファイルの中身が書き換わり、
そのままロードされたら、どのような処理が行われるかわかりませんよね。
ファイルに書き込んだ内容がテキストデータであっても、バイナリデータ
としてみた場合に、システムに致命的なエラーを与える内容が含まれて
いないとも限りません。
実行ファイルは、コンパイラとリンカがきちんとした機械語に翻訳した
結果ですので、むやみに変更などすべきではないと考えます。



No.2863

Re:実行ファイルの後に付いているデータ
投稿者---HyperBeat(2002/10/06 00:22:36)
http://hyper-beat.escape.to/


よくわからないのですが? 危険???

私がしたいのは自分が作った書庫形式の自己解凍書庫を作るプログラムを作りたいのです。ZIPの自己解凍書庫みたいに

No.2865

Re:実行ファイルの後に付いているデータ
投稿者---ともじ(2002/10/06 02:46:55)


>私がしたいのは自分が作った書庫形式の自己解凍書庫を作るプログラムを作りたいのです。ZIPの自己解凍書庫みたいに

最初の書き込みからはそのようには読み取ることができませんでした。
実行中のファイル自身を書き換えるのだと理解し、あのように返信
しました。
とりあえず、書き込みの意味はわかりました。

経験はなかったのでテストしてみましたが、以下のようにすると、
実行ファイルを2つ連結し、更に分解できるようです。

1. まず、実行形式ファイル1を作成します。
2. 次に実行ファイル2を作成します。内容は、自分自身を読み込み、
 元の自分のサイズ分fseekし、その先をファイル3として書き出すものです。
3. 最後にファイル2の後ろにファイル1を追加書き込みするプログラムを
 作成します。このプログラムを実行し、ファイル2の後ろにファイル1
 を追加します。
4. 実行ファイル2を実行します。これで、元の実行ファイル1と同じ
 内容のファイル3が作成されます。

一応、テストプログラムを提示します。

/* test1.c ファイル1 */
#include <stdio.h>

int main(void)
{
	printf("Hello world\n");
	
	return (0);
}

/* test2.c ファイル2 */
/* コマンド入力で元のファイル2のサイズを入力する */
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
        FILE *wfp, *rfp;
        char buf[256];
        int  n;

        if((rfp = fopen("test2.exe", "rb")) == NULL ) {
                printf("ファイルオープンエラー\n");
                exit(1);
        }
        if((wfp = fopen("test3.exe", "wb")) == NULL ) {
                printf("ファイルオープンエラー\n");
                exit(1);
        }
        
        fseek(rfp, atol(argv[1]), SEEK_SET);

        while ( (n = fread(buf, sizeof(buf[0]), 256, rfp)) > 0) {
                fwrite(buf, sizeof(buf[0]), n, wfp);
        }

        /* ファイルクローズ */
        fclose(rfp);
        fclose(wfp);

        return(0);
}

/* ファイル連結プログラム */
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        FILE *wfp, *rfp;
        char buf[256];
        int  n;

        if((rfp = fopen("test1.exe", "rb")) == NULL ) {
                printf("ファイルオープンエラー\n");
                exit(1);
        }
        if((wfp = fopen("test2.exe", "ab")) == NULL ) {
                printf("ファイルオープンエラー\n");
                exit(1);
        }
        
        while ( (n = fread(buf, sizeof(buf[0]), 256, rfp)) > 0) {
                fwrite(buf, sizeof(buf[0]), n, wfp);
        }

        /* ファイルクローズ */
        fclose(rfp);
        fclose(wfp);

        return(0);
}


No.2874

Re:実行ファイルの後に付いているデータ
投稿者---HyperBeat(2002/10/06 23:53:22)
http://hyper-beat.escape.to/


わかりずらい質問ですみませんでした
サンプルを使ってみたところtest2.exeが強制終了してしまいました
test3.exeを実行するとWIN32 アプリケーションでないといわれました
なぜ強制終了するかは私にはわかりません

No.2875

Re:実行ファイルの後に付いているデータ
投稿者---ともじ(2002/10/07 01:03:15)


こんばんは。

>サンプルを使ってみたところtest2.exeが強制終了してしまいました
>test3.exeを実行するとWIN32 アプリケーションでないといわれました
>なぜ強制終了するかは私にはわかりません

これらのテストプログラムは実行形式をDOSプロンプトから実行
させてください。なお、test2はtest3を実行する前に
プロパティで大きさを調べ、test3実行後にコマンドラインから
その大きさを指定する必要があります。
なお、自己解凍形式のファイルがこのような作りであるという
確証はありません。力不足ですみません。

No.2867

Re:実行ファイルの後に付いているデータ
投稿者---とおり(2002/10/06 03:26:22)


返信ありがとうございます。

試してみたら、実行中のファイルは書き込みモードでは開けないようです。
WindowsAPIでのオープンや他のOSは試してませんが、たぶん開けないような気がします。
他にも書き換える方法があるんでしょうか?

あと、HyperBeatさんのやろうとしているZip自己解凍を、圧縮レベル0で見てみました。
SFX32GUI.DATという解凍実行コードと思われるファイルがあるのですが、
これに、前後にディレクトリ情報等と思われるコードを追加した
圧縮対象のバイナリを連結しているようでした。
これだけ普及してるんだからこれが危険ということはないように思います。

それに思ったのですが、実行ファイルを書き換えるという状況は意図的な場合しかない気がします。
意図的であれば、メモリに読み込み済みのデータも書き換えることができると思います。

と、ここまで書いたところでともじさんの新しい書き込みを確認しました^^;

実行コードを書き換えるわけじゃなく、Windowsプログラムのリソースのような使い方なら
大丈夫ということでしょうか?

自分の疑問を書いただけで、攻撃してるわけじゃありません^^;


No.2868

Re:実行ファイルの後に付いているデータ
投稿者---ともじ(2002/10/06 13:21:37)


こんにちは。

>試してみたら、実行中のファイルは書き込みモードでは開けないようです。

MS-DOS版のCではwモードでオープンできるのです。試したのは、LSIC試食版
と、DOS版のTurbo-C++です。

>これだけ普及してるんだからこれが危険ということはないように思います。

自己解凍形式などは問題ないでしょうね。自己解凍形式のファイル構造に
ついては知識がないのでいろいろと検索してみたのですが、詳しいことを
書いたページには出会えませんでした。検索が下手なのかもしれませんが。

>それに思ったのですが、実行ファイルを書き換えるという状況は意図的な場合しかない気がします。

最初にそう解釈したので、ちょっと過剰に反応してしまいました。
そんなこと、しちゃあいけないって。

>実行コードを書き換えるわけじゃなく、Windowsプログラムのリソースのような使い方なら
>大丈夫ということでしょうか?

どうでしょう?
実は、No.2865のやり方に確証があるわけではなく、やってみたら
できたというだけなのです。自分で書いておいて申し訳ないのですが、
私自身納得できていないやり方です。
自己解凍形式のファイルがどういう構造なのかご存知の方、サポート
してください。

>自分の疑問を書いただけで、攻撃してるわけじゃありません^^;

そりゃあ、もう、そんな風に感じてなどはいません。
私の方こそ、少々力んでいたような気がします。お許しを。