2012-03-29 10 views
9

Sto provando a progettare un'applicazione in grado di identificare gli oggetti COM e le loro proprietà su qualsiasi altra applicazione. Questa è la mia prima volta che cerco di farlo, e non sono sicuro da dove iniziare nemmeno. Idealmente, sarebbe stato realizzato usando Delphi XE2, ma sono aperto a suggerimenti.Identificazione/elenco di oggetti COM e proprietà da software di terze parti

Se si dispone del CLSID, esiste un modo per "analizzare" un'applicazione in esecuzione per quali oggetti sono stati basati su di esso? O, andando in un altro modo, c'è un modo migliore per elencare/trovare oggetti attivi in ​​qualsiasi applicazione in esecuzione?

Qualsiasi aiuto è molto apprezzato, così come ogni indicazione verso una buona documentazione sull'argomento.

Modifica: Il problema è in realtà trovare gli oggetti COM in qualsiasi altra applicazione, elencando proprietà e qualsiasi altra cosa ho bisogno è già stata risolta in altre domande.

+0

Inserire il codice in un'altra applicazione che chiamerebbe GetActiveObject per tutti gli oggetti applicazione noti nel sistema. Scusa, non riesco a pensare ad altro. –

+0

Hai provato la [GetRunningObjectTable] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684004%28v=vs.85%29 .aspx) funzione? – RRUZ

+0

Ho avuto un successo limitato con ROT, poiché apparentemente l'applicazione deve registrare esplicitamente gli oggetti, che non è sempre il caso. –

risposta

6

Non esiste alcun modo per cercare oggetti COM in esecuzione. Non appena vengono istanziati, sono solo parti di memoria a cui fa riferimento qualcos'altro (variabili del puntatore dell'interfaccia membro, ecc.).

A volte gli oggetti vengono inseriti nella tabella degli oggetti in esecuzione (ROT) e possono essere recuperati da lì, come già suggerito nei commenti. Questo attribuisce, diciamo, al < 1% di istanze di oggetti COM, ma forse sei abbastanza fortunato da inseguirli esattamente.

L'unico modo in cui posso pensare è l'istanza di oggetti COM gancio in modo che si intercetti la creazione e quindi essere in grado di tenere traccia del proprio elenco di istanze esistenti. Anche questo non è un modo semplice (ed è anche molto probabile che non sia sicuro).

Per ottenere ciò è necessario registrare l'oggetto di classe nel contesto del processo in esecuzione per lo CLSID del proprio interesse e fare in modo che la fabbrica di classe riceva le chiamate di istanziazione. O collegare l'API CoCreateInstance, ad esempio con Detours.

Una volta che si collega l'istanza, al momento della creazione dell'oggetto ci sono dei puntatori e bisogna ancora fare qualcosa con loro. Dovresti inoltrare queste chiamate di istanziazione all'API originale, quindi tracciare il tempo di vita delle istanze: se inserisci un riferimento extra all'oggetto, è probabile che tu modifichi il comportamento originale dell'applicazione. Altrimenti, non hai il controllo per intercettare la pubblicazione dell'oggetto COM. A volte le classi COM possono essere create aggregate e puoi incorporare più o meno in modo pulito l'istanza originale nel tuo oggetto COM.

Tutto sommato, in generale l'attività non sembra attuabile. Avere uno specifico CLSID di interesse, con una certa fortuna e un po 'di sforzo, potrebbe comunque riuscire a farlo.

+0

Forse mi sto avvicinando a questo nel modo sbagliato e complicando le cose? Devo essere in grado di leggere alcune etichette e modifiche a un'applicazione sviluppata in VB6, ma non ho accesso ai codici sorgente. Per fare ciò, diresti che dovrei ancora agganciare le istanze? –

+0

@Roman, è possibile ottenere informazioni da ROT su quale processo (client) ha richiamato una voce (se presente)? In caso contrario, il secondo paragrafo è irrilevante rispetto alla domanda, poiché la domanda chiede come sapere quali oggetti sono stati istanziati da un particolare processo. –

+0

@MPR, la mia opinione è che la memoria di scansione per le istanze è sicuramente il modo sbagliato. Dato che hai una firma dell'istanza, l'heap dell'istanza situata su etc sembra ancora un processo estremamente doloroso. Ma sembra che tu sappia molto di più sui tuoi oggetti: controlli ActiveX? Se lo sono, esp. windowed, quindi puoi trovare le finestre dei controlli e, se sono basate su ATL, è probabile che tu possa usare i messaggi ATL per ottenere interfacce da 'HWND's, e se questo hook funziona, sei a posto sull'enumerazione delle proprietà tramite interfacce ben note. –

Problemi correlati