問題タブ [getprocaddress]
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++ - 32ビットアプリを使用して64ビットkernel32.dllから関数アドレスを取得
Windows(WOW64)32bit
で実行されるアプリケーションがあります。からいくつかの関数64bit
のアドレスを知る必要があります。WinAPI
kernel32.dll
の関数のアドレスを簡単に取得できます。うまく機能し32bit
kernel32.dll
ます。GetProcAddress
しかし、Windowsはさまざまなアプリケーションkernel32.dll
(またはアプリケーションアドレス空間のさまざまなアドレスにマップされたライブラリ-正確にはわかりません)を提供します。また、アプリ内の関数のアドレスはアプリ内と同じではありません。32bit
64bit
WinAPI
32bit
64bit
アプリを64bit
kernel32.dll
使用して関数のアドレスを取得するにはどうすればよいですか? 必要な機能のアドレスを知るためだけに32bit
別のプロセスを起動したくありません。64bit
c++ - 別の DLL の呼び出しに必要以上の時間がかかる
既存のネイティブ C++ アプリケーションに次の機能を追加しました。
- サード パーティの DLL が LoadLibraryA(...) 経由で読み込まれます。
- 関数ポインターは、GetProcAddress(...) を介して DLL から取得されます。
- 関数が呼び出されます
これは基本的に機能しますが (関数は alight と呼ばれ、期待される出力を生成します)、大きな問題が 1 つあります。それは、(3. の) 関数呼び出しが非常に遅いことです。実行には 300 ミリ秒以上 (!) かかりますが、1 ミリ秒未満である必要があります。
そこで、新しい空の C++ アプリケーションを作成し、コードをコピーしました。したがって、手順 1 ~ 3 は、他のアプリケーションとまったく同じ方法で実行されます。関数は同じことを行い、同じ結果を生成します。しかし、実行ははるかに高速で、予想どおり 1 ミリ秒未満です。
私が行ったいくつかの観察:
- どちらの結果も 100% 再現可能です。
- 両方のアプリケーションのコンパイラ/リンカー設定は同じようです。
- どちらのアプリケーションでも、コードは CPU 使用率が非常に低いときにメイン スレッドで実行されるため (他に多くのことが行われていないため)、スレッド化/パフォーマンスの問題は問題ではないようです。また、結果は再現可能であり、この種のタイミングの問題は除外されます。
- DLL へのすべての呼び出しは、最初のアプリケーションでは少なくとも 300 ミリ秒かかりますが、他のアプリケーションでは高速です。したがって、動作は単一の機能に限定されません。
- デバッグ ビルドとリリース ビルドのどちらを使用しても違いはありません。
- アプリケーションとサードパーティの DLL はどちらも 32 ビットです。
だから今、私はまったく同じことをしているときに両方のアプリケーションの動作が非常に異なる原因となる可能性のあるアイデアを探しています.
c++ - 動的呼び出しメンバー メソッド c++
これについては何度か議論されていることは知っていますが、私の状況は少し異なります。
一部のクラスをエクスポートするサードパーティの dll があります。残念ながら、ヘッダー ファイルは使用できません。エクスポートされた関数を呼び出すことは引き続き可能です。しかし、正しい 'this' ポインター (RCX レジスターで渡される) を渡すことはできません。
まず、関数名を抽出するために dumpbin /exports を使用します (名前はサードパーティ ライブラリと関数名が機密であるため変更されます)。
これで、API を使用して、ThirdPartyNamespace::ThirdPartyClass へのポインターを受け取るコールバックを登録できるようになりました (ThirdPartyClass の前方宣言のみがあります)。
ここで、ThirdPartyNamespace::ThirdPartyClass::GetId() を呼び出そうとしています:
すべて問題ないように見えます (つまり、ステップインすると - 実際に ThirdPartyClass::GetId メソッド内に入ります。しかし、このポインターは適切ではありません。ptr は適切ですが、デバッガーで手動で rcx を ptr に変更すると、正常に動作します。しかし、コンパイラは何らかの理由で ptr を渡しません。
これらのコマンドを実行する前に、rsi には ThirdPartyClass のオブジェクトへのポインター (つまり ptr) が含まれていますが、それを rcx で直接渡す代わりに、いくつかの演算が実行され、その結果、このポインターは完全に間違ったものになります。
非仮想関数 ThirdPartyClass::GetId() を呼び出すことになるため、コンパイラがなぜそれを行うのか理解できないいくつかのトレース:
私の見解では、それは次のように単純でなければなりません
また、qword ptr [rdi+20h] を呼び出す前に rcx を rsi に設定すると、期待値が返されます。
私は何か完全に間違っていますか?前もって感謝します。
c++ - C++ GetProcAddress 64bit は 32 ビット アドレスを返します
私はしばらく探していましたが、次の問題に対する適切な答えが見つかりませんでした:
dll 内でターゲット プロセスに dll を挿入しています。次のように、呼び出し元の GetProcAddress を受け取りたいアドレスのエクスポートされた関数を呼び出そうとします。
呼び出しは成功し、アドレスを取得すると、GetLastError() は明らかに 0 です。
しかし、これはアドレスの 16 バイトの 16 進数表現 (「0xAB4285B9」など) ですが、前の 8 バイトが欠落しているため、32 バイトの 16 進数表現に必要です (たとえば、7FF8 の場合、完全なアドレスは「0x7FF8AB4285B9」になります)。 ")
それは単なるプレゼンテーション/フォーマットの問題ですか、それとも私が望むものを得るために別の関数を呼び出す必要がありますか?
次のような情報を表示します。
助けていただければ幸いです。
コード以外のフォーマットで申し訳ありません。ここでは携帯電話の Web ブラウザを使用しています。
グリーツ