問題タブ [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 では、DLL インジェクションを使用して別のプロセスに入ったとしましょう。また、注入したプロセスのメモリのスクリーンキャプチャをいくつか実行し、引き出したいデータの場所を知っています。特定の値を含む 0xaaaaaaaa の他のプロセスにデータがあるとします。注入アプリで使用できるように、そのプロセスからこの値を取得するにはどうすればよいですか? 私はプロセスに注入されているので、memcpy のようなものを使用できますか?
おそらくこれよりももっと複雑だと思いますか?
編集: 以下の応答では、既存のアプリケーションからデータを取得するためではなく、別のアプリケーションにデータを送信するために WM_COPYDATA がどのように役立つかわかりません。
c++ - プロセスのメインスレッドへのハンドルを取得する
いくつかの小さなテストアプリで追加のスレッドを作成しましたが、この追加のスレッドからメインスレッドを一時停止したいと思います。追加のスレッドはCreateRemoteThread
、外部プロセスから作成されます。
SuspendThread
一時停止するスレッドが必要なので、追加のスレッドで実行されているコードからHANDLE
これを取得する方法を知りたいです。HANDLE
c++ - インジェクトされた DLL からの DirectX EndScene のフック
EndScene
任意の DirectX 9 アプリケーションから迂回して小さなオーバーレイを作成したい。例として、FRAPS のフレーム カウンター オーバーレイを取り上げることができます。これは、アクティブ化されたときにゲームに表示されます。
これを行うには、次の方法を知っています。
新しい を作成し
d3d9.dll
、それをゲーム パスにコピーします。現在のフォルダーが最初に検索されるため、system32 などに移動する前に、変更した DLL が読み込まれ、追加のコードが実行されます。
欠点:ゲームを開始する前に、そこに置く必要があります。最初の方法と同じですが、system32 の DLL を直接置き換えます。
欠点:ゲーム固有のコードを追加することはできません。DLL をロードしたくないアプリケーションを除外することはできません。IDA Pro 4.9 Free などのツールを使用して、DLL から EndScene オフセットを直接取得します。DLL はそのままロードされるため、このオフセットを DLL の開始アドレスに追加するだけでゲームにマップされ、実際のオフセットが取得され、フックされます。
欠点:オフセットはすべてのシステムで同じではありません。D3D9
Direct3DCreate9
を取得するためにフックD3D9->CreateDevice
し、デバイス ポインターを取得するためにフックDevice->EndScene
し、仮想テーブルを介してフックします。
欠点:プロセスが既に実行されている場合、DLL を挿入することはできません。CREATE_SUSPENDED
イニシャルをフックするには、フラグを使用してプロセスを開始する必要がありますDirect3DCreate9
。DLL が挿入されるとすぐに、新しいウィンドウで新しいデバイスを作成します。次に、
EndScene
このデバイスからオフセットを取得してフックすると、ゲームで使用されるデバイスのフックになります。
欠点:私が読んだいくつかの情報によると、2番目のデバイスを作成すると既存のデバイスに干渉する可能性があり、ウィンドウモードとフルスクリーンモードなどでバグが発生する可能性があります.3番目の方法と同じです。ただし、取得するにはパターン スキャンを実行します
EndScene
。
欠点:それほど信頼できるようには見えません。
他のシステムで異なるd3d9.dllを処理する必要なく、信頼できる方法でEndScene
、ゲームが既に実行されているときに読み込まれる可能性のある注入された DLL からフックするにはどうすればよいですか? たとえば、FRAPS は DirectX フックをどのように実行しますか? DLL は、すべてのゲームに適用する必要はありません。CreateRemoteThread
c++ - C++ でメンバー関数のアドレスを変更する
C++ では、メンバー関数のアドレスを取得することで関数ポインターを簡単に作成できます。しかし、そのローカル関数のアドレスを変更することは可能ですか?
つまり、同じクラスに funcA() と funcB() があり、定義が異なるとします。funcA() のアドレスを funcB() のアドレスに変更して、実行時に funcA() を呼び出すと実際に funcB() が呼び出されるようにしようとしています。私はこれが醜いことを知っていますが、私はこれを行う必要があります、ありがとう!
編集 - - - - -
私がやろうとしていることの背景:
既存のコード ベースの単体テストを実装したいと考えています。すべてのモジュールが継承している基本クラスのメソッドの一部は非仮想です。製品コードを編集することは許可されていません。ビルドプロセスをいじって、関連するメソッドを仮想に設定した基本クラスに置き換えることができますが、このようなハックを使用したいと思いました(可能だと思いました)。
また、私は技術的な好奇心からこのトピックに興味があります。この問題をハックしようとするプロセスを通じて、コード生成や関数検索などの仕組みが内部でどのように機能するかについてかなりのことを学んでいるからです。大学2年を終えたばかりで、学校で学ぶ機会がありませんでした。私はCSではなくコンピュータ工学プログラムにいるので、学校でそのようなことを教えられるかどうかはわかりません.
トピックに戻る メソッド funcA() と funcB() は確かに同じ署名を持っているため、問題は & 演算子を使用して関数のアドレスしか取得できないことです? 関数のアドレスを変更したり、メモリの一部を破損することなくそのアドレスの内容をスワップアウトしたりできないというのは正しいでしょうか? 関数が dll にエクスポートされている場合、DLL インジェクションはこのような状況に適したアプローチでしょうか?
c# - extTextOut の問題のフック
私は c# で dll インジェクション ソフトに取り組んでいます。注入された dll も c# にあり、特定のシステム機能に pinvoke を使用しています。
extTextOut を使用すると、文字列がスクランブルされ、行が混ざり合ってしまいます。何が間違っていますか?
次のように、codeplex.com の EasyHook を使用して extTextOut をフックしました。
そして私のextTextOutメソッドは
そして、もしよろしければ別の質問です。焦点が合っていない、または最小化されているウィンドウを常に監視するにはどうすればよいですか (このアプローチを使用すると、正しく機能しません)
どうもありがとう!
terminology - dllインジェクション、ring0、ring3 ...すべてのウィンドウ固有の概念ですか?
それらはLinuxプラットフォームに存在しますか?
delphi - リモート スレッドで、パラメーターにポインターを含む関数を呼び出すにはどうすればよいですか?
SHFileOperation
コードインジェクションを使用して呼び出したい。私のコードは、 MessageBox
fromのような単純な関数を呼び出している間は正常に動作しますが、 fromuser32.dll
を呼び出している間は動作しません。ShFileOperation
shell32.dll
問題があると思われるコードの部分を投稿します。問題が構造体の実装にあることはわかっています。
以下は、RemoteInfo 値のイメージです。
c++ - C++での文書化されていないクラスの使用
私はWindows実行可能ファイルをリバースエンジニアリングしているところです。実行可能ファイル(別のスレッド、独自のスタック)に挿入するコードから、使用したいクラスを見つけました。メソッドアドレスとメンバー変数の構造を指定して、このようなクラスを宣言するにはどうすればよいですか?
たとえば、コンストラクター@0x4012D30と関数doTheMario@40125D4を持つfooというクラスを見つけたとします。また、3つのDWORDのプライベートデータを保持していることも知っています。どちらのメソッドも_thiscallsなので、コードでそのようなクラスを宣言します。
さて、これは完全にダンディなクラスですが、コンパイラ/リンカにクラスメソッドを前に述べた2つのアドレスにバインドさせる方法はありますか?もちろん、使用する必要のあるすべてのメソッドに対してstdcallをthiscallに変換するasmラッパーを記述し、クラスの代わりに構造体を使用することもできますが、より良い方法が必要です。
現在はgcc/g ++を使用していますが、VC ++に切り替えることができます(gccのインラインasmはとにかく頭痛の種になるため)。
delphi - Delphi で別のプロセスの関数/プロシージャのアドレスを取得することは可能ですか?
Madshi の madCodeHook コンポーネントを使用してプロセスに DLL を挿入し、プロシージャ/関数をフックします。問題は、新しいバージョンの EXE が登場するたびに、関数のアドレスが変更される可能性があることです。現在、私が行う方法は、Ollydbg を使用してから、プロセスに挿入する DLL にアドレスをハードコーディングすることです。これは非常に醜く、安全ではありません。動的に実行できる場合、プロシージャの定義を知る方法があるかどうか疑問に思っています。
これは悪意を持ったものではないことに注意してください。ログを記録する目的でターゲット EXE にいくつかの手順をフックしただけです。
dll-injection - Dll インジェクション - 何が可能ですか?
Dll インジェクションに出くわしたとき、私は最近インターネットを閲覧していました。
面白い題材だと思いますが、その目的が何なのかわかりません。
ゲームやソフトウェアのクラッキング/ハッキングに使用できると読みましたが、何かポジティブなことをすることも可能ですか?
もしそうなら、それは何に使用できますか?
そして、どの言語がこれをサポートしていますか?
記録のために、私は得た知識でゲームをクラック/ハッキングしようとするつもりはありません。違法なことをするつもりはありません!
時間をありがとう、
エメリオン
ps: この件に関するウェブサイトや本を教えていただければ幸いです。