关于com接口调用的反汇编
来源:互联网 发布:中国历年gdp数据图表 编辑:程序博客网 时间:2024/05/18 02:48
只是为了测试,现在只写一个接口的自定义的两个函数
这是接口的定义
[object,uuid(C320028D-2E57-46FD-8D80-F24315B58543),dual,nonextensible,pointer_default(unique)]interface IDiction : IDispatch{HRESULT justTest();HRESULT test_3();};只有两个成员函数很简单吧,只是为了测试哈,现在看看调用COM的客户端的源代码
#include接连调用IDiction的两个接口而已,现在看看,起反汇编代码:重头戏来了#include using namespace std;#import"D:\project\Dic\Debug\Dic.dll" no_namespaceint _tmain(int argc, _TCHAR* argv[]){::CoInitialize(NULL);IDictionPtr test;test.CreateInstance(__uuidof(Diction));test->justTest();test->test_3();test.Release();::CoUninitialize ();return 0;}
.text:00401000 ; int __cdecl wmain(int argc, wchar_t **argv).text:00401000 _wmain proc near ; CODE XREF: __tmainCRTStartup+11Dp.text:00401000.text:00401000 test = _com_ptr_t<_com_IIID> ptr -10h.text:00401000 var_C = dword ptr -0Ch.text:00401000 var_4 = dword ptr -4.text:00401000 argc = dword ptr 8.text:00401000 argv = dword ptr 0Ch.text:00401000.text:00401000 push ebp.text:00401001 mov ebp, esp.text:00401003 push 0FFFFFFFFh.text:00401005 push offset __ehhandler$_wmain.text:0040100A mov eax, large fs:0.text:00401010 push eax.text:00401011 push ecx.text:00401012 push esi ; dwClsContext.text:00401013 push edi ; pOuter.text:00401014 mov eax, ___security_cookie.text:00401019 xor eax, ebp.text:0040101B push eax ; rclsid.text:0040101C lea eax, [ebp+var_C].text:0040101F mov large fs:0, eax.text:00401025 push 0 ; pvReserved.text:00401027 call ds:CoInitialize(x).text:0040102D mov [ebp+test.m_pInterface], 0.text:00401034 lea edi, [ebp+test].text:00401037 mov [ebp+var_4], 0.text:0040103E call _com_ptr_t<_com_IIID >::CreateInstance(_GUID const &,IUnknown *,ulong);这是调用的智能接口的CreateInstance.text:00401043 mov eax, [ebp+test.m_pInterface].text:00401046 test eax, eax;检测调用是否成功,如果不成功,则转到错误处理过程.text:00401048 jnz short $LN30.text:0040104A push 80004003h ; hr.text:0040104F call _com_issue_error(long).text:00401054 ; ---------------------------------------------------------------------------.text:00401054.text:00401054 $LN30: ; CODE XREF: _wmain+48j.text:00401054 mov ecx, [eax].text:00401056 mov edx, [ecx+1Ch];注意这个偏移量,1CH,我想这是justTest的所在,也就是说1CH是,该功能函数在接口中的偏移量.text:00401059 push eax.text:0040105A mov esi, eax.text:0040105C call edx;这是调用过程.text:0040105E test eax, eax;同上检测函数执行是否成功.text:00401060 jns short loc_40106E.text:00401062 push offset __GUID_c320028d_2e57_46fd_8d80_f24315b58543 ; riid这是接口的GUID.text:00401067 push esi ; punk.text:00401068 push eax ; hr.text:00401069 call _com_issue_errorex(long,IUnknown *,_GUID const &).text:0040106E ; ---------------------------------------------------------------------------.text:0040106E.text:0040106E loc_40106E: ; CODE XREF: _wmain+60j.text:0040106E mov eax, [ebp+test.m_pInterface].text:00401071 test eax, eax.text:00401073 jnz short $LN31.text:00401075 push 80004003h ; hr.text:0040107A call _com_issue_error(long).text:0040107F ; ---------------------------------------------------------------------------.text:0040107F.text:0040107F $LN31: ; CODE XREF: _wmain+73j.text:0040107F mov ecx, [eax].text:00401081 mov edx, [ecx+20h];20是test_3的偏移量.text:00401084 push eax.text:00401085 mov esi, eax.text:00401087 call edx;这是调用test_3功能的过程.text:00401089 test eax, eax;同上检测是否成功执行.text:0040108B jns short loc_401099.text:0040108D push offset __GUID_c320028d_2e57_46fd_8d80_f24315b58543 ; riid.text:00401092 push esi ; punk.text:00401093 push eax ; hr.text:00401094 call _com_issue_errorex(long,IUnknown *,_GUID const &).text:00401099 ; ---------------------------------------------------------------------------.text:00401099.text:00401099 loc_401099: ; CODE XREF: _wmain+8Bj.text:00401099 mov eax, [ebp+test.m_pInterface].text:0040109C test eax, eax.text:0040109E jnz short $LN32.text:004010A0 push 80004003h ; hr.text:004010A5 call _com_issue_error(long).text:004010AA ; ---------------------------------------------------------------------------.text:004010AA.text:004010AA $LN32: ; CODE XREF: _wmain+9Ej.text:004010AA mov ecx, [eax].text:004010AC mov edx, [ecx+8];这个就比较特殊了,经笔者测试,8是一个定值,也就是说Release的偏移量永远是8.text:004010AF push eax.text:004010B0 call edx.text:004010B2 mov [ebp+test.m_pInterface], 0.text:004010B9 call ds:CoUninitialize().text:004010BF mov [ebp+var_4], 0FFFFFFFFh.text:004010C6 mov eax, [ebp+test.m_pInterface].text:004010C9 test eax, eax.text:004010CB jz short loc_4010D5.text:004010CD mov ecx, [eax].text:004010CF mov edx, [ecx+8].text:004010D2 push eax.text:004010D3 call edx.text:004010D5.text:004010D5 loc_4010D5: ; CODE XREF: _wmain+CBj.text:004010D5 xor eax, eax.text:004010D7 mov ecx, [ebp+var_C].text:004010DA mov large fs:0, ecx.text:004010E1 pop ecx.text:004010E2 pop edi.text:004010E3 pop esi.text:004010E4 mov esp, ebp.text:004010E6 pop ebp.text:004010E7 retn.text:004010E7 _wmain endp
我们看下,这几个偏移量1C,20,24,之间间隔是4,也就是说每个函数地址的间隔是4,也就是说是虚函数表,他们的接口成员都是放在同一个虚函数表当中的,这下证实了书
中的话。好了,今天就到这儿吧,虽然还是没能知道__imp_baabba什么的是怎么实现的
- 关于com接口调用的反汇编
- 【汇编】gcc反汇编 关于函数调用
- 函数调用反汇编
- 函数调用反汇编
- 关于ios反汇编的总结
- 关于栈对齐的反汇编代码
- 关于反汇编引擎
- 反汇编之函数调用
- 关于 接口与对象指针对成员函数的调用时的汇编执行行为分析
- 反汇编反出来的
- 反汇编反出来的
- C++虚函数调用的反汇编解析
- C++虚函数调用的反汇编解析
- C++虚函数调用的反汇编解析
- C++虚函数调用的反汇编解析
- C++虚函数调用的反汇编解析
- C++虚函数调用的反汇编解析
- 高级语言函数调用的反汇编分析
- 我要积分
- 使用VC时一些容易犯的错误
- java中Calendar日期对象的一些简单应用
- python04 变量和变量的命名
- Definition of 'Strip'
- 关于com接口调用的反汇编
- 前端性能优化:使用Array.prototype.join代替字符串连接
- 在gnome3 修改eclipse 标签页高度过高的问题
- Magento组合查询语句的Complex_filter和Filter
- 双系统删除Linux引导(MbrFix.exe)
- Xp无法加载用户配置文件
- 英语
- shell sed
- hdu_1420 Prepared for New Acmer