查看完整版本 :
【求助】如何调试COM
遇到一程序,注册验证是写在COM DLL中的。
.比如断::
DllCanUnloadNow
DllGetClassObject
DllRegisterServer
DllUnregisterServer
DLLGetDocumentation
还断微软提供COM API 详细在MSDN
主要是
CoCreateInstance,
CoGetClassObject
等创建组件的函数,
当发现指定的 CLSID创建的时候,就hook这个组件相应的接口函数。
对于上面两位同志所说的,似乎不能跟进COM组件里面的某个函数。
这里有一个方法:用OD加载wscript,参数为*.wsf文件,使用它出错,那么,OD就会拦截下来,之后,就是往回找咯。
呵呵,,,这是没办法中的办法。
呵呵,,,对于COM组件,得了解COM的原理..
对于上面两位同志所说的,似乎不能跟进COM组件里面的某个函数。
DllGetClassObject(Load com dll)调用->CoCreateInstance(根据接口)建立com对象….
有了com对象地址,也就是com接口表,也就有了一切:该COM对象所有地接口指针
再逆向COM表某个接口指针或说函数方法,只是时间问题….
另外COM接口函数地虚拟地址都是常量,大多数COM对象指针是动态分配堆指针.
恐怕你只见树木不见林.
是比较难,不像常规的DLL那样查找导出函数,只能通过DllGetClassObject查到某个方法的地址指针,但是不知道怎么跳到这个方法中去,哎.
程序是用VB写的.好像是用oleau32.dll来跳到com dll的代码中去.
跟了半天没有一点头绪.
这里给出我的到的方法吧,希望对各位有用咯(似乎只适合实现了自动化的COM组件,未研究清楚)。原理,就是IDispatch接口。
由于在调用COM组件里面某个函数时,COM库会去分发,然后再调用COM里面的函数,那么,我们就在它分发的时候先把它拦截下来,之后再单步跟入某个函数。
好。那么就在它分发的时候拦截下来!
但是,它是在哪分发呢?呵呵,在这里不用你去找啦,我已经找出来了,关键函数:DispCallFunc,位于OLEAUT32.dll。只要在OD里,在这个函数设断,运行,然后,OD就拦截下来了,在DispCallFunc函数一直“单步步过”,直到见到Call near ecx时,我们就来到了进入COM里面某个函数的边缘了!那还等什么?就差一步“步进”,就来到了COM里面的某个函数的入口点了。
简单不?
呵呵,,,是很简单咯,我写了一篇文章,是关于如何调试跟踪COM组件的附带实例,但是,我在里面加了好多图片,不知道如何在这发,,呵呵,,,非常不好意思!
再问个问题:DispCallFunc跳到入口以后,那些参数是怎么处理的?
这个位置实现了访问注册表或者访问程序开始保存的某个表项的数据,然后和当前时间进行比较,如果在其试用期3天内可以继续,否则部分功能不能继续。小弟已经跟了陆续好多天了,下了查询注册表的函数以及得到当前时间的函数,都没有能断下来,实在难以理解,可能是程序调用的dll里面进行了判断,
想调试进程外的COM+组件,可以有以下的办法:
. EXE组件,直接Attach该EXE进程
. DLL COM+组件,COM+组件由dllhost.exe调用,找某个COM+组件对应用的dllhost.exe
可以这样操作:
. 在“组件配置”中,关闭相应的COM+应用
. 打开任务管理器,启动相应的COM+应用,观察新增加的dllhost.exe进程。
. 对于远程的情况,可以直接使用VC的远程调试功能,但需要配置两台机器的访问权限。也可两端分别启动一个VC进行调试。
另外,在“组件配置”中,把COM+组件变成在进程内激活,这样DLL形式的COM组件可以直接DEBUG进去。
没有办法时,只好在合适的位置插入一个INT 3了。
转载于:https://www.cnblogs.com/Dennis-mi/articles/3457106.html