問題タブ [ld-preload]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 特定の実行可能ファイルのLD_PRELOADとcalloc()の挿入に関する問題
私の前の質問に関連して
私はうまく介入しましたが、もっと問題malloc
があるようです。calloc
これは特定のホストで発生し、内部呼び出しcalloc
の可能性がある無限ループでスタックします。ただし、基本的なテストホストはこの動作を示しませんが、私のシステムの「ls」コマンドは示しています。calloc
dlsym
これが私のコードです:
さて、次のことを行うと、無限ループに続いてセグメンテーション違反が発生します。例:
ただし、インターポーザーをコメントアウトすると、calloc
ほとんど機能しているように見えます。
つまり、「ls」はinit()
2回呼び出されることを意味します。
編集出力からわかるように、次のホストプログラムは正しく機能することに注意してください-init()
一度だけ呼び出され、calloc
正常に挿入されます。
c - LD_PRELOAD、bash、printf
initの属性printf()
を介していくつかの s を実行する共有オブジェクトがあります。ものすごく単純。設定したいくつかの変数を通知するだけです。
printfsが原因でエラーLD_PRELOAD=mylib.so ./program.sh -flags
をprogram.sh
吐き出すと:
その後、プログラムは正常に起動します。printf()
変数のチェックを行うときに、bash スクリプトが s で破損しているようです。
回避策はありますか?
gpl - LD_PRELOADSが非GPLライブラリで許可されているGPLプログラムのinitスクリプトを配布していますか?
一緒に配布することはできますか?
- GPLプログラムとそのソース
- ソースのない非フリーライブラリ
- ライブラリをGPLプログラムにLD_PRELOADSするinitスクリプト
GPLプログラムは、フリーでないライブラリがなくても正常に機能します。この非フリーライブラリは、プログラムバイナリがリンクされているフリーライブラリと同じインターフェイスを提供します。
このようなものを一緒に配布することは許可されていますか、それともGPL違反になりますか?
macos - OSX の LD_PRELOAD とまったく同じものは何ですか?
ライブラリ関数をフックするために使用LD_PRELOAD
していますが、Linux では完全に機能します。しかし、OSXで同等のことを行う方法がわかりません。
Linuxでのセットアップは次のとおりです。
コードは次のとおりです。
次に、次のようにコンパイルします。
次に、次のように実行します。
上記はすべて Linux でうまく機能しますが、これを OSX で機能させるための各ステップに相当するものは何ですか? これをグーグルで検索しましたが、一部の手順の情報が欠落しているため、提供された情報を使用して機能させることができませんでした.
前もって感謝します!
c - HPUX および Solaris の LD_PRELOAD が有効にならない場合があります。
LD_PRELOAD に関する問題が発生します。
HPUX と Solaris で LD_PRELOAD を使用すると、open64/open/creat64/creat 関数を /usr/bin/touch にアタッチできないことがわかりましたが、リンク解除は /usr/bin/rm で有効になります。なぜですか?
私は簡単なテストをしました:
これを行うと、次のことがわかりました。通常、ファイルを開くことはできませんが、タッチするとできます。
なぜ!私は長い間これに戸惑いました. 誰が私を助けることができます.thx
最後に、下手な英語でごめんなさい
c - libfaketime と Mac OS、LD_PRELOAD
Mac OS 10.7.2 を実行し、libfaketimeを実行しようとしても何も起こりません。指示どおりにインストールして実行しましたが、時刻と日付だけがシステムに設定されているとおりに正確に保持されますか? OSXでこれを正常に実行できる人はいますか?
gcc - GNU tar の openat() システム コールをインターセプトする
openat()
経由でロードできるカスタム共有ライブラリを使用して、Linuxでシステム コールをインターセプトしようとしていLD_PRELOAD
ます。例intercept-openat.c
には次の内容があります。
経由でコンパイルしgcc -fPIC -Wall -shared -o intercept-openat.so intercept-openat.c -ldl
ます。次に、この小さなサンプル プログラムを実行すると、次のようになります。
呼び出しは、openat()
ライブラリを介して書き直されます。
ただし、GNU tar では、同じシステム コールを使用していても、同じことは起こりません。
そのため、カスタムopenat()
fromintercept-openat.so
は呼び出されていません。何故ですか?
c - gdbでLD_PRELOADをロードしたダイナミックライブラリの関数をデバッグするにはどうすればよいですか?
動的共有ライブラリlibexecHook.soでいくつかの関数をデバッグしようとしています。このライブラリは、execve()およびその仲間への呼び出しをインターセプトして書き換えるために、LD_PRELOADを設定してプリロードされています。デバッグの目的で、シンボルを使用してgmakeを作成しました。私が他の質問で読んだことから、これはうまくいくはずです:
ブレークポイントが適切に設定されているのがわかります。
しかし、gdbはプリロードされたexec ..()関数で壊れることはありません。実行中にデバッグ出力を見ると、ライブラリ関数が呼び出されていることがわかります。
linux - setuid バイナリを使用した LD_PRELOAD
LD_PRELOAD
setuid パーミッションを持つアプリケーションでライブラリをプリロードするために使用しようとしています。最初に試しLD_PRELOAD
てみたところ、setuid バイナリでは無視されているように見えましたがls
、dir
などで試してみると機能していました。
LD_PRELOAD のドキュメントから:
上記のこのドキュメントに従って setuid パーミッションを使用してライブラリを/usr/lib
、/usr/local/lib
、およびに配置しようとしましたが、まだ機能していないようです。/usr/lib64
setuidLD_PRELOAD
を使用して標準ディレクトリにライブラリがある場合にパスを指定しないと、ライブラリが見つからないように見えます。パスを指定しても、何もしません。
setuid バイナリは、root 以外のユーザー シェルで実行される root 権限バイナリです。何かご意見は?パスや環境変数が欠落しているのか、上記のドキュメントを誤解しているのかわかりません。
編集: 要求された権限は次のとおりです。
としょうかん:
アプリ:
multithreading - LD_PRELOADとスレッドセーフを使用してスレッドを挿入します
LD_PRELOADを使用してプログラムに共有ライブラリを挿入するプロジェクトに取り組んでいます。
挿入されたライブラリは、プログラムに挿入されたときに新しいスレッドを作成します。すべてのロジックはこのスレッドで発生します(ネットワークトラフィックの分析など)。
まず、プリロードされているプログラムについてこれを知る必要があります。これは、静的バッファーに書き込まれ、サーバーに送信されるすべてのパケットを暗号化するクライアントアプリケーションです。クライアントでパケットを暗号化して送信する機能を見つけ、迂回することができました。これで、静的バッファーを変更し、「send」関数でバッファーを暗号化してサーバーに送信することができます。
しかし、今私は問題を抱えています:ライブラリのスレッドの静的バッファの内容を変更し(偽のパケットを送信できるようにするため)、同時にプログラムのスレッドも静的バッファを変更するとどうなりますか?それはクラッシュを引き起こすでしょう。
ある種の同期が必要です。
だから私はいくつかの解決策を考えてきました:
- バッファを変更するプログラム内のすべての関数を見つけ、それらを迂回して、その呼び出しなどにミューテックスを追加します。でも何年もかかるだろう...
- バッファを変更する私のコードを1つのブロックで実行する方法を見つけてください。したがって、私のコードは、POSIXスレッドが他のスレッドに切り替わることなく、実際に一度に実行されます。これも可能ですか?
- 私のアプリケーションを同期させて泣いてください。
誰かがより良い解決策を思い付くことができますか?または、ソリューション2を可能にする方法を知っていますか?
よろしくお願いします、ギリス