2016-09-13 12 views
0

私はCOMオブジェクトの逆転(Windowsプラットフォーム)が新しくなっています。私は子IEプロセスがcom(保護モードのために)経由で親IEプロセスと通信するWindows 8.1でInternet Explorerを逆転しようとしています。 COM11経由でIE11のIneterprocess通信を理解する

この

はieframe.dll COM操作を担当する(クラスCShellUIHelperのパート)から仮想関数のASMスニペットです(私はパブリックシンボルMSをしました。)そのCOMを呼び出すここで

CShellUIHelper::XX_XX{ 

.. 
.. 
    mov  eax, [ebp+var_2BC] 
    lea  edx, [ebp+Filename] 
    mov  edi, esp 
    push edx 
    push [ebp+var_2AC] 
    mov  esi, [eax] 
    push ecx    ; _DWORD 
    push eax    ; _DWORD 
    mov  esi, [esi+25Ch] 
    mov  ecx, esi  ; _DWORD 
    call ds:___guard_check_icall_fptr 
    call esi    ; call {combase!ObjectStublessClient30+0x5c0 

} 

実際には "call esi + 025ch"である "call esi"命令を使用して、最後の行のインターフェイスメソッドを呼び出します。実行時私は実際にコールコンバートを見つけました!ObjectStublessClient30(x、x)

ここで、combase!ObjectStublessClient30()を使用して、インターフェイスメソッド名を呼び出したいと思います。

私はこのStack Exchange Answerの後ろにあります。これはかなり類似しています。

https://reverseengineering.stackexchange.com/questions/2822/com-interface-methods

しかし、問題はIShellWindowsであることが知られたこの答えインタフェース名で、ですが、私の場合には、私はインターフェイス名を知りません。

私はこの時点で固執しています。ですから、私の質問は、インターフェイス名とメソッド名を見つけるためにどのような道筋を辿るべきかということです。

+0

これをリバースエンジニアリングする方法はありません。 combase.dllで終わったら、実際にプロキシを呼び出すと、COM呼び出しがスレッドセーフな方法で行われます。あなたはまず、使用されている正確なインターフェースを知っていなければなりません。そして、そのインターフェースによって実装されたメソッドを数えます。あなたがインタフェースを知らないなら、あなたは何も知らない。 –

+0

@ HansPassantには、インターフェイスを見つけるために私が従うことができるアプローチはありますか? –

+0

リバースエンジニアリングがもっと必要です。インターフェイスGUIDを識別できるように、CoCreateInstance()またはQueryInterface()コールを逆アセンブルする必要があります。それがプロキシを通過するということは、これをまったく簡単にするものではありません。 –

答えて

1

ObjectStublessClient30は、プロキシオブジェクトにヒットしたことを示すように見えるので、処理しているインターフェイスポインタのタイプをバックトラックして把握する必要があります。明確にするために

[バックトラック、覚えておいてください!]、

; 5. ... and in stack slot var_2BC now. 
    mov  eax, [ebp+var_2BC] 
    lea  edx, [ebp+Filename] 
    mov  edi, esp 
    push edx 
    push [ebp+var_2AC] 
; 4. ... which is the vtable for the interface pointer in eax now ... 
    mov  esi, [eax] 

    push ecx    ; _DWORD 
    push eax    ; _DWORD 
; 3. ... in the interface vtable that ESI points to now, ... 
    mov  esi, [esi+25Ch] ; 2. You now, the method at offset 25Ch ... 
; 1. ESI clearly contains a pointer to the [stubless stub] method now 
    mov  ecx, esi  ; _DWORD 
    call ds:___guard_check_icall_fptr 
    call esi    ; call {combase!ObjectStublessClient30+0x5c0 

インターフェイスポインタはIFooは、インターフェイスの名前であるタイプIFoo *、であることを行っています。何があなたがタイプを教えてくれる場所に戻ってポインタを追跡するのですか?->QueryInterface(いつでもすべてのインターフェイスvtableのオフセット0にあります。最終的にはIUnknownから継承されるため)またはCoCreateInstance 、またはパブリックシンボルに名前が与えられた関数/メソッドへのパラメータのように、C++の名前のマングリングから。

このような名前またはIIDが見つかった場合は、プラットフォームSDKのインクルードディレクトリのどこかに記載されているものを見つけたり、関連するDLLの1つまたはその近くのCOMタイプライブラリで失敗したりすることができます、拡張子は.tlbです)。私がタイプライブラリを見るために知っている最善の方法は、あなたのプラットフォームSDKのbinディレクトリにあるOLE/COMオブジェクトビューアoleview.exeをうまく使うことです。

関連する問題