window COM调试2[转]

  • Post author:
  • Post category:其他


查看完整版本 :

【求助】如何调试COM

rufus
2006-12-30, 14:46:25

大家有没有过调试COM DLL方面的经验啊。

遇到一程序,注册验证是写在COM DLL中的。

qiweixue
2006-12-30, 15:26:07

初始化:COM DLL之时,也就是初始化COM接口地时候,这时候保存接口地虚拟地址

.比如断::

DllCanUnloadNow

DllGetClassObject

DllRegisterServer

DllUnregisterServer

DLLGetDocumentation

还断微软提供COM API 详细在MSDN

gx_sz
2006-12-30, 15:32:51

以前Hook 过Com组件的函数。

主要是

CoCreateInstance,

CoGetClassObject

等创建组件的函数,

当发现指定的 CLSID创建的时候,就hook这个组件相应的接口函数。

kisser1
2006-12-30, 17:28:04

呵呵,,,对于COM组件,得了解COM的原理。

对于上面两位同志所说的,似乎不能跟进COM组件里面的某个函数。

这里有一个方法:用OD加载wscript,参数为*.wsf文件,使用它出错,那么,OD就会拦截下来,之后,就是往回找咯。

呵呵,,,这是没办法中的办法。

qiweixue
2006-12-30, 18:41:21

最初由 kisser1 发布

呵呵,,,对于COM组件,得了解COM的原理..

对于上面两位同志所说的,似乎不能跟进COM组件里面的某个函数。

DllGetClassObject(Load com dll)调用->CoCreateInstance(根据接口)建立com对象….

有了com对象地址,也就是com接口表,也就有了一切:该COM对象所有地接口指针

再逆向COM表某个接口指针或说函数方法,只是时间问题….

另外COM接口函数地虚拟地址都是常量,大多数COM对象指针是动态分配堆指针.

恐怕你只见树木不见林.

nbw
2006-12-30, 19:07:26

总之结果只有一个:从导出函数基本找不到,只有从代码里面看了。代码里面也看不到那就差不多跟我一样郁闷了。

softworm
2006-12-30, 19:26:24

有个IDA插件,叫什么名字忘了,可以读取类型库数据识别出方法名

rufus
2006-12-31, 09:58:52

谢谢各位大虾的回复.

是比较难,不像常规的DLL那样查找导出函数,只能通过DllGetClassObject查到某个方法的地址指针,但是不知道怎么跳到这个方法中去,哎.

WisdomZh
2006-12-31, 11:02:09

只好先跟进去咯

rufus
2006-12-31, 11:26:57

能找到执行的代码就好咯.

程序是用VB写的.好像是用oleau32.dll来跳到com dll的代码中去.

跟了半天没有一点头绪.

kisser1
2006-12-31, 15:39:43

哈哈,,,其实,如果是只跟他们的接口的话,有个很简单的方法咯。

这里给出我的到的方法吧,希望对各位有用咯(似乎只适合实现了自动化的COM组件,未研究清楚)。原理,就是IDispatch接口。

由于在调用COM组件里面某个函数时,COM库会去分发,然后再调用COM里面的函数,那么,我们就在它分发的时候先把它拦截下来,之后再单步跟入某个函数。

好。那么就在它分发的时候拦截下来!

但是,它是在哪分发呢?呵呵,在这里不用你去找啦,我已经找出来了,关键函数:DispCallFunc,位于OLEAUT32.dll。只要在OD里,在这个函数设断,运行,然后,OD就拦截下来了,在DispCallFunc函数一直“单步步过”,直到见到Call near ecx时,我们就来到了进入COM里面某个函数的边缘了!那还等什么?就差一步“步进”,就来到了COM里面的某个函数的入口点了。

简单不?

呵呵,,,是很简单咯,我写了一篇文章,是关于如何调试跟踪COM组件的附带实例,但是,我在里面加了好多图片,不知道如何在这发,,呵呵,,,非常不好意思!

rufus
2006-12-31, 16:46:51

谢谢楼上的,我在跟的时候也跟到了DispCallFunc,对oleau32.dll也不熟,呵呵。见了面也不认识,郁闷啊。等搞定验证以后,写个教程出来。

再问个问题:DispCallFunc跳到入口以后,那些参数是怎么处理的?

WisdomZh
2007-01-02, 15:20:54

参数是压栈进去的, 它有一个调用规范, 我原先用汇编实现过, 查一下资料就行了

xiaoguizi
2007-01-04, 22:29:16

请qiweixue和 WisdomZh以及其它dx能够再明指一些,小弟最近在bp一个程序时候,跟到ole32.dll的createInstance,里面东西实在太多。(这个dll和oleau32.dll的方式不同,所以上面几位dx说的IDispatch*对我真的只是参考了。。。)

这个位置实现了访问注册表或者访问程序开始保存的某个表项的数据,然后和当前时间进行比较,如果在其试用期3天内可以继续,否则部分功能不能继续。小弟已经跟了陆续好多天了,下了查询注册表的函数以及得到当前时间的函数,都没有能断下来,实在难以理解,可能是程序调用的dll里面进行了判断,

benzeng
2007-01-08, 17:54:51

IDA 4.8有一个COM symbol loader,对于DLL形式的COM组件,一般可方便取得接口的入口。EXE形式的COM组件,要确定接口的入口,一般只能分析代码了。

想调试进程外的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