揮発性のメモ2

http://d.hatena.ne.jp/iww/

プロセス名を変更する

ps axなどで見れるのは、プロセス名でなく起動時のコマンドライン文字列である。/proc/プロセスID/cmdlineで見れる。
プロセス名は、/proc/プロセスID/statusで見れる。

別のプログラムを、コマンドライン文字列を偽って実行する

プロセス名はごまかせないが、psで見たときの画面をごまかせる。

int main()
{
    char *newargv[] = { "GRADIUS", "-b", NULL };
    char *command = "/usr/bin/top";
    execve( command, newargv );
    return 0;
}

指定したプログラムを別名に見せかけて起動する。
psで見ると別名に見えるが、プロセス名を確認するともとのまま

自分のプロセス名を偽る

#include <sys/prctl.h>
int main()
{
    prctl( PR_SET_NAME, "GRADIUS" );
    for(;;) sleep(1);
}

プロセス名を変更できる。
コマンドラインはそのままなので ps での見た目は変わらない

自分のコマンドラインを偽る

超インチキな手段を使用する

#include <string.h>
int main( int argc, char *argv[] )
{
    strcpy(argv[0],"GRADIUS");
    for(;;) sleep(1);
}

コマンドライン文字列を直接変更する(当然ぶっ飛ぶ可能性がある)
プロセス名変更と組み合わせればなお良し

killallコマンド

killallコマンドで殺したいプロセス名を指定する。
しかし、/ を含む文字列を指定すると、殺したいファイル指定になる。
a.outを実行したあとにそのファイル名をhogeに変更した場合、
killall ./hoge
と指定すればちゃんと殺せる。わら人形に入れる髪の毛みたいな感じ。

pkillコマンド

pkillコマンドで検索する対象はプロセス名
しかし、-fオプションを使うと、コマンドライン文字列を対象にできる
正規表現での指定なので、短い名前のプログラムを殺すときには ^と$でくくるなどの注意が必要