2016-09-13 1 views
0

Ich bin ziemlich neu bei der Umkehrung von COM-Objekten (Windows Platform). Ich versuche, den Internet Explorer unter Windows 8.1 umzukehren, wo der untergeordnete IE-Prozess mit dem übergeordneten IE-Prozess über com kommuniziert (aufgrund des geschützten Modus).Verstehen der Interprozesskommunikation des IE11 über COM

Dies ist ein ASM-Schnipsel einer virtuellen Funktion von ieframe.dll (Teil der Klasse CShellUIHelper), die für einen COM-Betrieb verantwortlich (I MS öffentliches Symbol habe.)

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 

} 

Hier seine ein COM-Aufruf Interface-Methode in der letzten Zeile mit "Call esi" Anweisung, die eigentlich "Call esi + 025ch" ist. Runtime ich habe gefunden, dass es eigentlich combase! ObjectStublessClient30 (x, x)

Hier möchte ich finden, die Schnittstelle Methode Name seinen Aufruf mit Hilfe von Combase! ObjectStublessClient30().

Um den Methodennamen zu finden, folge ich diesem Stack Exchange Answer, der ziemlich ähnlich aussieht.

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

Aber das Problem ist, in diesen Schnittstellennamen beantworten wurde bekannt, das IShellWindows ist, aber in meinem Fall die ich nicht die Schnittstellennamen kennen.

Ich bin an diesem Punkt fest. Also meine Fragen ist, welchen Pfad ich folgen sollte, um den Namen der Schnittstelle und den Namen der Methode zu erfahren.

+0

Es gibt keinen vernünftigen Weg, dies rückzuentwickeln. Wenn Sie in der Datei combase.dll enden und dann tatsächlich in den Proxy-Server wechseln, wird sichergestellt, dass der COM-Aufruf Thread-sicher erfolgt. Sie müssen zuerst die genaue Schnittstelle kennen, die verwendet wird, und dann die von dieser Schnittstelle implementierten Methoden abzählen. Wenn Sie die Schnittstelle nicht kennen, wissen Sie nichts. –

+0

@HansPassant gibt es einen Ansatz, dem ich folgen kann, um die Schnittstelle zu finden? –

+0

Sie benötigen viel mehr Reverse-Engineering. Sie müssen den CoCreateInstance() - oder den QueryInterface() - Aufruf zerlegen, damit Sie die GUID der Schnittstelle identifizieren können. Dass es durch einen Proxy geht, macht das nicht gerade einfacher. –

Antwort

1

Die Tatsache, dass Sie in combase! ObjectStublessClient30 gelandet sind, scheint darauf hinzudeuten, dass Sie ein Proxy-Objekt getroffen haben, also müssen Sie den Typ des Schnittstellenzeigers, mit dem Sie es zu tun haben, zurückverfolgen.

Um zu klären [erinnern, Rückzieher!],

; 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 

Die Schnittstelle Zeiger vom Typ sein werden IFoo *, wo IFoo der Name der Schnittstelle ist. Was Sie tun müssen, ist der Zeiger zurück zu einem Ort, der Ihnen den Typ sagt, ob in Form der IID wie mit ->QueryInterface (immer bei Offset 0 in einer beliebigen Schnittstelle vtable, weil sie alle letztlich erben von IUnknown) oder CoCreateInstance oder aus C++ - Name, der sich wie ein Parameter in eine Funktion/Methode verwandelt, die in den öffentlichen Symbolen einen Namen erhält.

Wenn Sie einen solchen Namen oder eine IID finden, können Sie versuchen, sie entweder irgendwo im platform SDK include-Verzeichnis zu finden oder in einer COM-Typ-Bibliothek in oder in der Nähe einer der relevanten DLLs es hätte die Erweiterung .tlb); Der beste Weg, um Typbibliotheken zu betrachten, ist der OLE/COM-Objekt-Viewer oleview.exe, der hoffentlich in der bin Datei Ihres Plattform-SDKs enthalten ist.