0

x86 アセンブリ言語を介して COM オブジェクトを呼び出すことはできますか? もしそうなら、どのように?

なぜ私はこれをしたいのですか?ソースを持っていない 2 つのプログラムがあるとしましょう - 私が持っているのはバイナリだけです。それらの 1 つは COM インターフェイスを実装し、もう 1 つは実装していません。この COM インターフェイスを使用して、最初のプログラムにコードを挿入し、2 番目のプログラムを呼び出す必要があります。これには、x86 アセンブリを使用する必要があります。

4

5 に答える 5

5

もちろん、それは可能です。事実上、それが C/C++ コンパイラの機能です。

しかし、なぜあなたは神の名においてこれをしたいのですか? それが教育的価値のためであるなら、確かにストレートCで手作業でCOMのものをやればうまくいくでしょう。


更新された質問を考えると、COM のものを DLL に記述し、その DLL をパッチを適用するプログラムに挿入し、単純な x86 コードをプログラムにパッチして、面倒な作業を行う DLL を呼び出すことをお勧めします。プロセスのアドレス空間に DLL を挿入する手法は覚えていませんが、少なくともいくつかはあります。AppInit レジストリ設定 (またはそのような設定) はその 1 つです。

ただし、プロセスにコードを挿入する手段のほとんどはセキュリティ上の欠陥と見なされている (そして、マルウェアによってよく使用されている) と考えているため、Microsoft は最近のサービス パックからほとんど (またはすべて) ではないにしても多くを削除した可能性があると思います。またはOSのバージョン。

于 2008-10-10T00:18:05.837 に答える
1

必要なことを行う最も簡単な方法は、COM 通信を行う DLL を作成し、他のアプリケーションに DLL をロードさせるコードを挿入することです。DLL injectino 手法を使用するか、アプリケーション自体のアセンブリを編集して LoadLibrary/GetProcAddress などを呼び出すことができます。

編集: ところで、OllyDbgは既存のアプリケーションのアセンブリを編集するための優れたツールであることがわかりました。

于 2008-10-10T00:31:34.750 に答える
1

私はマイク B に同意する必要があります。これはあなたがやりたくないことのように聞こえますが...

可能性について Mike B が述べたことをさらに詳しく説明すると、最低レベルの COM は ABI (アプリケーション バイナリ インターフェイス) です。つまり、メモリ内の COM オブジェクトのレイアウトを定義し、すべての COM オブジェクトがこのレイアウトに従う必要があります。COM オブジェクト (x86 プラットフォーム上) は、Visual C++ コンパイラ (および他のほとんどのコンパイラ) がメモリ内にオブジェクトを配置するのと同じ方法でメモリ内に配置されます。これにより、COM を操作するのに C++ (および C も追加の労力を要します) が便利な選択肢になります。とは言っても、アセンブリでこれを試している人を見たことはありませんが、CodeProject で利用可能な C での COM の実行に関するチュートリアルがあります。そこにある概念は、アセンブリに変換するのがかなり簡単なはずです。

CodeProject: プレーン C の COM

于 2008-10-10T00:31:46.467 に答える
0

はい -- COM は、C/C++ から非常に簡単に実装できるものではありますが、主にバイナリ APIとして設計されています。ただし、仕様は C または C++ に関するものではありません。

元の COM 仕様を参照できます。ここにコピーがあり、Microsoft サイトのどこかに埋め込まれている必要があります。

更新: ユース ケースでは、アセンブリを直接使用する必要はないようです。任意のコード インジェクション手法を使用できます。注入するコードをどのようにコンパイルするかは、注入する方法とは別の問題です。

于 2008-10-10T00:23:51.863 に答える
0

困難な道を進むか、テスト済みの真のソリューションを探すことができます。
どちらもアセンブリ言語を必要としません。

于 2008-10-10T00:53:51.243 に答える