none
如何通过32位程序让64位程序加载自己编写的64位dll RRS feed

  • 问题

  • 在windows7  x64环境中,  我的需求是通过全局钩子,让所有的进程加载我的dll。  但是发现32位程序只能使32位的进程加载我的32dll。  要编写成64位程序和dll,才对64位的进程有效。  问题是我不想因为这个实现1个功能而编写2个一样的程序和dll , 只不过就是32,64位的区别。  有什么办法,能通过我自己编写的32位程序,让64位进程也加载我的64dll。   比如说360安全卫士吧,  我看了下它所有的进程都是有*32的,  但是利用procexp查看,发现64位的程序也会加载他编写的64dll。请问这个功能大致要怎么实现呢?  注册表里有个键值那个不算吧,  我看了都没发现有360的dll。

    2012年3月28日 5:02

答案

  • WDK, codeproject

    GetNativeSystemInfo



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP

    • 已标记为答案 lygf666 2012年4月13日 6:35
    2012年4月13日 2:48
    版主

全部回复

  • 用hook不能实现。360那个估计是驱动的用户模态代码,写驱动比重新编译麻烦得多,你确定你要和360一样做?


    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP


    2012年3月28日 22:42
    版主
  • 但是。运行2个一样的程序(就32,64位区别)就为了一个功能,有点太窘。  或者有什么方便的方式实现我的需求也行。 是在不行该怎么样还是得怎么样吧,问题是我都没做过,也不大懂。想这个全局钩子 api拦截 也是这2个星期看windows核心编程现学的。  如果要进行驱动编程实现这个需求的话,  我只想知道大概的方向。 或者简单说 我去学习那些资料来解决这个问题。最好有书籍之类的, 书比较好入门, 对初学者有条理。 专看msdn 太大,太细了。

    2012年3月29日 1:55
  • 为这个去写驱动更加不值得。编译个64位版本的程序很困难么?



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP

    2012年3月29日 5:24
    版主
  • 那就写2个程序,一个32位,一个64位, 再写2个dll , 32和64的。  只是为了一个同样的功能,  就搞出来这么个窘的东西。  

    对了,可以先介绍我点学习的方向吗?  我以后还要 调研怎么实现  控制程序的网络访问, 如: 某进程不准它上网。 某网站或者网络链接不能访问,  光自己摸索实在没有信心。 我才工作不到1年,  在个小公司老板希望我来调研这些。为以后可能的项目作准备,  做成类似那种家长控制的软件。 

    本菜鸟感激不尽。   我只知道windows核心编程, 钩子之类的就是从上面现学的。  有没有类似的书籍讲windows ddk编程 和 网络编程和控制之类 的,  英文的也行。 光看msdn几乎不可能, 太详细了, 太多了。

    2012年3月29日 9:07
  • 你想编程控制windows的防火墙还是自己写一个?


    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP

    2012年3月29日 13:03
    版主
  • 反正就是在我的程序中可以控制我想控制的进程的网络访问吧,  很多软件都有这功能。   整个软件就是要做成像那种家长控制软件那样的,  现在还是调研阶段。  每调研一个功能就编写一个小程序看是否能实现,  主要是我也没什么开发经验。  不知道要从windows的那方面的api入手,  控制手段不需要太厉害(太厉害我也搞不来)。 应付一下小孩子就行了。 想前2个需求,禁止某些程序的启动和防止自己进程被任务管理器杀死  ,  就是通过全局钩子加载我编写的dll实现的。  现在问题是下面的需求我找不到实现的方向,  不知道有哪些资料 , 书籍会讲这些方面的。  像前面的钩子的使用,windows核心编程有讲。  现学现用呀,  it行业就这样 。  不过要不是这个机会,我也不知道什么时候能主动学习这些东西。

    2012年3月30日 1:45
  • 用全局钩子容易被杀毒软件杀死。。。

    如果你要解决32位64位的问题,可以将dll封装,或者使用COM+

    对于你描述的这个功能,我觉得做成service不就行了。


    麻烦把正确答案设为解答。

    2012年3月30日 6:07
    版主
  • 32位的服务也是利用dll封装, com+来实现吗?   具体点dll  com+  怎么实现 ,  32位程序没法加载64的dll,  com+的话给些这方面的实现资料吧。

    2012年3月30日 7:38
  • http://msdn.microsoft.com/zh-cn/library/ms229076(v=vs.80).aspx

    另外我记得有一个webcast讲怎么进行64位移植的。提到了这个。

    对于现有的32位进程内COM组件
       将COM组件封装为COM+服务
           创建服务器端应用程序
           COM+使用代理机制在32位和64位进程之间封送处理调用
    COM+能够识别不同的处理器体系结构的函数库
    不需要对原有COM组件和客户端应用程序进行修改,不需要重新编译


    麻烦把正确答案设为解答。

    2012年3月30日 8:17
    版主
  • http://msdn.microsoft.com/zh-cn/library/ms229076(v=vs.80).aspx

    另外我记得有一个webcast讲怎么进行64位移植的。提到了这个。

    对于现有的32位进程内COM组件
       将COM组件封装为COM+服务
           创建服务器端应用程序
           COM+使用代理机制在32位和64位进程之间封送处理调用
    COM+能够识别不同的处理器体系结构的函数库
    不需要对原有COM组件和客户端应用程序进行修改,不需要重新编译


    麻烦把正确答案设为解答。


    com 只听过根本没做过。  com+ 又是什么东西。。。  悲剧了。
    2012年3月31日 8:23
  • 对于你描述的这个功能,我觉得做成service不就行了。

    这个做成service就可以让同时让32位 64位程序加载我对应的32dll  64dll吗


    2012年3月31日 8:26
  • 能不能有知道这个解决方案的人稍微说清楚一点,大概的思路。  本质是我的程序只有32位的,  但是32,64位的程序都会加载我的dll(1个32, 1个64)。用SetWindowsHookEx能实现吗?  像360就只有32位的进程, 但是发现64位的程序会加载它的一个64dll。  这个特性大概的实现思路是什么样的,  感激不尽。

    2012年4月6日 10:12
  • 用hook不能实现。360那个估计是驱动的用户模态代码,写驱动比重新编译麻烦得多,你确定你要和360一样做?


    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP



    谁可以告诉我到哪里去找资料吗?书籍的某部分, 文章, 或者相应的主要的api名称和大概的实现思路。  就像360那样的实现,  我本身也很了解,学习驱动方面的知识。
    2012年4月11日 1:53
  • 驱动也分32位和64位的,能够用SetWindowHook解决的还是不用驱动吧?觉得两个程序重复的话,把hook的处理代码分离出来做一个exe,32位和64位程序都往这个exe发消息就好了(参考http://www.pretentiousname.com/NoBarTab/NoBarTab_poc3.zip)。

    360不知道挂的什么类型的钩子,鼠标键盘和辅助功能(SetWinEventHook)不需要注入DLL的。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP

    • 已标记为答案 lygf666 2012年4月12日 1:27
    • 取消答案标记 lygf666 2012年4月12日 1:29
    2012年4月11日 13:57
    版主
  • 单从技术的角度讲,这么样通过驱动来实现这个需求呢?个人很想知道,就是只有32位的进程,但是却能使64的进程加载我的dll。希望能知道大概的实现思路,以后打算有空自己再去学习。望能告诉我一些资料,能知道大概的学习方向就行,非常感谢。

    2012年4月12日 1:33
  • 上面你给出链接的那个工程,我也从google找到了。目前也打算用这个方案来实现目前的需求,但是还是很想知道怎么只通过32位的进程就能实现该需求。

    2012年4月12日 1:34
  • 记得UMDF是用COM接口的

    还有很多方法注入DLL的,比如AppInit_DLL、CreateRemoteThread、SetThreadContext之类的。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP

    2012年4月12日 2:38
    版主
  • 记得UMDF是用COM接口的

    还有很多方法注入DLL的,比如AppInit_DLL、CreateRemoteThread、SetThreadContext之类的。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP


    那么就是说,把dll封装成com的话,这个就可以通过32位进程调用64位com dll的导出函数了吗,同时该64位dll会被64位进程加载(导出函数内用了SetWindowsHookEx)。
    2012年4月12日 6:08
  • 但我还是不懂,这跟前面你说的编写驱动有什么关系?

    2012年4月12日 6:11
  • 因为你说的这种东东,如果不用驱动而且用户装了反病毒软件的话,很可能会不工作……


    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP

    2012年4月12日 16:18
    版主
  • 那块告诉我应该去学习哪方面的相关知识,谢谢了。我很想知道怎么弄。

    2012年4月13日 1:23
  • 驱动开发和安全方面的知识


    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP

    2012年4月13日 1:25
    版主
  • 这答案。。。 能告诉我有什么相关的书籍或者资料来源也行?  msdn不算吧, 那个太详细了。初学没法把握要掌握的程度。

    还有怎么判断当前运行的操作系统是x64的, 这个程序是32位的进程。 同时也要在xp下判断(32位,64位)   谢谢。

    2012年4月13日 2:01
  • WDK, codeproject

    GetNativeSystemInfo



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP

    • 已标记为答案 lygf666 2012年4月13日 6:35
    2012年4月13日 2:48
    版主