ルートアクセス(つまり、/ etc/hostsの変更)やDNSサーバーなしでLinuxのIPアドレスへのマッピングホスト名を定義することは可能ですか?
それはあなたがやろうとしていることに依存します。どちらの場合も、実際には独自のコードを作成する必要があることが保証されているため、プログラマーでない場合は、プログラマーになる方法を学び始めるか、1人の友人がいることを望んでください。
独自のプログラムを作成している場合は、基本的にシステムのDNS解決を完全にバイパスして、自分で行うことができます。
ご覧のとおり、DNS解決はシステム全体のサービスとして提供されますが、(通常は)独自の個別のDNS解決アーキテクチャを作成することを妨げる制限はありません。 DNS解決の実際のアクティビティは、ネットワークを通過する「単なる」IPパケットです。したがって、DNSプロトコルを理解しているが、応答をカスタマイズしたり、カスタムディレクトリのhostsファイルを使用したりできる既存のライブラリを使用するだけです。このアプローチには、「ハック」が不要であるという利点がありますが、欠点は、独自のプログラムを作成する必要があることです。スクリプト言語であるかネイティブプログラミング言語であるかは関係ありません...いずれにしても、作成する必要があります。新しいソフトウェア。このハックを既存のソフトウェア、特にソースコードがないコンパイル済みコードに適用することはできません。
justがDNSメッセージのエンコード/デコードを行うCライブラリの例は、NMAPの libdns です。
書き込みアクセス権がなく、setuid rootであるプログラムを実行している場合は、できません。そのプログラムバイナリを別の場所にコピーして、setuidを削除する場合を除いて、運が悪いです(ただし、プログラムは、setuid rootでない場合、実行を拒否します)。
実行しているプログラムがnotsetuid rootである場合、それは可能であるはずです。あなたがしなければならないことの大まかなストロークは、標準CライブラリのDNS解決関数を実装するライブラリをLD_PRELOAD
し、必要な変更を加えるためにいくつかのカスタム処理を行ってから、認識されないホストをシステムCライブラリの実装に引き渡すことです。通常の」解像度。
LD_PRELOAD
でオーバーライドする必要があるCライブラリ関数は次のとおりです。
gethostbyname(3)
(非推奨ですが、多くのプログラムはまだこれを使用しています)getaddrinfo(3)
getnameinfo(3)
これらの関数の戻り値に任意の変更を加えるとPOSIX.1-2001標準に違反する可能性があるため、これを行うと、特定のプログラムを実際に混乱させる可能性があることに注意してください。 RFC 255 を参照してください。
これを有効にする場合開始するすべてのプログラムに対して、すべてがLD_PRELOAD
で始まるように、LD_PRELOAD
環境変数をシェルまたはログインセッションにエクスポートする必要があります。残念ながら、これはXorg
などのプログラムを除外します。これは(私が信じている)それがsetuidルートだからです。また、vmware-vmx
(VMwareのハイパーバイザーのメインバイナリ)のようなプログラムはsetuid rootであるため、同じ問題が発生します。
LD_PRELOAD環境変数を共有ライブラリに設定すると、Linux上のダイナミックリンカがプリロードされたライブラリのシンボルを読み取るため、このハックが可能になりますbefore他のライブラリからシンボルを読み取ります。したがって、libc.so.6
(Cライブラリの実装)にfoo
というシンボル(基本的には関数シグネチャ)があり、libevil.so
(ライブラリ)にfoo
がある場合、 LD_PRELOAD=libevil.so
を設定すると(フルパスを含める必要があります)、libevil.so
からfoo
が読み込まれるため、起動したプログラムがコードでfoo()
を呼び出すと、libevil.so
が呼び出されます。次に、動的リンカー関数を使用してlibc.so.6
のfoo()
の実装を呼び出すことを(必要に応じて)決定できます-オプション。
コードの低レベルの性質のために、おそらくCでこのハッキングのすべてを行う必要があります。 GLib などのユーティリティライブラリを使用すると、作業が楽になるため、文字列操作や自動的に拡張される配列などの基本的な操作のアルゴリズムを発明する必要はありません。