谁有冰河源代码???给100分,不够再加!在线等待。

解决方案 »

  1.   

    我的email    bluewhite911◎163.com
      

  2.   

    http://www.vckbase.com/code/findcode.asp?keyword=%D4%B6%B3%CC%BF%D8%D6%C6
      

  3.   

    你把BackOrifice的代码研究一下不就可以了吗?应该没什么太大的差别。
      

  4.   

    还没有公开吧   据说是BCB开发的
      

  5.   

    谁有的话给我一份
    [email protected]
    very 3q~~
      

  6.   

    Windows的自启动方式(ZT)Windows的自启动方式 
    这篇文章断断续续写了有一年,在有些论坛也曾经贴过,读者的回复是两种, 
    一是不错,二是抄袭。但是我可以保证所有的内容是我个人查阅的资料(包括大脑)和进行试验与思考的结果。如果这也算抄袭,那么我只好苦笑了。 参考的资料名称可以看目录。 
    如果有人来所取索取doc版本,来封信,我会mail给大家,呵呵。mailto:[email protected] 
    Windows的自启动方式 
    正文: 最后一次修改日期:August 12, 2002 
    目录: 
    WINDOWS的自启动方式    1 
    正文:    1 
    目录:    1 
    前言:    2 
    警告:    2 
    Windows的自启动方式:    2 
    1.自启动目录:    2 
    1.第一自启动目录:    2 
    2.第二自启动目录:    3 
    2.系统配置文件启动:    4 
    1.WIN.INI启动:    4 
    2.SYSTEM.INI启动:    4 
    3.WININIT.INI启动:    5 
    4.WINSTART.BAT启动:    6 
    5.AUTOEXEC.BAT启动:    6 
    3.注册表启动:    6 
    1.常规启动:    6 
    2.特殊启动1:    8 
    3.特殊启动2:    8 
    4.其他启动方式:    8 
    1.C:\Explorer.exe启动方式:    9 
    2.屏幕保护启动方式:    9 
    3.依附启动:    10 
    4.计划任务启动方式:    10 
    5.AutoRun.inf启动方式:    10 
    5.自动启动相关:    11 
    1.代启动:    11 
    2.Start启动:    12 
    3.控制面板启动:    12 
    4.其他:    12 
    最后:    13 
    主要参考资料:    14 
    http://www.tlsecurity.net/auto.html    14 
    http://support.microsoft.com/support/kb/articles/Q232/5/09.ASP    17 
    Syntax for the RunOnceEx Registry Key    17 
    SUMMARY    17 
    MORE INformATION    17 
    RunOnceEx Sample to Run Notepad    18 
    Sample Syntax    18 
    Notes    18 
    Definition of values and Subkeys    18 
    Wininit.ini与病毒(名称为笔者所加)    20 
    http://www.microsoft.com/technet/security/bulletin/fq00-052.asp    23 前言: 
    有时候人们往往会为了一个程序的启动而头痛,因为一些用户往往不知道那些文件是如何启动的。所以经常会有些没用的东西挂在系统上占用资源。有时候也会有人因为不知道如何启动某个文件而头痛。更有些特洛依木马的作者因为不清楚系统的自启动方式而使自己的木马轻松被别人发现…… 
    Windows的自启动方式其实有许多方式。除了一些常见的启动方式之外,还有一些非常隐蔽的可用来启动文件的方式。本文总结如下,虽然不是全部,但我想应该会对大家有所帮助。文章全部以系统默认的状态为准,以供研究。 
    其中(English)代表英文操作系统,(Chinese)代表中文操作系统。本文没加说明说的全为中文Windows98操作系统。 
    警告: 
    文中提及的一些操作可能会涉及到系统的稳定性。例如如果不正确地使用注册表编辑器可以导致可能重新安装系统这样严重的问题。微软也不能保证因不正常使用注册表编辑器而造成的结果可以被解决。笔者不对使用后果负责,请根据自己的情况使用。 
    Windows的自启动方式: 
    1.自启动目录: 
    1.第一自启动目录: 
    默认路径位于: 
    C:\windows\start menu\programs\startup(English) 
    C:\windows\start menu\programs\启动(Chinese) 
    这是最基本、最常用的Windows启动方式,主要用于启动一些应用软件的自启动项目,如Office的快捷菜单。一般用户希望启动时所要启动的文件也可以通过这里启动,只需把所需文件或其快捷方式放入文件夹中即可。 
    对应的注册表位置: 
    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders] 
    Startup="%Directory%" 
    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders] 
    Startup="%Directory%" 
    其中“%Directory%”为启动文件夹位置。 
    英文默认为: 
    C:\windows\start menu\programs\startup 
    中文默认为: 
    C:\windows\start menu\programs\启动 
    在开始菜单的“启动”文件夹是可更改的,如果用户更改了启动文件夹,则以上注册表的键值均会改变为相应的名称。 
    值得注意的是:开始菜单的“启动”文件夹中的内容虽然在默认的状态下可以被用户看得一清二楚。但通过改动还是可以达到相当隐蔽地启动的目的的: 
    首先,“启动”文件夹中的快捷方式或其他文件的属性可以改变为“隐藏”。这样可以达到系统不启动被隐藏的文件,等到需要启动的时候又可以通过更改回文件属性而恢复启动的作用。 
    其次,其实“启动”文件夹只是一个普通的文件夹,但是由于系统监视了这个文件夹,所以变得有些特殊,但文件夹有的功能该文件夹也是有的。譬如“启动”文件夹的名称是可以更改的,并且“启动”文件夹也可以设置属性。如果把属性设置为“隐藏”,则在系统中的【开始】;【程序】菜单中是看不到“启动”文件夹的(即使在“文件夹选项”中已经设定了“显示所有文件”)。而系统还会启动这个被隐藏的文件夹中的非隐藏文件。 
    敏感的人们也许已经发现问题。举一个例子: 
    如果我想启动A木马的server端服务器,我可以把原来的“启动”菜单的名称更改为“StartUp”(这里是随便改的,注册表相应的键值也会自动更改。)之后再创建一个名为“启动”的文件夹,把“StartUp”菜单中的文件全部复制(这里用复制,可以骗过用户的检查)到“启动”菜单中,然后把A木马的server程序放入“StartUp”文件夹中,最后把“StartUp”文件夹隐藏。大功告成! 
    从外表看来,用户的【开始】;【启动】目录还在,而且要启动的文件也在。但系统此时启动的文件不是名为“启动”的文件夹中的文件,而是名为“StartUp”的文件夹中的文件。如果木马做的好的话,完全可以在每次启动的时候把“StartUp”中的文件复制到“启动”目录中来达到实时更新启动目录的目的。由于“StartUp”文件夹被隐藏,从【开始】;【程序】中是无法看到真正的启动菜单“StartUp”的,所以达到了隐蔽启动的目的! 
    这个启动方式虽然比较隐蔽,但通过msconfig依旧可以在“启动”页中看出来。 
    2.第二自启动目录: 
    是的,其实,Windows还有另外一个自启动目录,而且很明显但却经常被人们忽略的一个。 
    该路径位于: 
    C:\WINDOWS\All Users\Start Menu\Programs\StartUp(English) 
    C:\WINDOWS\All Users\Start Menu\Programs\启动(Chinese) 
    这个目录的使用方法和第一自启动目录是完全一样的。只要找到该目录,将所需要启动的文件拖放进去就可以达到启动的目的。 
    [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\explorer\User Shell Folders] 
    "Common Startup"="%Directory%" 
    [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\explorer\Shell Folders] 
    "Common Startup"="%Directory%" 
    值得注意的是:该目录在开始菜单的“启动”目录中是完全不能被看见的。而伴随着每次启动,该目录下的非隐藏文件也会随之启动! 
    另外,在Msconfig中可以看到在这个目录下要启动的文件。
      

  7.   

    Windows的自启动方式(ZT)Windows的自启动方式 
    这篇文章断断续续写了有一年,在有些论坛也曾经贴过,读者的回复是两种, 
    一是不错,二是抄袭。但是我可以保证所有的内容是我个人查阅的资料(包括大脑)和进行试验与思考的结果。如果这也算抄袭,那么我只好苦笑了。 参考的资料名称可以看目录。 
    如果有人来所取索取doc版本,来封信,我会mail给大家,呵呵。mailto:[email protected] 
    Windows的自启动方式 
    正文: 最后一次修改日期:August 12, 2002 
    目录: 
    WINDOWS的自启动方式    1 
    正文:    1 
    目录:    1 
    前言:    2 
    警告:    2 
    Windows的自启动方式:    2 
    1.自启动目录:    2 
    1.第一自启动目录:    2 
    2.第二自启动目录:    3 
    2.系统配置文件启动:    4 
    1.WIN.INI启动:    4 
    2.SYSTEM.INI启动:    4 
    3.WININIT.INI启动:    5 
    4.WINSTART.BAT启动:    6 
    5.AUTOEXEC.BAT启动:    6 
    3.注册表启动:    6 
    1.常规启动:    6 
    2.特殊启动1:    8 
    3.特殊启动2:    8 
    4.其他启动方式:    8 
    1.C:\Explorer.exe启动方式:    9 
    2.屏幕保护启动方式:    9 
    3.依附启动:    10 
    4.计划任务启动方式:    10 
    5.AutoRun.inf启动方式:    10 
    5.自动启动相关:    11 
    1.代启动:    11 
    2.Start启动:    12 
    3.控制面板启动:    12 
    4.其他:    12 
    最后:    13 
    主要参考资料:    14 
    http://www.tlsecurity.net/auto.html    14 
    http://support.microsoft.com/support/kb/articles/Q232/5/09.ASP    17 
    Syntax for the RunOnceEx Registry Key    17 
    SUMMARY    17 
    MORE INformATION    17 
    RunOnceEx Sample to Run Notepad    18 
    Sample Syntax    18 
    Notes    18 
    Definition of values and Subkeys    18 
    Wininit.ini与病毒(名称为笔者所加)    20 
    http://www.microsoft.com/technet/security/bulletin/fq00-052.asp    23 前言: 
    有时候人们往往会为了一个程序的启动而头痛,因为一些用户往往不知道那些文件是如何启动的。所以经常会有些没用的东西挂在系统上占用资源。有时候也会有人因为不知道如何启动某个文件而头痛。更有些特洛依木马的作者因为不清楚系统的自启动方式而使自己的木马轻松被别人发现…… 
    Windows的自启动方式其实有许多方式。除了一些常见的启动方式之外,还有一些非常隐蔽的可用来启动文件的方式。本文总结如下,虽然不是全部,但我想应该会对大家有所帮助。文章全部以系统默认的状态为准,以供研究。 
    其中(English)代表英文操作系统,(Chinese)代表中文操作系统。本文没加说明说的全为中文Windows98操作系统。 
    警告: 
    文中提及的一些操作可能会涉及到系统的稳定性。例如如果不正确地使用注册表编辑器可以导致可能重新安装系统这样严重的问题。微软也不能保证因不正常使用注册表编辑器而造成的结果可以被解决。笔者不对使用后果负责,请根据自己的情况使用。 
    Windows的自启动方式: 
    1.自启动目录: 
    1.第一自启动目录: 
    默认路径位于: 
    C:\windows\start menu\programs\startup(English) 
    C:\windows\start menu\programs\启动(Chinese) 
    这是最基本、最常用的Windows启动方式,主要用于启动一些应用软件的自启动项目,如Office的快捷菜单。一般用户希望启动时所要启动的文件也可以通过这里启动,只需把所需文件或其快捷方式放入文件夹中即可。 
    对应的注册表位置: 
    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders] 
    Startup="%Directory%" 
    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders] 
    Startup="%Directory%" 
    其中“%Directory%”为启动文件夹位置。 
    英文默认为: 
    C:\windows\start menu\programs\startup 
    中文默认为: 
    C:\windows\start menu\programs\启动 
    在开始菜单的“启动”文件夹是可更改的,如果用户更改了启动文件夹,则以上注册表的键值均会改变为相应的名称。 
    值得注意的是:开始菜单的“启动”文件夹中的内容虽然在默认的状态下可以被用户看得一清二楚。但通过改动还是可以达到相当隐蔽地启动的目的的: 
    首先,“启动”文件夹中的快捷方式或其他文件的属性可以改变为“隐藏”。这样可以达到系统不启动被隐藏的文件,等到需要启动的时候又可以通过更改回文件属性而恢复启动的作用。 
    其次,其实“启动”文件夹只是一个普通的文件夹,但是由于系统监视了这个文件夹,所以变得有些特殊,但文件夹有的功能该文件夹也是有的。譬如“启动”文件夹的名称是可以更改的,并且“启动”文件夹也可以设置属性。如果把属性设置为“隐藏”,则在系统中的【开始】;【程序】菜单中是看不到“启动”文件夹的(即使在“文件夹选项”中已经设定了“显示所有文件”)。而系统还会启动这个被隐藏的文件夹中的非隐藏文件。 
    敏感的人们也许已经发现问题。举一个例子: 
    如果我想启动A木马的server端服务器,我可以把原来的“启动”菜单的名称更改为“StartUp”(这里是随便改的,注册表相应的键值也会自动更改。)之后再创建一个名为“启动”的文件夹,把“StartUp”菜单中的文件全部复制(这里用复制,可以骗过用户的检查)到“启动”菜单中,然后把A木马的server程序放入“StartUp”文件夹中,最后把“StartUp”文件夹隐藏。大功告成! 
    从外表看来,用户的【开始】;【启动】目录还在,而且要启动的文件也在。但系统此时启动的文件不是名为“启动”的文件夹中的文件,而是名为“StartUp”的文件夹中的文件。如果木马做的好的话,完全可以在每次启动的时候把“StartUp”中的文件复制到“启动”目录中来达到实时更新启动目录的目的。由于“StartUp”文件夹被隐藏,从【开始】;【程序】中是无法看到真正的启动菜单“StartUp”的,所以达到了隐蔽启动的目的! 
    这个启动方式虽然比较隐蔽,但通过msconfig依旧可以在“启动”页中看出来。 
    2.第二自启动目录: 
    是的,其实,Windows还有另外一个自启动目录,而且很明显但却经常被人们忽略的一个。 
    该路径位于: 
    C:\WINDOWS\All Users\Start Menu\Programs\StartUp(English) 
    C:\WINDOWS\All Users\Start Menu\Programs\启动(Chinese) 
    这个目录的使用方法和第一自启动目录是完全一样的。只要找到该目录,将所需要启动的文件拖放进去就可以达到启动的目的。 
    [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\explorer\User Shell Folders] 
    "Common Startup"="%Directory%" 
    [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\explorer\Shell Folders] 
    "Common Startup"="%Directory%" 
    值得注意的是:该目录在开始菜单的“启动”目录中是完全不能被看见的。而伴随着每次启动,该目录下的非隐藏文件也会随之启动! 
    另外,在Msconfig中可以看到在这个目录下要启动的文件。
      

  8.   

    2.系统配置文件启动: 
    由于系统的配置文件对于大多数的用户来说都是相当陌生的;这就造成了这些启动方法相对来说都是相当隐蔽的,所以这里提到的一些方法常常会被用于做一些破坏性的操作,请读者注意。 
    1.WIN.INI启动: 
    启动位置(file.exe为要启动的文件名称): [windows] 
    load=file.exe 
    run=file.exe 
    注意:load=与run=的区别在于:通过load=运行文件,文件会在后台运行(最小化);而通过run=来运行,则文件是在默认状态下被运行的。 
    2.SYSTEM.INI启动: 
    启动位置(file.exe为要启动的文件名称): 
    默认为: 
    [boot] 
    Shell=Explorer.exe 
    可启动文件后为: 
    [boot] 
    Shell=Explorer.exe file.exe 
    说明: 
    笔者记得在诺顿先生(就是开发出Norton系列软件的人)写的一本书里面曾经说过,1、2这两个文件的有无对系统没有什么影响,但由于时间的关系,笔者没有来得及试验,有兴趣者可以试一试。 
    不过有一点是可以肯定的,这样的启动方式往往会被木马或一些恶作剧程序(如,妖之吻)利用而导致系统的不正常。由于一般用户很少会对这两个文件关心,甚至有的人不知道这些文件是做什么用的,所以隐蔽性很好。但由于其使用的越来越频繁,这种启动方式也被渐渐的察觉了。用户可以使用msconfig这个命令实现检查是否有什么程序被加载。具体的是在看是菜单中的“运行”中输入msconfig回车,之后按照文字说明即可。 
    注意: 
    1.    和WIN.INI文件不同的是,SYSTEM.INI的启动只能启动一个指定文件,不要把Shell=Explorer.exe file.exe换为Shell=file.exe,这样会使Windows瘫痪! 
    2.    这种启动方式提前于注册表启动,所以,如果想限制注册表中的文件的启动,可是使用这种方法。 
    3.WININIT.INI启动: 
    Wininit.ini这个文件也许很多人不知道,一般的操作中用户也很少能直接和这个文件接触。但如果你编写过卸载程序的话,也许你会知道这个文件。 
    WinInit即为Windows Setup Initialization Utility。翻译成中文就是Windows安装初始化工具。这么说也许不明白,如果看到如下提示信息: 
    Please wait while Setup updates your configuration files. 
    This may take a few minutes... 
    大家也许就都知道了!这个就是Wininit.ini在起作用! 
    由于在Windows下,许多的可执行文件和驱动文件是被执行到内存中受到系统保护的。所以在Windows的正常状态下更改这些文件就成了问题,因此出现了Wininit.ini这个文件来帮助系统做这件事情。它会在系统装载Windows之前让系统执行一些命令,包括复制,删除,重命名等,以完成更新文件的目的。Wininit.ini文件存在于Windows目录下,但在一般时候我们在C:\Windows目录下找不到这个文件,只能找到它的exe程序Wininit.exe。原因就是Wininit.ini在每次被系统执行完它其中的命令时就会被系统自动删除,直到再次出现新的Wininit.ini文件……之后再被删除。 
    文件格式: 
    [rename] 
    file1=file2 
    file1=file2的意思是把file2文件复制为文件名为file1的文件,相当于覆盖file1文件。 
    这样启动时,Windows就实现了用file2更新file1的目的;如果file1不存在,实际结果是将file2复制并改名为file1;如果要删除文件,则可使用如下命令: 
    [rename] 
    nul=file2   
    这也就是说把file2变为空,即删除的意思。 
    以上文件名都必须包含完整路径。 
    注意:1.由于Wininit.ini文件处理的文件是在Windows启动以前处理的,所以不支持长文件名。 
    2.以上的文件复制、删除、重命名等均是不提示用户的情况下执行的。有些病毒也会利用这个文件对系统进行破坏,所以用户如果发现系统无故出现: 
    Please wait while Setup updates your configuration files. 
    This may take a few minutes... 
    那么也许系统就有问题了。 
    3. 在Windows 95 Resource Kit中提到过Wininit.ini文件有三个可能的段,但只叙述了[rename]段的用法。 
    4.WINSTART.BAT启动: 
    这是一个系统自启动的批处理文件,主要作用是处理一些需要复制、删除的任务。譬如有些软件会在安装或卸载完之后要求重新启动,就可以利用这个复制和删除一些文件来达到完成任务的目的。如: 
    “@if exist C:\WINDOWS\TEMP\PROC.BAT call C:\WINDOWS\TEMP\PROC.BAT” 
    这里是执行PROC.BAT文件的命令; 
    “call filename.exe > nul” 
    这里是去除任何在屏幕上的输出。 
    值得注意的是WinStart.BAT文件在某种意义上有和AUTOEXEC.BAT一样的作用。如果巧妙安排完全可以达到修改系统的目的! 
    5.AUTOEXEC.BAT启动: 
    这个就没的说了,应该是用户再熟悉不过的系统文件之一了。每次重新启动系统时在DOS下启动。恶意的程序往往会利用这个文件做一些辅助的措施。 
    不过,在AUTOEXEC.BAT文件中会包含有恶意代码。如format c: /y等;由于BAT恶意程序的存在,这个机会大大地增加了。譬如最近很流行的SirCam蠕虫也利用了Autoexec.bat文件。 
    说明: 
    4、5这两个文件都是批处理文件,其作用往往不能完全写出来,因为批处理的用处在DOS时代的应用太广泛,它的功能相对来说也是比较强大。想利用这两个文件,需要对DOS有一定的了解。. 
    3.注册表启动: 
    注册表中的启动应该是被使用最频繁的启动方式,但这样的方式也有一些隐蔽性较高的方法,大致有三种。 
    1.常规启动: 
    其中\%path%\为任意路径,file.exe为要运行的程序。 
    [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices] 
    "Anything"="\%path%\file.exe" 
    [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce] 
    "Anything"="\%path%\file.exe" 
    [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run] 
    "Anything"="\%path%\file.exe" 
    [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce] 
    "Anything"="\%path%\file.exe" [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run] 
       "Whatever"="c:\runfolder\program.exe" 
    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce] 
       "Whatever"="c:\runfolder\program.exe" 
    注意: 
    1.如果需要运行.dll文件,则需要特殊的命令行。 
    如: 
    Rundll32.exe C:\WINDOWS\FILE.DLL,Rundll32 
    2.解除这里相应的自启动项只需删除该键值即可,但注意不要删除如SystemTray、ScanRegistry等这样的系统键值。 
    3.如果只想不启动而保留键值,只需在该键值加入rem即可。如: 
    “rem  C:\Windows\a.exe” 
    4.在注册表中的自启动项中没有这项: 
    [HKEY_CURRENT_USER \Software\Microsoft\Windows\CurrentVersion\RunServices] 
    5.Run和RunServices的区别在于:Run中的程序是在每次系统启动时被启动,RunServices则是会在每次登录系统时被启动。 
      

  9.   

    cwanter(海阔天空)  非常感谢啊!传统的socket通信,太容易被发现。通信过程中,如何隐藏呢?据我知道有两种方法:1,端口重绑定 2修改icmp包。还有没有其他方法?
      

  10.   


    冰河已经很长时间不再开发了。delphi
      

  11.   

    作者:CZ 来源:未知 加入时间:2003-2-10 23:49:23 
    一.Windows下进程的隐藏
    二.Windows Socket 2 SPI技术概述
    三.基于SPI的DLL木马技术
    四.主要代码分析
    五.小结与后记
    六.附录之源代码一)Windows下进程的隐藏
    在M$的32位操作系统中,有许许多多的办法可以实现进程隐藏的功能。在Win98下将程序注册为系统服务就可以实现在进程列表里的隐藏,但是在NT/2000下,由于操作系统添加了许多特性使得进程的隐藏提到了一个新的高度。其中,DLL木马是非常流行的一种形式,它将自己添加到其他可执行文件的进程里,这样在任务管理器里就不会出现我们的DLL文件,而是我们DLL的载体EXE文件。在Jeffrey Richter大师的文章里提到了好几种插入DLL的方式,比如说在注册表的AppInit_DLLs里添加木马DLL,特洛伊DLL方式,使用Windows挂钩和远程线程的插入等等,在此我就不做详细介绍了。现在给大家介绍一种隐藏进程的新方法,它仍然是以DLL的形式存在的(同样需要由其他可执行文件来加载),而且还具有无端口的特性。它就是使用了Windows Socket 2的新特性,服务提供者接口(Service Provider Interface),SPI试图支持所有的32位Windows操作系统,当然也包括Windows95。二)Windows Socket 2 SPI技术概述
    Winsock 2 SPI是一个新特性,是为书写服务提供者的人员提供的。Winsock 2不仅提供了一个供应用程序访问网络服务的Windows socket应用程序编程接口(API),还包含了由传输服务提供者和名字解析服务提供者实现的Winsock服务提供者接口(SPI)和ws2_32.dll。在此以传输服务提供者为例来实现进程的隐藏。如下是应用程序,Ws2_32.dll和传输服务提供者接口之间的层次关系:
    ----------------------------
    |Windows socket 2 应用程序|
    ----------------------------Windows socket 2 API
    | WS2_32.DLL |
    ----------------------------Windows socket 2 传输SPI
    | 传输服务提供者(DLL) | 
    ----------------------------
    传输服务提供者是以DLL的形式存在的,它向外只有一个入口函数,那就是WSPStartup,其中的参数LPWSAPRTOCOL_INFOW结构指针决定了服务提供者的类型,其他的30个传输服务提供者函数是以分配表的方式调用的。当网络应用程序调用WSASocket/socket函数创建套接字时,会有三个参数:地址族,套接字类型和协议,正是这三个参数共同决定了是由哪一个类型的传输服务提供者来实现本应用程序的功能。在整个层次结构中,Ws2_32.dll只是起到了媒介的作用,应用程序则是对用户功能的实现,而真正实现网络传输功能的是传输服务提供者接口。当前系统中有一些默认的服务提供者,它们已经实现了大部分基本的功能,所以我们自己在书写服务提供者程序时,只须对数据报进行“修饰”后,将数据报传送给系统服务提供者来实现剩下的功能。在服务提供者中有三种协议:分层协议,基础协议和协议链。区分它们的方法是通过结构WSAPROTOCOL_INFOW中的Protocolchain结构的ChainLen值来实现的。分层协议的ChainLen值为0,基础协议的值为1,而协议链的值是大于1。其实分层协议和基础协议在功能实现上没有太大的区别(均可通过调用系统服务提供者实现数据转发),但是在安装上却有很大的不同。安装基础协议时我们把所有的基础服务提供者的DLL文件名和路径都替换为我们自定义的基础协议;而安装分层协议后,我们还必须将和分层协议有关的各个协议组成协议链,然后再安装协议链。在所有的服务提供者都安装完后,我们还必须重新排列它们的安装顺序,这一点很重要。当我们的WSASocket/socket创建套接字时,Ws2_32.dll就会在服务提供者数据库中按顺序搜索和WSAStartup/socket提供的三个参数相匹配的服务提供者,如果同时有两个相同类型的服务提供者存在于服务提供者数据库中,那么顺序在前的那个服务提供者就会被调用。通常,在我们安装完自己的服务提供者后,都会将自己的服务提供者重新排列在最前面。在实例instBD.exe中,我们以分层协议为例,展示如何安装传输服务提供者。Ws2_32.dll是使用标准的动态链接库来加载服务提供者接口的DLL到系统中去的,并调用WSPStartup来初始化。WSPStartup是Windows Socket 2应用程序调用SPI程序的初始化函数,也就是入口函数。WSPStartup的参数LPWSAPROTOCOL_INFOW指针提供应用程序所期望的协议信息,然后通过这个结构指针我们可以获得所保存的系统服务提供者的DLL名称和路径,加载系统服务提供者后查找到系统SPI程序的WSPStartup函数的指针,通过这个指针我们就可以将自己服务提供者的WSPStartup函数和系统SPI程序的WSPStartup函数相关联,进而调用系统的各个服务提供者函数。在数据传输服务提供者的实现中,我们需要两个程序,一个是可执行文件用来安装传输服务提供者;另一个就是DLL形式的数据传输服务提供者。三)基于SPI的DLL木马技术
    上面我们已经介绍了传输服务提供者的特性,现在让我们来看看如果将这种技术运用于木马进程隐藏的。在每个操作系统中都有系统网络服务,它们是在系统启动时自动加载,而且很多是基于IP协议的。如果我们书写了一个IP协议的传输服务提供者,并安装在服务提供者数据库的最前端,系统网络服务就会加载我们的服务提供者。如果将木马程序嵌入到服务提供者的DLL文件之中,在启动系统网络服务时我们的木马程序也会被启动。这种形式的DLL木马只须被安装一次,而后就会被自动加载到可执行文件的进程中,还有一个特点就是它会被多个网络服务加载。通常在系统关闭时,系统网络服务才会结束,所以我们的木马程序同样可以在系统运行时保持激活状态。
    在传输服务提供者中,有30个SPI函数是以分配表的形式存在的。在Ws2_32.dll中的大多数函数都有与之对应的传输服务提供者函数。如WSPRecv和WSPSend,它们在Ws2_32.dll中的对应函数是WSARecv和WSASend。我们假设自己编写了一个基于IP协议的服务提供者并安装于系统之中,当系统重启时它被svchost.exe程序加载了,而且svchost.exe在135/TCP监听,完事具备了。在我们的传输服务提供者中,自己重新编写了WSPRecv函数,对接收到的数据进行分析,如果其中含有客户端发送过来的暗号,就执行相应的命令获得期望的动作,之后我们可以调用WSPSend函数将结果发送到客户端,这样不仅隐藏了进程,而且还重用了已有的端口。 
      

  12.   

    四)主要代码分析
    1.instBD.exe
    可执行程序instBD.exe的主要功能是安装我们自己的分层传输服务提供者,并重新排列所有传输服务提供者的顺序,使我们的服务提供者位于协议链的顶端,这样相应类型的应用程序就会首先进入我们的传输服务提供者接口。本程序只有一个参数,就是安装(-install)或卸载(-remove)。作为演示,本程序只安装了IP分层协议及与TCP相关的协议链。在backdoor.dll中,我们不对数据报进行任何修饰,只是在启动我们的木马进程。
    自定义函数:
    BOOL getfilter(); //获得所有已经安装的传输服务提供者
    void freefilter(); //释放存储空间
    void installfilter(); //安装分层协议,协议链及排序
    void removefilter(); //卸载分层协议和协议链代码分析:
    protoinfo=(LPWSAPROTOCOL_INFOW)GlobalAlloc(GPTR,protoinfosize); 
    //分配WSAPROTOCOL_INFOW结构的存储空间
    totalprotos=WSCEnumProtocols(NULL,protoinfo,&protoinfosize,&errorcode); 
    //获得系统中已安装的所有服务提供者
    GetCurrentDirectory(MAX_PATH,filter_path); 
    //得到当前的路径
    _tcscpy(filter_name,_T("\\backdoor.dll")); 
    //构造服务提供者文件backdoor.dll的路径全名
    WSCInstallProvider(&filterguid,filter_path,&iplayerinfo,1,&errorcode); 
    //安装自定义的IP分层协议
    iplayercataid=protoinfo[i].dwCatalogEntryId; 
    //获得已安装自定义IP分层协议的由Ws2_32.dll分配的唯一标志
    udpchaininfo.ProtocolChain.ChainEntries[0]=iplayercataid; 
    //将自定义的IP分层协议作为自定义UDP协议链的根分层服务提供者安装在协议链的顶端
    WSCInstallProvider(&filterchainguid,filter_path,chainarray,provcnt,&errorcode); 
    //安装协议链
    WSCWriteProviderOrder(cataentries,totalprotos); 
    //更新所有服务提供者的安装顺序,把自定义的服务提供者排在所有协议的最前列
    WSCDeinstallProvider(&filterguid,&errorcode); 
    //卸载IP分层协议
    WSCDeinstallProvider(&filterchainguid,&errorcode); 
    //卸载协议链2.backdoor.dll 
    传输服务提供者都是以动态链接库的形式存在的,在应用程序需要时由Ws2_32.dll加载,在用完之后就被卸载。传输服务提供者只有一个入口函数就是WSPStartup,它是Windows Socket 应用程序调用SPI的初始化函数,其他SPI函数的调用都是通过WSPStartup的参数WSPUPCALLTABLE来实现的。其中有个全局变量,可共所有调用DLL的程序读取与修改。在首次加载服务提供者时,我们启动木马进程。演示中木马进程没有任何特别的功能,当客户端和监听的服务器端口连接后,如果客户端发送了特定的暗号,服务端就会回送特定的消息。
    自定义函数:
    int WSPAPI WSPStartup( WORD wversionrequested,LPWSPDATA lpwspdata,LPWSAPROTOCOL_INFOW lpprotoinfo,
    WSPUPCALLTABLE upcalltable,LPWSPPROC_TABLE lpproctable);
    //SPI函数WSPStartup和Windows Socket 2的API函数WSAStartup相对应,WSPStartup是唯一的入口函数,剩下的30个SPI函数则是通过参数upcalltable来实现的,它们只能在内部调用,不向外提供入口代码分析:
    hthread=CreateThread(NULL,0,backdoor,NULL,0,NULL);
    //创建木马进程,它只是展示数据的流通
    GetModuleFileName(NULL,processname,MAX_PATH);
    //获得调用本服务提供者动态链接库的可执行文件的全名
    OutputDebugString(_T("Start the backdoor ..."));
    //输出调试信息
    layerid=protoinfo[i].dwCatalogEntryId;
    //获得已安装自定义IP分层协议的由Ws2_32.dll分配的唯一标志
    nextlayerid=lpprotoinfo->ProtocolChain.ChainEntries[i+1];
    //获得下一层传输服务提供者的标志信息
    WSCGetProviderPath(&protoinfo[i].ProviderId,filterpath,&filterpathlen,&errorcode);
    //获得下一层传输服务提供者的安装路径
    ExpandEnvironmentStrings(filterpath,filterpath,MAX_PATH);
    //扩展环境变量
    hfilter=LoadLibrary(filterpath));
    //装载下一层传输服务提供者
    wspstartupfunc=(LPWSPSTARTUP)GetProcAddress(hfilter,"WSPStartup"));
    //获得下一层传输服务提供者的入口函数WSPStartup,以便调用
    wspstartupfunc(wversionrequested,lpwspdata,lpprotoinfo,upcalltable,lpproctable);
    //调用下一层传输服务提供者的WSPStartup函数,实现钩子功能
    nextproctable=*lpproctable;
    //保存下一层服务提供者的30个服务函数指针由于以动态链接库形式的服务提供者要向外提供一个入口函数,因此还须一个配置文件backdoor.def:
    EXPORTS WSPStartup
    //向外提供入口函数WSPStartup3.testBD.exe
    这是一个测试程序,用来检测木马的服务器端是否正常工作。在它发送特定的消息到服务器端后,如果服务器正常工作就会回送特定的消息,反之则不会收到任何消息。由于木马的服务器在TCP的12345端口监听,所以我们的客户端也是基于TCP协议的。五)小结与后记
    本文的目的在于向大家介绍一种编程思路,固不是任何的木马教程。其实只有在不断的对抗中,技术和思路才会不断的提高。我们只有充分的了解了各种技术,甚至有前瞻的能力才能维护好网络秩序,促进网络安全的发展。最后送给大家一句老话:知己知彼,百战不殆。
      

  13.   

    呵呵,看来写ndis驱动也是可行的办法之一~
      

  14.   

    HTTP Tunneling
    HTTP is a text-based protocol to retreive Web pages through a Web browser. Mostly if you are on a LAN connection, you are behind a proxy server; this proxy server has one HTTP proxy running on some defined port. In your Internet Explorer's Connection option, you specify LAN settings as required. This proxy server is definitely running on a text-based protocol and you can only get HTTP-related data from the outside network, right!! Well, there is a small loophole from which you can go through HTTP and connect to the outside world and get any data you want in binary protocol, or even your own protocol. It's through HTTPS.HTTPS Explanation
    In HTTPS, data is transferred from browser to server and server to browser in a secure manner. It's a binary protocol; when it goes through a proxy, the proxy doesn't understand anything. The proxy just allows a binary stream to open and let both server and client exchange the data. Now, we can fool the proxy server and connect to any server and exchange data. The proxy server will think that we doing some secure HTTP session.For HTTPS, your browser connects to a proxy server and sends a command.CONNECT neurospeech.com:443 HTTP/1.0 <CR><LF>
    HOST neurospeech.com:443<CR><LF>
    [... other HTTP header lines ending with <CR><LF> if required]>
    <CR><LF>    // Last Empty LineThen, the proxy server treats this as some HTTP Secure Session, and opens a binary stream to the required server and port as defined. If a connection established, the proxy server returns the following response:HTTP/1.0 200 Connection Established<CR><LF>
    [.... other HTTP header lines ending with <CR><LF>..
    ignore all of them]
    <CR><LF>    // Last Empty LineNow, the browser is connected to the end server and can exchange data in both a binary and secure form.How to Do This
    Now, it's your program's turn to fool the proxy server and behave as Internet Explorer behaves for Secure HTTP.Connect to Proxy Server first. 
    Issue CONNECT Host:Port HTTP/1.1<CR><LF>. 
    Issue <CR><LF>. 
    Wait for a line of response. If it contains HTTP/1.X 200 , the connection is successful. 
    Read further lines of response until you receive an empty line. 
    Now, you are connected to outside world through a proxy. Do any data exchange you want. 
    Sample Source Code
      // You need to connect to mail.yahoo.com on port 25
      // Through a proxy on 192.0.1.1, on HTTP Proxy 4480
      // CSocketClient is Socket wrapping class
      // When you apply operator << on CString, it writes CString
      // To Socket ending with CRLF
      // When you apply operator >> on CString, it receives
      // a Line of response from socket until CRLF
      try
      {
        CString Request,Response;
        CSocketClient Client;    Client.ConnectTo("192.0.1.1",4480);    // Issue CONNECT Command
        Request = "CONNECT mail.yahoo.com:25 HTTP/1.0";
        Client<<Request;    // Issue empty line
        Request = "";
        Client<<Request;    // Receive Response From Server
        Client>>Response;    // Ignore HTTP Version    int n = Response.Find(' ');
        Response = Response.Mid(n+1);    // Http Response Must be 200 only
        if(Response.Left(3)!="200")
        {
          // Connection refused from HTTP Proxy Server
          AfxMessageBox(Response);
        }
        // Read Response Lines until you receive an empty line.
        do
        {
          Client>>Response;
          if (Response.IsEmpty())
            break;
        }while (true);
        // Coooooooool.... Now connected to mail.yahoo.com:25
        // Do further SMTP Protocol here..  }
      catch (CSocketException * pE)
      {
        pE->ReportError();
      }Library Source Code
    The Dns.h file contains all DNS-related source code. It uses other libraries, as SocketEx.h, SocketClient.h, and NeuroBuffer.h.CSocketEx
    Socket functions as a wrapper class. (CSocket is very heavy and unreliable if you don't have the exact idea of how it works.) All the functions are of same name as CSocket. You can use this class directly.CSocketClient
    Derived from CSocketEx and throws proper exceptions with details of Winsock errors. It defines two operators, >> and <<, for easy sending and receiving; it also changes network to host and host to network order of bytes if required.CHttpProxySocketClient
    Derived from CSocketClient, you can call the SetProxySettings(ProxyServer,Port) method and set proxy settings. Then, you can connect to the desired host and port as you need. The ConnectTo method is overridden and it automatically implements an HTTP proxy protocol and gives you a connection without any hassle.How to Use CHttpProxySocketClient
      // e.g. You need to connect to mail.yahoo.com on port 25
      // Through a proxy on 192.0.1.1, on HTTP Proxy 4480
      // CSocketClient is Socket wrapping class
      // When you apply operator << on CString, it writes CString
      // To Socket ending with CRLF
      // When you apply operator >> on CString, it receives
      // Line of response from socket until CRLF
      try
      {
        CHttpProxySocketClient Client;    Client.SetProxySettings("192.0.1.1",1979);    // Connect to server mail.yahoo.com on port 25
        Client.ConnectTo("mail.yahoo.com",25);    // You now have access to mail.yahoo.com on port 25
        // If you do not call SetProxySettings, then
        // you are connected to mail.yahoo.com directly if
        // you have direct access, so always use
        // CHttpProxySocketClient and no need to do any
        // extra coding.  }
      catch(CSocketException * pE) {
        pE->ReportError();
      }Note: I usually don't program in the form of .h and .cpp different files, because using them the next time somewhere else is a big problem because you must move both files here and there. So, I put all the code in my .h file only; I don't write to the .cpp file unless it's required. You need to copy only the SocketEx.h, SocketClient.h, and HttpProxySocket.h files into your project's directory, and add line    #include "HttpProxySocket.h"
    after your 
    #if !defined(.....
    and so forth code of your Visual Studio-generated file. If you put anything above this, you will get n number of errors.