原帖:https://bbs.csdn.net/topics/392434614
自己写个名字叫做XCDZIP35.OCX的组件,把XCDZIP35.OCX的注册信息替换掉,我想问一下
1.旧XCDZIP35.OCX是不是得改名(能改名吗)
2.旧XCDZIP35.OCX的UUID是不是得改
3.新的XCDZIP35.OCX的UUID是不是应该跟未改动前的旧的XCDZIP35.OCX一样

解决方案 »

  1.   

    我看了你的原贴, 首先得确认一下调用ocx的程序是不是你写的?
    如果是你写的, 那么你只为了记录调用ocx时的参数, 那这些参数肯定通过你程序的某个方法的, 你完全可以直接记录
    但如果程序不是你写的, 你无法直接记录的话, 那你再做一个ocx做中转的作用就没什么用了, 我建议你还是去研究赵4的方法吧
    旧ocx不是你写的, 你不能重新编译, 那就代表你无法改变它的 uuid
    ocx的调用是根据类名去注册表查询ocx的信息, 如果你把旧ocx的信息替换成你新的ocx, 那么程序能调用你的ocx
    但问题是你的新ocx是根据旧ocx的信息去加载旧ocx的, 而旧ocx的注册信息已经替换成新ocx的信息了, 那你猜猜会发生什么事情
      

  2.   

    你好!
    确实都不是我写的,是感觉有点复杂,我也查了一下,旧OCX无法改变其UUID,所以新OCX调用旧OCX可能导致新OCX起不到中间作用
      

  3.   

    建议一个偷偷替换的方法,看是否可行。步骤如下:
    1.把旧的XXXX.ocx修改文件名,然后注册了,不告诉别人你是用这个控件,别人就不知道了
    2.自己编写一个新的ocx控件,然后在这个控件内部的窗口OnCreate消息中自己建立这个控件对象,显示在新的控件的窗口区中
    3.给新的ocx控件建立一些方法和消息,实际就是转发旧的ocx控件的方法和消息,当然你可以稍微修改一下函数参数等
      

  4.   

    今天想试试修改OCX里的PutPassword的代码,想跟进去OCX里看看这个方法的代码是哪段,跟来跟去,跟不到,用了VS2010的tstcon,OCX加载的时候地址是在10100000上吧,结果调试的时候一直在tstcon里转,到不了,本来想在反汇编里截指令代码在OCX文件里面或用OD加载找,找不到!!头大,不知代码在哪,不知如何下断点
      

  5.   

    WinAPIOverride32
    WinAPIOverride64
      

  6.   

    赵老师有没有WinAPIOverride64的使用说明
      

  7.   

    一直没有发现钩了OCX,只看到MFC40,MFC100,是在哪设置,赵老师
      

  8.   

    上面只看到调用都的地址,但OCX里的我猜测没有,因为是加载到10001000上的吧
      

  9.   

    C:\WinApiOverride\WinAPIOverride.chm
      

  10.   

    我看了说明的,还是有点不明白,加载后HOOKE显示成功,但就是不能显示调用OCX的入口
      

  11.   

    关闭UAC、防火墙、杀毒软件、……
    以管理员身份运行
    ……
      

  12.   

    谢谢,我设置一下,还要请问一下,调试的时候,我查了内存,我的OCX确实是加载在10001000地址上的,我用IDA加载TSTCON32,调试OCX,始终到了不这个地方(代码部分),是不是我思路有问题呢,调试不到OCX里面
      

  13.   

    不知道赵4老师有没有这个介绍If an interface A is derived only from IUnknown we have pInterfaceA QueryInterface 
    AddRef 
    Release 
    InterfaceA_Method_1 
    InterfaceA_Method_2 
    ... 
    InterfaceA_Method_N 
     In this case we have pInterfaceA==pIUnknown  
    If an interface B is derived from IDispatch we have pInterfaceB QueryInterface 
    AddRef 
    Release 
    GetTypeInfoCount  
    GetTypeInfo 
    GetIDsOfNames 
    Invoke 
    InterfaceB_Method_1 
    InterfaceB_Method_2 
    ... 
    InterfaceB_Method_N 
     In this case we have pInterfaceB==pIUnknown==pIDispatch WinAPIOverride对OCX的文件结构分析,但各部分的大小怎么算
      

  14.   

    按我的想法,我不会使用这种文件+注册表替换方式,而是运行时替换。
    简单概括:抢先注册类厂。
    工作原理是自己有代码在主进程中执行,自己写的代码好说,别人的二进制应用就下钩子,然后预先加载自己的组件,保证在请求原组件之前加载即可。在我的组件被加载时,由组件自己注册同CLSID的类厂,剩下的事情就不用考虑了,系统创建组件会直接使用你注册的类厂,而不是读注册表寻找原组件。这种方式的应用非常简单成熟,早期我把V8脚本引擎封装成符合ms的脚本规范,然后使用IE控件,启动的脚本引擎是我的封装库,而不是jscript.dll,就是想跟IE自带的脚本引擎做一个性能对比。
      

  15.   

    嗯,都是不错的想法,我正看COM原理与应用及技术内幕,看完再请教