ネイティブのCのDLLを呼び出すときに保護されたメモリを読み書きしようとしました
-
06-09-2019 - |
質問
私はDllEntryPoint、FuncX以外に一つの関数をエクスポートするネイティブC DLLを持っています。それがvoid戻り値の型とパラメータなしを持っているので、私は、FuncXはそれの発信者と通信する方法を見つけるためにしようとしています。私はC#のハーネスからそれを呼び出すと、私はAccessViolationExceptionを取得する - 保護されたメモリを読み書きしようとしました。
。私は、そのクライアントアプリケーションはDLLの値を送信または受信するためのバッファを割り当てることができることを直感を持っています。これが有効な予感ですか?
何らかの理由でそれが実行されないので、私は、クライアントアプリケーションをデバッグすることはできませんので、私はそれを起動し、プロセスにアタッチすることはできません。私は、しかし、IDA Proでそれを分解することができますが、私は、そこにそれを試してみて、デバッグすることができた場合、どのように知りません。
解決
私はIDA ProのDLLに自分自身をロードしようとするだろう。うまくいけば、C#がネイティブコールスタックを保持し、あなたはDLLのクラッシュの周りのコードを見ることができます。
サイドノート:逆コンパイラプラグインのはすごいです。
。他のヒント
問題のDLLは、任意の静的またはグローバルシンボルを持っている場合、それはすべての通信は、これらのシンボルを介して行われている可能性があります。あなたはそれがこれを行う可能性がありますように見える任意のAPIコードをお持ちですか?
クライアントとサーバーの両方がそのバッファのベースアドレスを知っておく必要があるだろうとDLLは、クライアントされたバッファを使用している、とあなたが呼び出し時に「好ましい」アドレスのためのcallocやmalloc関数を求めることはできませんということはほとんどありませんます。
またlink /dump /symbols
を実行しようとすると、あなたのDLLでそれを指している可能性があります。それはあなたのDLLでエクスポートされたシンボルのリストが表示されます。幸運!