問題タブ [dll-injection]
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++ - Windows 8 での Metro スタイル アプリケーションの Fraps のような機能
Fraps のようなツールは、OpenGL または DirectX に基づくゲームで動作しますが、「Cut The Rope」や「Pirates Loves Daisies」のような単純な Windows 8 Metro スタイルのゲームでは動作しません。はい、「Cut The Rope」と「Pirates Loves Daisies」が JavaScript や HTML5 キャンバスなどの異なるテクノロジーを使用していることは知っていますが、そのようなゲーム用の Fraps のようなツールを構築できるかどうか (何らかのキャンバス ハック?) に非常に興味があります。やりたいことは 2 つあり
ます。 1. fps を測定します。
2. スクリーンショットをキャプチャします。
Fraps の概念全体とDirectX への呼び出しのインターセプトに関する記事を読んでいましたが、Metro アプリケーションで動作するかどうかはわかりません。たぶん、私は時間を無駄にしているだけです。皆さんに 2 つの質問があります
。
2. dxgi.dll (または他の dll) をいじることは、何らかの形で役に立ちますか?
ありがとう
c++ - 64 ビット プロセスで API メソッド呼び出しをインターセプトする方法は?
バックグラウンド
私は、インジェクション dll を介して、インジェクト プロセスが任意の dll にしようとしている任意のメソッド呼び出しを正常にインターセプトできるレガシー製品に取り組んでいます。特に、gdi32.dll ライブラリ。残念ながら、64 ビット アプリケーションに組み込むと機能しません。注目のトピックになり、機能をアップグレードする時が来ました。また、残念なことに、ソースにはコメントがありません (典型的な >:-<)。見た目から、これを書いた人は x86 命令セットにかなり精通していました。私は何年も組み立ての仕事をしていませんでした。私がやったときはモトローラの組み立てでした。
インターネットを精査した後、インテルの従業員からこの記事に出くわしました。私たちのソース コードがこの記事より約 7 年も前に作成されていなかったとしたら、これはまさに、NoComments 氏の開発者が API メソッドのインターセプトを実行する方法を学んだ場所であると言えます。それくらい手順は似ています。この記事は、前述の Web サイトからもリンクされている素敵な pdf ( Intercepting System API calls ) にも要約されています。
問題
インテルの Web ページのリンクで提供されている例を本当に理解したいので、64 ビット シナリオのソリューションを作成する際に良いクラックを取ることができます。それは十分に文書化されており、理解するのが少し簡単です。以下は、InterceptAPI() ルーチンの抜粋です。「//#」で示される独自のコメントを追加しました(元のコメントは標準の「//」で示されます)。そこで、私が知っていると思うことと知らないことを説明します。
このコードで何が起こっているのか、かなりよく理解していると思います。したがって、百万ドルの質問は次のとおりです。これが 64 ビット プロセスで機能しないのはどうですか? 私が最初に思ったのは、「まあ、アドレスは 8 バイトになっているはずだから、それは何か問題があるに違いない」ということでした。しかし、JMP コマンドはまだ相対 32 ビット アドレスしか使用しないため、64 ビット プロセスで 32 ビット アドレスを使用してもオペ コードは有効であると思います。それ以外に私が信じている唯一のことは、メソッド呼び出しの最初にある魔法の 5 バイトが、実際には他の魔法の数であるということです。誰かがより良い洞察を得ましたか?
注: 「Microsoft Detours」や「EasyHook」など、他にもいくつかのソリューションがあることは知っています。前者は高すぎるので、現在後者を検討していますが、今のところ期待外れです。ということで、今回は特にこの話題に絞って議論したいと思います。私はそれが興味深いだけでなく、私の問題に対する最良の解決策でもあると思います. したがって、「この投稿については特に何も知りませんが、代わりに {サードパーティのソリューションをここに挿入} を試してください」という質問はやめてください。
c++ - インジェクトされたプロセスで、DLL から関数を呼び出す
そのプロセスからdllに存在する関数を呼び出す方法はありますか(dllはプロセスに注入されます)?
myDLL.dll
つまり、関数をエクスポートしている場合、「myDLL.dll」void f(){do sth}
というプロセスmyProcess
が「myDLL.dll」を使用して注入された場合、実際にこの関数の呼び出しを開始した「ユーザー」からCreateRemoteThread()
呼び出すことができますか?f()
myProcess
myProcess
f()
従業員はプロセスを見つけて強制終了できるため、タスクマネージャーで強制終了できる特定のプログラムに関数が依存しないようにするため、これを行う必要があります。私のマネージャーは、従業員が仕事以外のことをしていると考えているため、私にこれを行うように依頼しました.
c# - dll インジェクション後にメッセージ ボックスが表示されないのはなぜですか?
私は単純なdllコードを持っています:
そして、dll を別のプロセスに注入するための python コード:
一部のプロセスでは、注入が機能します。たとえば、gvim で動作します。メッセージボックスが見えます。しかし、C# で簡単なアプリケーションを作成しました。そして、私のdllをこのアプリケーションに注入しようとした後、何も起こりません。
OpenProcess
Python インジェクターは、 orCirtualAllocEx
および returnでエラーを報告しませんc_ulong(3968L)
。では、なぜメッセージボックスが表示されないのでしょうか?
編集:
私のオペレーティング システム: Windows XP Professional SP3 32 ビット。
編集2:
Cコードで同じことをしたところ、同じ結果が得られました。インジェクションは、たとえば gvim で機能します。しかし、C# での私のプロセスではありません。デバッガーで確認したところ、DllMain 関数が実行されていないようです。
c# - 同じプロセスにロードされた 2 つの .NET CLR はどのように相互に通信できますか?
同じボックスで 2 つの CLR を実行できるようになりましたが、どうすれば相互に「対話」できるでしょうか?
GUI が .NET 2.0 CLR で実行されており、スクリプトが .NET 4.0 CLR で実行されているとします。たとえば、4.0 環境から 2.0 ベースの GUI を変更する方法はありますか?
この手法を使用して .NET C# REPL 環境を別の .net プロセスに挿入すると、まさにこの問題が発生します:ビデオ: Injecting C# DLLs into Managed (C#) and Unmanaged (C++) processes
注: Reddit で同様の質問をしましたが、そのバージョンには多数の参照が含まれており、Side-by-Side 実行と CLR ホスティングのトピックに興味がある場合に役立ちます。
c++ - インジェクションされたDLLからプログラムウィンドウを取得するにはどうすればよいですか?
プログラムにDLLを挿入して、アプリケーションのメインウィンドウにチャットUIを実装しました。アプリケーションのメインウィンドウハンドルを取得し、次にDCを取得して、そこに描画できると考えました。ウィンドウには予測可能なタイトルがあります。これはFindWindow
、ハンドルを取得するために使用できることを意味します。唯一の問題は、プロセスの開始時にDLLが挿入されることです。その時点では、ウィンドウは作成されていません。つまりFindWindow
、何も見つかりません!
これに対するいくつかの解決策は何ですか?DLLにスレッドを作成し、ウィンドウが作成されたことがわかるまでしばらくスリープできますか?これは非常に不安定なようですので、やりたくありません。
私がやろうとしたSetWindowsHookEx
のは、DLLでグローバルWndProcをフックするために使用することでした。ウィンドウからメッセージが見つかるまで(つまり、メッセージが作成されるまで)メッセージをスキャンできました。次に、ハンドルを保存してプログラムを続行できます。一度に同じ名前のウィンドウが複数あることについてはあまり心配していません。唯一の問題は、私のフックが呼び出されないことです。
私は次のようにフックを作成します:
これは有効なフックを返します。WndProcは次のようになります。
しかし、「WNDPROC」メッセージはログファイルに記録されません...以前は、ログのMessageBox
代わりにログが機能するかどうかを確認していましたが、これはひどい考えでした。「OK」をクリックするのを待っていたため、すべてのプログラムがフリーズし、ハードリセットを実行する必要がありました...コンピュータの電源を入れ直してMessageBox
ログコマンドに置き換えたところ、機能しませんでした。ただし、ログは他のすべての場所で機能するため、ログが機能することはわかっています。私はこれで何が起こっているのか非常に混乱しています。
メインウィンドウを取得する他の方法はありますか(できれば作成時に)?または、私のフックメソッドは良いのですが、実行が間違っていますか?フィードバックありがとうございます。
c++ - explorer.exe で NotifyIcon のコンテキスト メニューを変更するにはどうすればよいですか?
デフォルトの Speakers 通知 (トレイ アイコン) の右クリック コンテキスト メニューを新しい項目で拡張したいと考えています。また、C++ を使用してマウスクリックを処理したいと考えています。
図
私がこれまでに知っていること
CreateRemoteThread()を使用して dll を注入する方法を学びました。私の問題は: 挿入された dll 内で何をすべきか? たとえば、NotifyIcon オブジェクトにアクセスする方法は?
単純な Windows API 呼び出しで可能かもしれませんが、私はそれに慣れていません。
c++ - dllの挿入がWindowsXPで機能しない
だから、ゲームクライアントをフックするために使用する私のdllを注入するインジェクターを作ろうとしていDetours
ます、それは簡単です、しかし私はそれがうまくいくのに何が間違っているのかわからないという問題がありWindows Vista+
ます...これが私のコード
どちらもVC++2010で構築されているため、動作するはずですが、Windows XPではゲームを起動しますが、dllが挿入されていません。Idkここで何が問題になっていますか。
編集:それは私のXPにMSVCR100D.DLLがないためだと思いますが、dllがそれに依存しないようにする方法はありますか?
c++ - 実行時に読み込まれる DLL のインポート アドレス テーブルを変更する方法
実行時にロードされた DLL から呼び出される関数をフックしたいのですが、「Windows Via C/C++」という本のクラス CAPIHook を使用しました (Install System Wide フックによって行われる DLL インジェクションと、Modify IAT によるフック) が、これはコードは、実行可能ファイルの IAT に DLL 名/シンボルが存在する場合にのみ機能します。(つまり、暗黙的な DLL リンクの場合)
これは DLL コードです:
これはフック関数です:
IAT の交換方法:
作成者はこの機能を追加するためにコメントを追加しましたが、その方法がわかりません
注: 関数は、エクスポート モジュールが既に読み込まれている場合にのみフックできます。解決策は、関数名をメンバーとして保存することです。次に、フックされた LoadLibrary* ハンドラーで、CAPIHook インスタンスのリストを解析し、pszCalleeModName がロードされたモジュールの名前であるかどうかを確認して、そのエクスポート テーブルをフックし、ロードされたすべてのモジュールのインポート テーブルを再フックします。
彼はこれも本に書いていますが、どうすればいいのかわかりません
考えられる解決策は、フックされた LoadLibrary* 関数を使用して、モジュールがパッチが適用されていないフックされた関数をエクスポートしていることを検出し、次に 2 つのアクションを実行することです。
GetProcAddress を呼び出して、フックする関数の元の実装へのポインターを取得できるようになったため、既に読み込まれているモジュールのインポート テーブルを再度フックします。関数の名前をクラス メンバーとして格納し、コンストラクターで設定する必要があることに注意してください。
ReplaceEATEntryInOneMod 関数の実装によって示されるように、エクスポート モジュールのエクスポート アドレス テーブルでこのフック関数を直接更新します。そうすれば、フックされた関数を呼び出すすべての新しいモジュールがハンドラーを呼び出します
DLL のロード後に IAT を変更しようとしましたが、フック関数が呼び出されませんでした
では、このコードを変更して動的ローディングケースを処理するにはどうすればよいですか?
c++ - Win7のリモートプロセスからPEBを取得する
仕様:Windows 7 x64、Visual C ++
目的:サンプルプログラム(calc.exeなど)からリモートPEBを取得しようとしています。proc IDを見つけ、すべての適切な権限でプロセスへのハンドルを開きました。次に、PROCESS_BASIC_INFORMATIONを使用してプロセスからPEBの場所を取得するクラスの作成に移りました。
問題: NtQueryInformationProcessがMSでたわごとに変わったことを示しているように見えるいくつかの投稿を他の場所で見つけました。ある投稿は、ntdll.dllからNtQueryInformationProcessを動的ランタイムリンクする方法を提案しています。ただし、これは長期的には不安定であり(MSは明日NtQueryInformationProcessを削除する可能性があります)、広範なエラー処理が行われないと思います。
このアイデアはこのスレッドの後半で実現され、Mike2343によって「他の方法を使用する」ことが提案されています。
質問:NtQueryInformationProcessを含まないリモートプロセスのPEBを見つける別の方法は何でしょうか?
これを見て時間を費やしてくれた人に感謝します。