逆向com(2)---逆向atl

逆向com(2)---逆向atl

分类: Programing 2006-06-19 17:12

刚刚弄了一下用vc6编译,使用了atl的com反汇编,写出来.

前提知识:

1,com中有部分重复而繁杂的操作,每写一个com程序,就要把这写代码,copy一遍,很麻烦.atl所做的工作就是为com搭建框架,把这些繁杂的操作包装起来,让的注意力集中在com的实现上.

2,atl中三个重要的结构, 最好把它们的作用搞明白:

struct _ATL_OBJMAP_ENTRY
{
 const CLSID* pclsid;
 HRESULT (WINAPI *pfnUpdateRegistry)(BOOL bRegister);
 _ATL_CREATORFUNC* pfnGetClassObject;
 _ATL_CREATORFUNC* pfnCreateInstance;           //注意这里
 IUnknown* pCF;
 DWORD dwRegister;
 _ATL_DESCRIPTIONFUNC* pfnGetObjectDescription;
 _ATL_CATMAPFUNC* pfnGetCategoryMap;
 HRESULT WINAPI RevokeClassObject()
 {
  return CoRevokeClassObject(dwRegister);
 }
 HRESULT WINAPI RegisterClassObject(DWORD dwClsContext, DWORD dwFlags)
 {
  IUnknown* p = NULL;
  if (pfnGetClassObject == NULL)
   return S_OK;
  HRESULT hRes = pfnGetClassObject(pfnCreateInstance, IID_IUnknown, (LPVOID*) &p);
  if (SUCCEEDED(hRes))
   hRes = CoRegisterClassObject(*pclsid, p, dwClsContext, dwFlags, &dwRegister);
  if (p != NULL)
   p->Release();
  return hRes;
 }
// Added in ATL 3.0
 void (WINAPI *pfnObjectMain)(bool bStarting);
};

 

 

struct _ATL_MODULE
{
// Attributes
public:
 UINT cbSize;
 HINSTANCE m_hInst;
 HINSTANCE m_hInstResource;
 HINSTANCE m_hInstTypeLib;
 _ATL_OBJMAP_ENTRY* m_pObjMap;       //注意这里
 LONG m_nLockCnt;
 HANDLE m_hHeap;
 union
 {
  CRITICAL_SECTION m_csTypeInfoHolder;
  CRITICAL_SECTION m_csStaticDataInit;
 };
 CRITICAL_SECTION m_csWindowCreate;
 CRITICAL_SECTION m_csObjMap;
// Original Size = 100
// Stuff added in ATL 3.0
 DWORD dwAtlBuildVer;
 _AtlCreateWndData* m_pCreateWndList;
 bool m_bDestroyHeap;
 GUID* pguidVer;
 DWORD m_dwHeaps;    // Number of heaps we have (-1)
 HANDLE* m_phHeaps;
 int m_nHeap;        // Which heap to choose from
 _ATL_TERMFUNC_ELEM* m_pTermFuncs;
};

 

class CComModule : public _ATL_MODULE

{

/*实现代码就省略*/

}

实际上,如果我们知道第一个结构,也就是_ATL_OBJMAP_ENTRY的内容的话,就可以,知道pfnCreateInstance;根据这个地址就可以顺藤摸瓜,找出,函数的实现.就这么简单

3,atl必须创建一个CComModule的对象,如"CComModule _Module;",这个类就是atl的"执行者".它包揽所有的杂活,如GetClasssObject,RegisterServer,等等.

 

开始反汇编:(只给快速反汇编过程,不给思路,写起来太麻烦)

1,找到dllmain,在里面找到ATL__CComModule__Init函数,传递给他的第一个参数就是,一个指向_ATL_OBJMAP_ENTRY结构的指针.跟进去

2,偏移为8的位置就是指向GetClassObject的指针,偏移为0xc的位置就是指向CreateInstance的指针,跟到CreateInstance函数里面去

3,这时候,按照上次写的"逆向com"里面的方法,来操作.也就是,先找new,然后找初始化函数.进入初始化函数,找到指向com类的函数数组指针,从偏移0xc的开始的函数,就是真正的函数了. enjoy it.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值