問題タブ [function-interposition]
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 - dlsymを使用しないLinuxでの関数の挿入
私は現在、いくつかのシステムコールと、、、などの低レベル関数の使用状況を追跡する必要があるプロジェクトに取り組んでmmap
いbrk
ますsbrk
。mmap
これまで、関数の介在を使用してこれを行ってきました。たとえば、置き換える関数と同じ名前のラッパー関数を記述し、LD_PRELOAD
環境変数を設定してプログラムにロードします。でロードするポインターを介して実際の関数を呼び出しますdlsym
。
残念ながら、ラップしたい関数の1つである、sbrk
は、によって内部的に使用されdlsym
ているため、シンボルをロードしようとするとプログラムがクラッシュします。sbrk
Linuxではシステムコールではないので、単にsyscall
間接的に呼び出すために使用することはできません。
だから私の質問は、使用せずに同じ名前のラッパー関数からライブラリ関数を呼び出すにはどうすればよいdlsym
ですか?元の関数を参照できるコンパイラのトリック(gccを使用)はありますか?
xlib - 介在ライブラリ: XOpenDisplay
X11/Xlib.h で定義されている XOpenDisplay 関数の動作を変更する必要があるプロジェクトに取り組んでいます。
探していることを正確に実行するexampleを見つけましたが、コンパイルすると、次のエラーメッセージが表示されます。
XOpenDisplay_interpose.c:14: エラー: »XOpenDisplay« のタイプが競合しています /usr/include/X11/Xlib.h:1507: エラー: »XOpenDisplay« の以前の宣言がここにありました
誰でもその問題で私を助けることができますか? 私は何が欠けていますか?
これまでの私のプログラムコード - 上記の例に基づいています:
よろしく、アンディ。
c - X11アプリケーションのチェックポイントと再起動
X11アプリケーションをチェックポイントして再起動したい。BLCR(Berkeley Lab Checkpoint / Restart(BLCR))ツールを使用しています。
BLCRは、(変更なしで)X-Serverへの接続を再開することはできません。介入ライブラリを使用して、すべてのXlib関数呼び出しとそのパラメーターをテキストファイルに記録しました。
ここで、このログに記録された関数呼び出しを再利用できるようにしたいと思います。それらをテキストファイルに保存し、再起動手順中にそれらを解析/解釈するよりも良い方法はありますか?
チェックポイントされたアプリケーションは、ログに記録された通話をやり直す必要がありますが、これは最初に聞こえたほど簡単ではないようです。
macos - [macosx] dlopen は open 関数と read 関数を呼び出しますか?
MacOS X の dlopen 関数とその他の関数をインターセプト (挿入) しました。アプリケーションがどのように dlopen を呼び出しているかをログで確認できますが、動的ライブラリーが dlopen された後、open/read 関数に関連するものは何も見つかりません。システムは動的ライブラリ ファイルにどのようにアクセスして読み取るのですか? dyld のソース コードを調べたところ、dlopen で open/read が呼び出されます。誰かが私に欠けているものを教えてもらえますか? 傍受された関数: dlopen、open、read、write、access、すべての stat 関数、close など。
ありがとう、どんな助けでも大歓迎です。
c - 意図しない機能の介入をキャッチする方法は?
私の本ExpertCProgrammingを読んで、関数の介在と、それが意図せずに行われた場合にバグを見つけるのが難しい深刻な問題につながる可能性があるという章に出くわしました。
この本で与えられている例は次のとおりです。
my_source.c
libc
この本によると、何が起こるかとmain()
いうと、mktemp()
(標準Cライブラリ関数)がmy_source.cの実装によって挿入されているということです。main()
私の実装を呼び出すことmktemp()
は意図された動作ですが、getwd()
(別のCライブラリ関数)も私の実装を呼び出すことは意図されmktemp()
ていません。
どうやら、この例は、SunOS4.0.3のバージョンのに存在した実際のバグでしたlpr
。この本は、my_source.cstatic
の定義にキーワードを追加することで修正されたことを説明しています。名前を完全に変更すると、この問題も修正されたはずですが。 mktemp()
この章では、未解決の質問をいくつか残しておきます。皆さんが答えてくれることを願っています。
- GCCには機能の介入について警告する方法がありますか?私たちは確かにこれが起こることを意図していません、そして私はそれが起こったらそれについて知りたいです。
static
私たちのソフトウェアグループは、公開したくないすべての機能の前にキーワードを配置するという慣習を採用する必要がありますか?- 静的ライブラリによって導入された関数で介入が発生する可能性はありますか?
助けてくれてありがとう。
編集
私の質問は、標準Cライブラリ関数だけでなく、他のライブラリ、おそらくサードパーティ、おそらく社内で作成されたライブラリに含まれる関数にも介入することを目的としていることに注意してください。基本的に、介在する関数がどこにあるかに関係なく、介在するインスタンスをキャッチしたいと思います。
java - Long / String compareTo()に介入するにはどうすればよいですか?
Comparableオブジェクトを格納するデータ構造を実装するクラスがあります。一部のインスタンスはLongsおよびその他のStringsを保持します。
データ構造クラスやアプリケーションをあまり変更せずに、発生した比較の数を数えたいです。
1つの自然なアイデアは、compareTo()が統計カウンターをインクリメントしてから実際のcompareTo()を呼び出す新しいクラス(たとえばMyLong)を実装することです。次に、Longsなどの代わりにMyLongsを保存するようにアプリを変更します。LongまたはStringから継承できないため、これは機能しません。
このアプローチを機能させることはできますか?この目標を達成する別の方法はありますか?
linux - ディスプレイ/モニター画像のキャプチャ、Linux でのキーボード入力の送信
ラップトップのビデオ ディスプレイに送信された画像を処理する必要があり、C++ またはシェル プログラムを使用してキーボード入力を Linux システムに送信する必要があります。
私の目標は、FPS ゲームの一部である画像を処理し、これらの画像に基づいてそのゲーム内でアクション (したがってキーボード入力) を行うことです。何らかの API を使用して、ゲーム X または Y にインターフェイスする方法を (可能であれば) 理解しようとする代わりに、Linux の入力と出力を何らかの方法でハイジャックして、これがゲームにインターフェイスする最も簡単な方法であると考えました。
カーネルやデバイスドライバーのハッキングなしでこれを行う方法はありますか? 以前、recordmydesktop を使用してデスクトップをビデオとして記録しましたが、そのコードをハッキングして、そこから何かをリバース エンジニアリングしようとすることができると思います。他のアイデアはありますか?私はUbuntu 11を使用しています。
windows - フック静的にリンクされた「malloc」関数ファミリー
Detoursを使用して、ソース コードにアクセスせずにターゲット .exe の malloc/free をフックしています。
.exe から動的にリンクされる malloc/free をフックすることに成功しました。
Detours を使用して、静的にリンクされた malloc/free をフックできるかどうか疑問に思っています。
malloc/free コードは既に .exe 内にあり、それらを見つけることさえ困難であるため、それはより困難になる可能性があることを理解しています。「malloc」は「0x804f400」のようになる場合があります。しかし、.exe 内の malloc/free 関数を見つけることができる他の手法が存在する可能性があると思います。
誰もそれを試しましたか?それとも単に実現不可能ですか?
macos - OS X システム コールの割り込み
クローズドソース ソフトウェアの欠陥を克服するために、いくつかの OS X システム コールを挿入する(元の関数の代わりに自分の関数を呼び出す)必要があります。
結果として得られるソリューションは 10.5 (Leopard) 以降で機能することが望ましいですが、議論が十分に強力であれば、10.6 (Snow Leopard) を要求できるかもしれません。
結果として得られるソリューションは実行可能ファイルであることが望ましいですが、私はスクリプトで解決するかもしれません。
結果として得られるソリューションは、ターゲット アプリケーションが実行された後でも介入(「ベクトルを盗む」)できることが望ましいですが、アプリケーションのロード中に自分自身を挿入する必要があるテクノロジに落ち着くことができます。
結果として得られるソリューションは C または C++ で開発されることが望ましいですが、Objective-C などで解決することもできます。
これまでのところ、次のことを試しました。
1) DTraceスクリプトは私に多くのことを教えてくれましたが、D 言語の制限(制限されたフロー制御など)により、結果がスクリプトになることは言うまでもなく、私がやっていることは大きな苦痛になります。これは、私が撮影しているものほど整然とした自己完結型ではありません。
2) DYLD_INSERT_LIBRARIES介入。これは多くの点で滑らかですが、おそらく名前空間の平坦化が原因で(これが何を意味するのかを深く理解するふりはしません)、より単純な実行可能ファイルに対してはうまく機能しますが、ビルドしてもターゲット アプリケーションがチョークします。実際には呼び出しを介在させない何もしないライブラリ。
私の最新のアイデアは、mach_star ( https://github.com/rentzsch/mach_star ) を試してみることですが、まずここでやめて、常に私よりも多くのことを知っている Stack Overflow コミュニティに尋ねます...
…次は mach_star 以外を見てみようかな。