逆向com(2)---逆向atl
刚刚弄了一下用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.