☆ IDA Pro的COM Helper插件使用方法 https://scz.617.cn/windows/200709122045.txt 我研究了一下使用步骤: a. 去Plugins子菜单里选COM Helper。这是一个乒乓开关,没法提前判断当前状态是ON 还是OFF,你得选了之后才知道。无论如何,确保其为ON。 b. 打开Structures窗口,确认GUID结构在里面,没有的话就得自己把GUID结构加进去。 注意,可能有CLSID、IID,就是没有GUID,这种情况下如果不自己把GUID结构加进去, COM Helper插件不干活。 c. 去IDA主窗口,或者去Hex View窗口,用你能想到的各种办法定位那些周知GUID,举 几个例子: {00000000-0000-0000-C000-000000000046} IID_IUnknown {00020400-0000-0000-C000-000000000046} IID_IDispatch {A6EF9860-C720-11D0-9337-00A0C90DCAA9} IID_IDispatchEx {00000001-0000-0000-C000-000000000046} IID_IClassFactory {BB1A2AE1-A4F9-11CF-8F20-00805F2CD064} IID_IActiveScript {2933BF87-7B36-11D2-B20E-00C04F983E60} IID_IXMLDOMText 先u掉16字节数据,然后应用GUID结构(选中起始地址点右键菜单),如果是周知GUID, 就会自动改名成有意义的符号,比如: CLSID_IUnknown CLSID_IDispatch CLSID_IDispatchEx CLSID_IClassFactory CLSID_IActiveScript CLSID_IXMLDOMText 虽然不尽人意,但也算可读符号吧。像IID_NULL,估计全零太普通了,不算周知GUID, 未被该插件处理。该插件能处理哪些周知GUID,我也不关心,反正试错了也没副作用, 试呗。 最大的问题是,你得确定那16字节是一个GUID,而不是其它数据结构。 d. 去Structures窗口,现在增加了几个结构定义: -------------------------------------------------------------------------- 00000000 IUnknownVtbl struc ; (sizeof=0xC, standard type) 00000000 QueryInterface dd ? ; offset 00000004 AddRef dd ? ; offset 00000008 Release dd ? ; offset 0000000C IUnknownVtbl ends -------------------------------------------------------------------------- 00000000 IDispatchVtbl struc ; (sizeof=0x1C, standard type) 00000000 QueryInterface dd ? ; offset 00000004 AddRef dd ? ; offset 00000008 Release dd ? ; offset 0000000C GetTypeInfoCount dd ? ; offset 00000010 GetTypeInfo dd ? ; offset 00000014 GetIDsOfNames dd ? ; offset 00000018 Invoke dd ? ; offset 0000001C IDispatchVtbl ends -------------------------------------------------------------------------- 00000000 IDispatchExVtbl struc ; (sizeof=0x3C, standard type) 00000000 QueryInterface dd ? ; offset 00000004 AddRef dd ? ; offset 00000008 Release dd ? ; offset 0000000C GetTypeInfoCount dd ? ; offset 00000010 GetTypeInfo dd ? ; offset 00000014 GetIDsOfNames dd ? ; offset 00000018 Invoke dd ? ; offset 0000001C GetDispID dd ? ; offset 00000020 InvokeEx dd ? ; offset 00000024 DeleteMemberByName dd ? ; offset 00000028 DeleteMemberByDispID dd ? ; offset 0000002C GetMemberProperties dd ? ; offset 00000030 GetMemberName dd ? ; offset 00000034 GetNextDispID dd ? ; offset 00000038 GetNameSpaceParent dd ? ; offset 0000003C IDispatchExVtbl ends -------------------------------------------------------------------------- 00000000 IClassFactoryVtbl struc ; (sizeof=0x14, standard type) 00000000 QueryInterface dd ? ; offset 00000004 AddRef dd ? ; offset 00000008 Release dd ? ; offset 0000000C CreateInstance dd ? ; offset 00000010 LockServer dd ? ; offset 00000014 IClassFactoryVtbl ends -------------------------------------------------------------------------- 00000000 IActiveScriptVtbl struc ; (sizeof=0x40, standard type) 00000000 QueryInterface dd ? ; offset 00000004 AddRef dd ? ; offset 00000008 Release dd ? ; offset 0000000C SetScriptSite dd ? ; offset 00000010 GetScriptSite dd ? ; offset 00000014 SetScriptState dd ? ; offset 00000018 GetScriptState dd ? ; offset 0000001C Close dd ? ; offset 00000020 AddNamedItem dd ? ; offset 00000024 AddTypeLib dd ? ; offset 00000028 GetScriptDispatch dd ? ; offset 0000002C GetCurrentScriptThreadID dd ? ; offset 00000030 GetScriptThreadID dd ? ; offset 00000034 GetScriptThreadState dd ? ; offset 00000038 InterruptScriptThread dd ? ; offset 0000003C Clone dd ? ; offset 00000040 IActiveScriptVtbl ends -------------------------------------------------------------------------- 00000000 IXMLDOMTextVtbl struc ; (sizeof=0xD0, standard type) 00000000 QueryInterface dd ? ; offset 00000004 AddRef dd ? ; offset 00000008 Release dd ? ; offset 0000000C GetTypeInfoCount dd ? ; offset 00000010 GetTypeInfo dd ? ; offset 00000014 GetIDsOfNames dd ? ; offset 00000018 Invoke dd ? ; offset 0000001C get_nodeName dd ? ; offset 00000020 get_nodeValue dd ? ; offset 00000024 put_nodeValue dd ? ; offset 00000028 get_nodeType dd ? ; offset 0000002C get_parentNode dd ? ; offset 00000030 get_childNodes dd ? ; offset 00000034 get_firstChild dd ? ; offset 00000038 get_lastChild dd ? ; offset 0000003C get_previousSibling dd ? ; offset 00000040 get_nextSibling dd ? ; offset 00000044 get_attributes dd ? ; offset 00000048 insertBefore dd ? ; offset 0000004C replaceChild dd ? ; offset 00000050 removeChild dd ? ; offset 00000054 appendChild dd ? ; offset 00000058 hasChildNodes dd ? ; offset 0000005C get_ownerDocument dd ? ; offset 00000060 cloneNode dd ? ; offset 00000064 get_nodeTypeString dd ? ; offset 00000068 get_text dd ? ; offset 0000006C put_text dd ? ; offset 00000070 get_specified dd ? ; offset 00000074 get_definition dd ? ; offset 00000078 get_nodeTypedValue dd ? ; offset 0000007C put_nodeTypedValue dd ? ; offset 00000080 get_dataType dd ? ; offset 00000084 put_dataType dd ? ; offset 00000088 get_xml dd ? ; offset 0000008C transformNode dd ? ; offset 00000090 selectNodes dd ? ; offset 00000094 selectSingleNode dd ? ; offset 00000098 get_parsed dd ? ; offset 0000009C get_namespaceURI dd ? ; offset 000000A0 get_prefix dd ? ; offset 000000A4 get_baseName dd ? ; offset 000000A8 transformNodeToObject dd ? ; offset 000000AC get_data dd ? ; offset 000000B0 put_data dd ? ; offset 000000B4 get_length dd ? ; offset 000000B8 substringData dd ? ; offset 000000BC appendData dd ? ; offset 000000C0 insertData dd ? ; offset 000000C4 deleteData dd ? ; offset 000000C8 replaceData dd ? ; offset 000000CC splitText dd ? ; offset 000000D0 IXMLDOMTextVtbl ends -------------------------------------------------------------------------- 你可以继续在IDA主窗口中应用这些结构,增加汇编代码可读性。 lyx说他以前尝试用过这个插件,没啥反应。正好最近折腾COM逆向、调试方面的事情, 就研究了一下这个插件,想看它到底能干啥。勉强算是有点辅助作用吧,相比定位函 数指针表、从TLB中获取符号信息等等,这个插件对我们的帮助实在不值一提。