問題タブ [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.

0 投票する
0 に答える
189 参照

c++ - is there any way to load shared library dynamically without using LD_PRELOAD?

Im working with C++ application. I want to load my shared library to be loaded before any shared library loaded to my application.

One way is to use LD_PRELOAD in the code. But is it possible to do above scenario without using LD_PRELOAD?

0 投票する
2 に答える
2710 参照

c - Cで関数を隠す

関数 f1 を持つアプリケーションがあります void f1 ()

さらに、を使用してロードするライブラリがありますLD_PRELOAD

ライブラリにはいくつかのコード ファイルといくつかのヘッダー ファイルがあり、.so ファイルにコンパイルされます。

ヘッダー ファイルの 1f1つでも、上記と同じ署名で名前が付けられた関数が使用されます。最新のf1ものはライブラリでのみ使用されます。(静的メソッドには変更できません)

問題は、アプリケーションのライブラリ オーバーライドから(を使用してLD_PRELOAD)ライブラリをロードするときです。f1f1

f1ライブラリにのみ表示されるようにライブラリを構成する方法はありますか?

0 投票する
2 に答える
4508 参照

c++ - LD_PRELOAD を使用して dlsym 呼び出しをインターセプトするにはどうすればよいですか?

アプリケーションの dlsym への呼び出しをインターセプトしたい。dlsym をプリロードし、 dlsym 自体を使用して実際のアドレスを取得するように .so 内で宣言しようとしましたが、明らかな理由でうまくいきませんでした。

プロセスのメモリ マップを取得し、libelf を使用して、読み込まれた libdl.so 内の dlsym の実際の場所を見つけるよりも簡単な方法はありますか?

0 投票する
1 に答える
466 参照

linux - LD_PRELOAD の値がスタックにある理由

私はバッファ オーバーフローを研究し、いくつかのウォーゲームを解決しています。メインの戻りアドレスを除いて、バッファの上のすべてのスタック メモリが 0 に設定されるという問題がありました。これは次のようになります。

そのRETを上書きできます。そこで、この問題を解決するためのヒントをいくつか見つけました。LD_PRELOAD を使用することでした。LD_PRELOAD の値は、スタックの環境変数領域だけでなく、スタックのどこかにあるという人もいます。そこで、LD_PRELOAD を設定して検索し、gdb を使用して見つけました。

あります!これで、LD_PRELOAD の値がバッファの下のスタックにあることがわかり、悪用できるようになりました!

しかし、なぜ LD_PRELOAD がそのメモリ アドレスにロードされるのだろうか。値はスタックの環境変数領域にもあります!

これの目的は何ですか?ありがとう。

0 投票する
3 に答える
3104 参照

java - 既存の Java アプリケーションの SO_KEEPALIVE

一定の非アクティブ状態の後にファイアウォールが接続をドロップするため、既存の商用 Java アプリケーションで SO_KEEPALIVE をアクティブにする必要があります。私はソース コードを所有していないので、変更できません (ソースがあれば、 socket.setKeepAlive(true) を追加するだけでかなり簡単になります)。だから私はいくつかの選択肢を探していました:

  • 最初に libkeepalive.so ( http://libkeepalive.sourceforge.net/ ) で作業しようとしました。これを LD_PRELOAD に入れると、telnet や nc などで機能するようですが、jrockit jvm で使用すると、この LD_PRELOAD は完全に無視され、SO_KEEPALIVE なしですべてのソケット オブジェクトがまだ作成されている

  • 次に、すべての TCP 接続に対してデフォルトでこの SO_KEEPALIVE をアクティブにするオプションがあるかどうか、OS レベルで検索しようとしました。残念ながら、redhat 6 エンタープライズにはそのようなオプションはありませんが、freebsd (net.inet.tcp .always_keepalive)

  • この機能を追加するためにLinuxカーネルにパッチを当てることは、私のシステム管理者にとって大きな問題でした;)

  • Java コマンド ライン引数の検索に失敗しました

  • 最後のオプション: setOption(SocketOptions.SO_KEEPALIVE, Boolean.valueOf(true)); を追加して、既存の JVM の java.net.PlainSocketImpl にパッチを適用します。保護された同期された void create(boolean stream) メソッドで、-Xbootclasspath/p を介して rt.jar の前に配置します

この最後のオプションはこれまでのところ機能していますが、このために JVM を変更する必要があったため、少しイライラしています。このような問題に対処するための他の/より良い方法を知っている人はいますか? すべての (Java) アプリケーションでデフォルトで SO_KEEPALIVE を有効にする別の簡単な方法がないのはなぜですか?

最後の質問: java API で serverSockets オブジェクトに keepAlive を設定できないのはなぜですか? Socket オブジェクトでのみ可能ですが、実際には serverSockets でも機能します

0 投票する
1 に答える
1104 参照

linux - Linux x86 で backtrace() を呼び出すときのセグメンテーション違反

私は次のことをしようとしています - pthreads ライブラリのラッパーを書き、各 API が呼び出されるたびに情報をログに記録します。記録したい情報の 1 つは、スタック トレースです。

以下は、そのままコンパイルして実行できる元のコードの最小限のスニペットです。

初期化 (ファイルlibmutex.c):

ラッパーとバックトレースの呼び出し。メソッドから可能な限り切り刻んだので、たとえば、元の pthread_mutex_lock を決して呼び出さないことはわかっています。

これをテストするには、次のバイナリ (ファイルtst_mutex.c)を使用します。

これがすべてコンパイルされる方法です:

そして走る

これは、Linux x86 ではセグメンテーション違反でクラッシュします。Linux PPC では、すべてが問題なく動作します。GCC コンパイラ、GLIBC ライブラリ、および Linux ディストリビューションのいくつかのバージョンを試しましたが、すべて失敗しました。

出力は

ここに再帰があることを示唆しています。ソース コードを確認しましたbacktrace()-ロック メカニズムへの呼び出しはありません。スタック フレームのリンクされたリストを簡単に確認するだけです。また、objdump を使用してライブラリ コードをチェックしましたが、異常なことは何も明らかになりませんでした。

ここで何が起きてるの?解決策/回避策はありますか?

ああ、そしておそらく最も重要なこと。これは pthread_mutex_lock 関数でのみ発生します!! 他のオーバーライドされた pthread_* 関数からのスタックの出力は問題なく動作します...

0 投票する
1 に答える
130 参照

linux - 依存関係のあるライブラリを dlopen する

dlopen (RTLD_NOW を使用) を呼び出して、実行時にフル パスが指定されているライブラリを動的にロードするプログラムがありますが、プログラムが最初に実行されたときは不明です。指定されたライブラリーは、別の .so ファイルに対して動的にリンクされました。このファイルの場所も、プログラムが開始されるまでは不明ですが、dlopen が呼び出される前に判明しています。このシナリオを機能させる方法について何か考えはありますか? ありがとう!

0 投票する
2 に答える
1629 参照

c - LD_PRELOAD と clone()

私はいくつかの呼び出しをインターセプトするために私が作成したライブラリで LD_PRELOAD を使用してプログラムを実行するスクリプトを使用していますが、うまく機能しますが、ある時点でプロセスが clone() を呼び出し、次のものをインターセプトする能力を失います (プログラムが実行されます)再び私のライブラリなしで)、これを克服する方法はありますか? コールは

clone のパラメーターを調べると、子プロセスもトレースできることがわかりましたが、プリロードに関するものは何もありません。

また、特定のファイル記述子のすべての呼び出しをインターセプトしようとしており、プロセスがファイル記述子を複製するため、複製するフラグがなくてもやりたいことができるかどうかさえわかりません(問題は私です全部はわかりません)。

更新:これを使用して、qemu-dm(xenによって実行される)によって行われたすべてのアクティビティをログに記録しようとしています

でコンパイルgcc -ggdb -shared -fPIC -Wl,-init,__init__ -Wl,-fini,__fini__ -o fileaccesshooks.so -ldl fileaccesshooks.c

ラッパー スクリプトの内容:

以下のコメントで見られるように、環境は実際にはタスクとプロセスで同じです (LD_PRELOAD は /proc/8408/task/8526/environ と /proc/8408/environ の両方で同じです)。データが記録されます grep -e "testfile" -e "(11" /tmp/out-0

これは私が得たものですがstrace -f、同じ実行可能ファイルでの実行の出力には、シークだけでなく読み取りも比較的多く含まれています