問題タブ [interposing]
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 - OSX で割り込み、関数が呼び出されない
だから、私はOSX(gcc 4.2.1)でいくつかの介入コードをいじっていて、次を機能させようとしています:
DYLD_INSERT_LIBRARIES=my.dylib を使用して ./login を呼び出すと、デフォルトのログイン実装がオーバーライドされ、カスタム実装が使用されます。これは不自然な例ですが、要点を理解するのに役立ちます。
私の情報源:
猫 libinterposers.c
猫のログイン.c
そして最後に、login.h
「cat /dev/null」のようなもので実行すると、正常に動作します...
ただし、./login の例で実行すると
ご覧のとおり、login failed, my custom "my_login" function never runs ... と表示されるだけです。何かアイデアはありますか? 前もって感謝します!
delphi - インターポーザ クラスがコンパイルされない理由は?
私は持っている:
私はそれを
しかし、インターポーザー クラスのオーバーライドされたメソッドは呼び出されず、それらのブレーキポイントは、アクティブな "淡い青" ではなく "濃い緑" の非アクティブな色のままです。
私は何が欠けていますか?
java - Javaクラスメソッドへの介入(インターフェイスなし)
クラスメソッドの間に介在して、オブジェクトを動的に拡張したいと思います。
java.lang.reflect.Proxyについてはすでに知っていますが、実際の介入を行うには制限が多すぎます。
java.lang.reflect.Proxyを使用してJavaクラスメソッドに介入することから、最初の制限は次のとおりです。
(...)メソッドはプロキシクラスのインスタンスを介して呼び出す必要があります。したがって、たとえば、ネストされたメソッド呼び出しはインターセプトされません。
そして最悪のもの:
(...)メソッドは、プロキシされるオブジェクトによって実装されるインターフェイスで定義されている必要があります。インターフェイスを実装していないクラスのインスタンスを介して呼び出すことはできません。
実行時に拡張したいオブジェクトはインターフェイスを実装していません。最悪の場合、オーバーライドする必要のあるメソッドはネストされており、プライベートです。
私はこれがPythonとCでかなり簡単であることを知っています、そして上で引用された記事はそれが可能であるかもしれないと言っています:
このシリーズの次の記事では、これらの制限を克服するためのいくつかの手法について説明します。
残念ながら、この記事を見つけることができません。
c - オブジェクトモジュール(gcc、ld、x86、objcopy)の静的関数をオーバーライドすることは可能ですか?
オブジェクトモジュール内の静的スコープで関数をオーバーライドする方法はありますか?
このようなものから始めると、グローバルシンボル「foo」を持つモジュールは、ローカルシンボル「bar」を呼び出す関数であり、ローカルシンボル「baz」を呼び出します。
1つのグローバル「foo」と2つのローカル「bar」と「baz」があります。
バーとバズを実行する単体テストを作成したいとします。次のことができます。
そして今、barとbazはグローバルシンボルであり、モジュールの外部からアクセスできます。ここまでは順調ですね。
しかし、「baz」の上に自分の関数を挿入し、「bar」に挿入した「baz」と呼ばせる場合はどうなりますか?
それを行う方法はありますか?
--wrapオプションはそれを行わないようです...
main()から呼び出されたbazはラップされましたが、barはラップされたbazではなくローカルbazを呼び出します。
バーにラップされたバズを呼び出させる方法はありますか?
オブジェクトコードを変更して関数呼び出しのアドレスをいじくり回す必要がある場合でも、自動化された方法で実行できれば十分かもしれませんが、その場合は少なくともi386とx86_64で動作する必要があります。
-スティーブ
c - ライブラリの挿入/挿入がopenコマンドで機能しない
環境変数DYLD_INSERT_LIBRARIESによってターゲットアプリケーションにロードされるダイナミックライブラリを作成しました。アプリケーションが次のコマンドによってターミナルから実行されると、dylibは正常に機能します。
しかし、openコマンドで実行すると:
このエラーが発生しました:
2つの実行方法の違いは何ですか?ありがとう。
c++ - Safari と getaddrinfo の介入
getaddrinfo と connect への呼び出しを挿入する小さな動的ライブラリを作成しました。Firefox と Safari で DYLD_INSERT_LIBRARIES を使用してこのライブラリを挿入し、www.apple.com の要求をハイジャックして www.microsoft.com に送信します。コードは Firefox で動作しますが、Safari は介在する関数を呼び出しますが、リダイレクトは無視されます。
Safari がリダイレクトを無視する理由と、おそらく addrinfo フラグを介して Safari を Firefox のように動作させる方法があるかどうかについて、誰かが洞察を持っているかどうか疑問に思っています。私のコードリストは次のとおりです。
java - Java インターポーザーでのスタック破壊
ネットワーク通信関連のシステム コールを変更する Java インターポーザを作成しています。基本的に、意図した受信者の IP とポートを変更したいと考えています。
コードは私のラップトップでは正しく動作しますが、大学の PC では次のようなスタック破壊エラーが発生します。
関連するコード ( connectシステム コールの挿入) は次のとおりです。
ここで、sockは共有ライブラリの「コンストラクタ」で初期化したソケットです。
プログラムは正常に動作し、Doneを出力します。最後の(リターン)行で、スタック破壊エラーが発生します。何が原因なのかわかりません。
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 以外を見てみようかな。
macos - 実行する前に新しいプロセスのPIDを取得するにはどうすればよいですか?
inject_and_interposeコードを使用してインジェクションとインターポーズを実行できるように、実際に実行する前に、新しく起動したプロセス(一般的なクローズドソースユーザーアプリケーション)のPIDを取得する方法が必要です。
明確にするために、私は単に「すぐに気付く」よりもうまくやる必要があります。ポーリングしたり、アクションを実行するまでにプロセスがすでに数ミリ秒実行されていることを意味する非同期通知を受信したりすることはできません。
単一のステートメントが実行される前に、注入と介入を行う機会が必要です。
特定の名前のプロセスが発生したときに同期的に通知されるバックグラウンドプロセスを作成することはできます。また、ターゲットアプリケーションを起動するランチャーアプリケーションを作成することもできます。
すべてのソリューションは、少なくとも10.5(Leopard)から10.8(Mountain Lion)未満の64ビットコードをサポートする必要があります。
これが非常に単純であることが判明した場合は、先に進んで、OSXを初めて使用することを認めます:)ありがとうございます。