3721驻留机制简单研究

原创 2004年10月30日 19:06:00
//摘自www.cfanclub.net 
3721驻留机制简单研究  (龍珠)

    简单研究了一下3721的机制,写在这里,作为心得笔记吧。大部分收获都来自Softice + 反汇编,不一定适用于某些版本。

1. CnsMin.dll的驻留方式

    3721的核心文件:CnsMin.dll通常存在于<Windows Directory>/Downloaded Program Files下。

    通过注册表Run键值加载:Rundll32 <dir>/CnsMin.dll, Rundll32 CnsMin.dll提供了一个函数Rundll32供Rundll32.exe调用,但这个函数只是调用一个真正的驻留函数Rundll32Main()。

Rundll32Main()伪代码:

void Rundll32Main()
{
hMutex = CreateMutex("CNSMINMUTEX");
        if(ERROR_ALREADY_EXISTS)
        {
                CloseHandle(hMutex);
                exit;
        }
        if(IsWindowsNT()) {
                SetProcessSecurityInfo();
        }
        else {
                RegisterProcessAsService();
        }
        CheckVersion();
        
        // CnsMinKP.sys/vxd 内核驱动程序,保护3721关键文件和注册表项不被删除
        ContactWithCnsMinKPDriver();
        
        // 关键的hook,负责将CnsMin.dll注入其他进程空间
        InstallCBTHook();
        
        // 关键的hook,负责将CnsMin.dll注入其他进程空间
        InstallCallWndProcHook();
        
        // CnsMinIO.dll 负责IE地址栏下方的提示
        InitCnsMinIO();
        
        // 一些注册表信息
        InitRegistry();
        
        // 保护CnsMin.dll的钩子不被卸载或抢先
        InstallGuardTimer();

        CreateMsgWindow();

        // Message loop
        while (true)
        {
                GetMessage(&msg);
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }
}

    CnsMin主要是通过WH_CBT和WH_CALLWNDPROC两个全局钩子注入IE进程空间的。注入IE后,又安装了WH_KEYBOARD,WH_DEBUG等钩子。其中对3721实现其“实名转换”有用的是WH_KEYBOARD。这是一个本地钩子。

    CnsMin为了保证自己的优先级最高,用了一个定时器函数反复安装钩子,无疑会造成系统性能的下降。

    我曾经尝试过自己安装一个WH_DEBUG钩子阻止3721钩子的调用,确实起到了效果,立即可以使3721失效。但这种方法3721仍然驻留IE进程内,属于指标不治本的方法。

    强制结束Rundll32进程,可以暂时卸载3721的驻留代码。但CnsMin.dll通过COM注册已经嵌入IE组件中,重新启动IE后,该进程又会重新启动。

2. 3721的防删除手段
    文件系统驱动:CnsMinKP*.sys 针对NT/2000/XP有不同版本(98下面是CnsMinKP.vxd)
    通常存在于<System directory>/drivers/目录。

    驱动程序,由Windows启动时加载。

    该驱动程序过滤了对文件和注册表的删除操作。试图删除3721的关键文件和注册表项时,直接返回一个TRUE,使Windows认为删除已经成功,但文件和注册表实际上还是在那里。
    该驱动程序还有一个黑名单(保存在某个外部文件中),阻止Windows读取其他3721的竞争对手的插件文件。

    目前还没有找到停止该驱动的方法。

    删除方法:在Windows启动前(例如,98下面退出到DOS)删除CnsMinKP*.sys文件。
    注意:3721具有自恢复能力。某些关键文件被删除后,其它模块会试图从3721网站重新下载。所以彻底删除前需要断开网络连接。

3. 针对目前版本的删除步骤:
    a) 运行3721自己提供的删除程序。可以删掉大部分的文件。
    b) 从DOS启动,删除残存文件,如CnsMin.dll,CnsMinKP*.*等
    可能的目录:Downloaded Program Files目录,Program Files/3721目录,drivers目录
    c) 启动Windows,进入桌面时Windows会报告一些模块找不到的错误,不用理会,删除
    注册表中3721的值。
    可能的位置:HKEY_CURRENT_USER: Software/3721
    HKEY_LOCAL_MACHINE: Windows/CurrentVersion/Run SYSTEM/CurrentControlSet
    另外还零散的藏了一些,用关键字查找。

3721驻留机制简单研究

简单研究了一下3721的机制,写在这里,作为心得笔记吧。大部分收获都来自Softice + 反汇编,不一定适用于某些版本。1. CnsMin.dll的驻留方式3721的核心文件:CnsMin.dll通...
  • pll621
  • pll621
  • 2005年07月14日 02:44
  • 667

3721驻留机制简单研究

  3721驻留机制简单研究   [ 日期: 2006-04-30 02:33 | 作者: d99 | 来自: 转载 | | ] ...
  • gujiannan
  • gujiannan
  • 2006年09月23日 18:12
  • 524

[转载]3721驻留机制简单研究- -

简单研究了一下3721的机制,写在这里,作为心得笔记吧。大部分收获都来自Softice + 反汇编,不一定适用于某些版本。1. CnsMin.dll的驻留方式3721的核心文件:CnsMin.dll通...
  • chinalog
  • chinalog
  • 2006年03月13日 15:13
  • 569

[转载]3721驻留机制简单研究

Quaful@水木清华简单研究了一下3721的机制,写在这里,作为心得笔记吧。大部分收获都来自Softice + 反汇编,不一定适用于某些版本。1. CnsMin.dll的驻留方式3721的核心文件:...
  • lanyus
  • lanyus
  • 2005年09月01日 07:55
  • 1698

python的字符串驻留

一、 字符串驻留定义 在维基百科中是这样解释的: In computer science, string interning is a method of storing only one cop...
  • u011300968
  • u011300968
  • 2017年08月14日 13:37
  • 242

String特性之 “字符串驻留池”

再说  String 1. 字符串驻留池,就是一块与堆区并行的存放字符串对象的内存区,JVM的驻留池机制规定: 在池中创建一个String对象,第二行会先在池中寻找是否有值与"abc...
  • fbz123456
  • fbz123456
  • 2016年04月01日 11:19
  • 230

String驻留池

在java面试题中会经常碰到类似与这样的题目: String str=new String("abc"); 这句代码创建了几个对象?想要搞明白这个问题,不得不解释一个概念,也就是字符串常量池,也称...
  • u012700373
  • u012700373
  • 2014年03月26日 18:12
  • 691

什么是string interning(字符串驻留)以及python中字符串的intern机制

In computer science, string interning is a method of storing only one copy of each distinct string...
  • u010180339
  • u010180339
  • 2014年11月16日 11:34
  • 3068

彻底删除3721的简单方法

     不久前不幸中了3721,通过卸载,手工删除均无法删掉它,非常气愤3721的这种流氓行径。查阅了网上很多资料,更加清楚了它的丑恶嘴脸,总结出一个简单的彻底删除3721的办法。    3721不...
  • zmxj
  • zmxj
  • 2005年09月13日 20:17
  • 1934

Java千百问_01基本概念(007)_线程的状态有哪些

点击进入_更多_Java千百问1、线程的状态有哪些在java中java.lang.Thread类有一个变量threadStatus,标示了该线程的当前状态,它是一个int类型,但是对应的get方法返回...
  • ooppookid
  • ooppookid
  • 2016年06月05日 16:53
  • 5078
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:3721驻留机制简单研究
举报原因:
原因补充:

(最多只允许输入30个字)