跟踪调试 COM 组件的接口 Edit by hklzt刚一开始,对于COM组件的接口,真的不知如何下手,就更谈不上调试IE里的某个 ActiveX控件了在Snake的熏陶下,我经过一翻努力,终于找到了一种方法可以跟踪调试 COM组件的接口为了跟踪调试COM组件的接口,这里需要先了解一些基本知识Idispatch 接口如下: interface IDispatch : IUnknown {virtual HRESULT GetTypeInfoCount(UINT* pctinfo) = 0;virtual HRESULT GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo) = 0;virtual HRESULT GetIDsOfNames (REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid) = 0;virtual HRESULT Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr ) = 0;}1、 GetTypeInfoCount():用于获取自动化组件支持的ITypeInfo接口的数目。
2、 GetTypeInfo():用于获取指针ITypeInfo接口的指针,通过该指针将能够判断自动化 服务程序所提供的自动化支持3、 GetIDsOfNames():读取一个函数的名称并返回其调度ID (DISPID)DISPID* rgdisped:是一个long类型的数据,对于IDispatch的一个特定实现,此DISPID 值应该是唯一的REFIID riid:为保留参数,必须设置为IID_NULL,在rgszNames中指定了成员的函数 名及其参数,由cNames标识了名字的个数,lcid参数用于指定本地化标识,得到的DISPID 将保存到rgdispid中4、 Invoke():提供了访问自动化对象暴露出来的方法和属性的方法将DISPID作为函数指针数组的索引传入dispidMember参数,Invoke ()将实现一组按 此索引来访问的函数riid和lcid的含义与在GetIDsOfNames ()中的定义相同,分别为保留参数和本地化标 识WORD wFlags:指定了要访问的是接口的属性还是方法DISPPARMS* pdispparams:包括了方法和属性调用的参数数组、DISPID数组以及数组 中参数个数等信息。
VARIANT* pvarResult:保存返回值信息EXCEPINFO* pexcepinfo:指向一个有效的异常信息结构 UINT * PuArgEm 包含了第一个产生错误的参数指针综合以上,可以了解到:通过GetIDsOfNames ()和Invoke ()的结合使用,将可以根 据函数名称对方法和属性进行调用这样,函数地址、AddRef ()、Release()以及接口指 针等细节问题将无需考虑基于以上的分析,对于COM里面某个函数的定位思路是:由于在调用COM里面某个 函数时,会去分发,然后再调用COM里面的函数,那么,我们就在它分发的时候先把它拦 截下来,之后再单步跟入某个函数那么就在它分发的时候拦截下来! 但是,它是在哪分发呢?呵呵,在这里不用你去找啦,我已经找出来了,关键函数: DispCallFunc,位于 OLEAUT32.dl 1如下图:TT5F6D2677629AAI:7761AC5277629ACE.text.text.text出出出出输输输输Di EpCallFuncD i spGe till sO £ff:djri e 吕 Di EpGetF:±r:diTiDi EpIrLTuke■4个参数8于参数至于为什么不是在COM库:OLE32.dll里面,已经很明显了。
分发的地方现在是已经拦截下来了,但是,COM里面的某个函数还没定位出来呀?跟下来吧在DispCallFunc函数一直“步过”,直到见到Call near ecx时,我们就来到 了进入COM里面某个函数的边缘了!那还等什么?就差一步“步进”就来到了 COM里 面的某个函数的入口点了简单不?下面来一个实例使用工具: COMRaider, OD目标:vuln.dll(COMRaider里面的一个测试DLL)开始:1、 先确认vuln.dll已经被注册过了,如果没有,则需要注册:regsvr32 X:\idefense\comraider\vuln.dll2、 运行 COMRaider,单击 “Start” 如图 1:图13、单击“Next”选择vuln.dll文件,来到如图2:图24、随便选择一个成员函数,这里选择 Method3,在其上面右击,选择“ Fuzzmember",女口图 3图35、单击“ Next>>”图46、随便选择一个文件名,在其上面右击,选择“Launch in Oily”,此时,会调用 Olly 来加载它,加载完毕后,断点在入口点了7、在OD里,选择菜单“查看”-> “可执行模块”,或者按Alt+E,如图5:OllyDbg - Tscript. exe -[可执行模块]基址犬小入口名称文件版本路径A010000000001C00001003C72w e cr i p tc\WINBOWS\System32\wscript, exe630900000000900063092EB2LFK5.2.3790. 1830 (c\WINB0WS\System32\LFK. DLL74AE00000006100074B189ACVSP101.0422.3790. 183(c\WIKD0WS\System32\USF10. dll761800000001D000761812D0IMM325.2.3790. 1830 (c\WINL0WS\System32\IMM32. dll774B000000134000774F5BD3ole325.2.3790.2492 (:cWINDOWS\sys tem32\ole32. dll775F00000008C000775F3FAB0LEAUT325.2.3790. 1830c\WINBOWS\sys t em32 VOLEAUT32. dll77E600000000800077B61186VERSION5.2.3790. 1830 (c\WIKD0WS\system32\VERSION, dll77B700000005AO0077B7F78Bmsvert7.0.3790. 1830 (c\WINL0WS\SyStem32\mSvcrt. dll77ED00000004800077BDB24DGDI325.2.3790.2606 (:c^WINDOWS\sys t em32\GDI32. dll77C200000009F00077C45051RFCRT45.2.3790. 1830 (c\WINBOWS\sys t em32\RFCRT4. dll77E100000009100077E1944CVSER325.2.3790. 1830 (c\WIKD0WS\system32\USER32. dll77F30000000AC00077F4DFA5ABVAPI325.2.3790. 1830 (;c\WIKDOWS\Sys t em32\ABVAFI32. dll1 1 . If f r r rr fVr r j匡]文件的查看②调试⑪插件迥选项①窗口址)帮助⑩ -3 XLo.ad Library WI程序入口点 I I暂停图58、双击OLEAUT32,然后按CTRL+N,在里面找到DispCallFunc函数,选择它, 按 F2 为其设断点。
如图 6、 7OllyDbg - vscript. exe - [CPU - 主线程,模块 - OLEAUT32] □回区775775775Fl 000Fl 004F1008.3C42F577 816FF377 207FF477dd dd ddADVAPI32.RegFluSKKALVAFI32. RegCreateALVAFI32. ReggetValeyKeyA ueExA775F100C.0D59F477ddADVAPI32.Reg0penKeyA775775F1010I F1014.4B58F477FE6FF377RRWTlFdTTdddd ADVAPI32. RegQueryVALVAFI32. RegEnumVa dn 讥 PT39 BabFEMa:alueA lueA t/F*v bI HEX数据地址A地址 |ho数据 I反汇编 |注释 _ ・|aIasc01011000010110100101102044 FF FF1A 00 0100 00 0040 BB 00 0042 00 00 0000 00 00 0000 00 00 0000 00 00 00DO 1A 00 0100 00 00 001D4 1A 00 0145 00 00 00地址数值|注释0013FFC47C8123E5返可I0013FFC8I0013FFCC0000000000000000=?., D..叵I文件® 查看② 调试⑪ 插件迥 选项⑴ 窗口⑩ 帮助⑪ -S' XTTIUr=菸1.京w可T'rs程序入口点图 6 在此按 CTRL+N图7 选择DispCallFunc,按F2设断至此,准备工作已经完毕。
下面进行关键步骤9、按F9,让它运行起来,稍等一会,OD马上就把DispCallFunc给拦截下来了图810、一直按F8,单步步过进行跟踪,直到见到Call near ecx时,停下来,如图:图911、到此,我们已经来到了进入COM组件里面某个函数入口的边缘了,单步步进图 10哈哈,再单步,我们就进入到了此函数的入口点图 11怎么样?跟踪COM的某个函数简单吧?赶快试下其他的COM卩巴!。