通过FTP服务的winsockes录制脚本

测试对象:网闸

什么是网闸呢?网闸在GB/T20279-2006《信息安全技术网络和终端设备隔离部件安全技术要求》中的定义是这样的:“网闸(GAP)”该信息安全部件位于两个不同的安全域之间,通过协议转换手段,以信息摆渡方式实现数据交换,且只有被系统明确要求传输的信息可以通过。其信息流一般是通用应用服务。

上面提到两个概念协议转换和信息摆渡,下面解释两个概念,此概念出自GB/T20279-2006《信息安全技术网络和终端设备隔离部件安全技术要求》

1)  协议转换

在隔离部件中,协议转换的定义是协议的剥离和重建。在所属某一安全域的隔离部件一端,把基于网络的公共协议中的应用数据剥离出来,封装为系统专用协议传递至所属其他安全域的隔离部件的另一端,在将专用协议剥离,并封装成需要的格式。

2)  信息摆渡

信息交换的一种方式,物理传输信道只在传输进行时存在。信息传输时,信息先由信息源所在安全域的一端传输至中间缓存区域,同是断开中间缓存区域与信息目的所在安全区域的链接;随后接通中间缓存区域与信息目的所在安全区域的传输信道,将信息传输至信息目的所在安全域,同时在信道上物理断开信息源所在安全域与中间缓存区的连接。在任一时刻,中间缓存区域只与一端安全区域连接。

测试环境

图1:测试环境

      

测试环境说明:

1)  上述测试环境中内网的客户端PC通过交换机链接到网闸的内网口,外网服务器通过交换机链接到外网口;

2)  内网客户端可以通过网闸的代理访问外网应用服务器;

3)  访问过程中内网客户端需要设置代理指向网闸内网IP

4)  在这个测试中假设A安装FTP客户端CuteFTP7.0,D安装FTP服务serV-U 6.2.3

测试工具

1)      LoadRunner 8.1.0 .4 开发脚本生成负载;

2)      CuteFTP 7.0 FTP客户端,生成FTP业务流;

3)      SerV-U6.2 设置FTP服务器破解版(没有并发用户限制),仿真FTP服务;

脚本设计

1)    客户端通过Socks代理访问FTP服务器,正常流程需要在客户端设置socks代理,然后就可以访问外网的FTP服务器;

2)    情况1录制脚本的时候选择FTP协议,直接录制脚本;

3)    情况2选择Winsocks协议,录制脚本;

4)    在情况2时录制脚本后回放确认是否成功。

录制脚本

1.       FTP协议录制

1)        打开LR VUG,选择FTP协议开始录制脚本,程序选择CuteFTP7.0

2)        开始录制,执行用户登录,下载文件,退出;

3)        停止录制,查看脚本;

结果:在录制完成后,查看脚本,VUG中看到没有录制到脚本,当时茫然,但具体分析一下应该是有问题的,首先客户端发出去的请求是发向socks代理服务器的,而不是直接发给FTP服务器,所以交互的信息都是socket信息;这样当然不能生成FTP协议的脚本,因为VUG不能捕捉到正常的FTP交互信息,而这写信息都被封装在socks协议中;经过分析我放弃了这种方法;

2.       Winsocks协议录制

1)        重新选择winsocks协议,程序选择CuteFTP7.0

2)        开始录制,执行用户登录,下载文件,退出;

3)        停止录制,查看脚本,

结果:脚本录制成功,脚本回放失败;分析一般情况下winsocks脚本录制完成后都不能直接回放,需要经过关联和调试后才能通过;脚本如下:

Action()

{

    lrs_create_socket("socket0", "TCP", "RemoteHost=192.168.2.195:1080",  LrsLastArg);

    lrs_send("socket0", "buf0", LrsLastArg); send  buf0 3      "/x05/x01/x00"

    lrs_receive("socket0", "buf1", LrsLastArg); recv  buf1 2   "/x05/x00"

lrs_send("socket0", "buf2", LrsLastArg);

send  buf2 10

       "/x05/x01/x00/x01"

       ""

       "/x05/xbb/x00/x15"

lrs_receive("socket0", "buf3", LrsLastArg);

recv  buf3 59

"/x05/x00/x00/x01"

""

"/x02"

""

"/x9e"

"220 Serv-U FTP Server v6.3 for WinSock ready.../r/n"

lrs_send("socket0", "buf4", LrsLastArg);

send  buf4 11

"USER root/r/n"

lrs_receive("socket0", "buf5", LrsLastArg);

recv  buf5 36

"331 User name okay, need password./r/n"

lrs_send("socket0", "buf6", LrsLastArg);

send  buf6 13

"PASS 111111/r/n"

lrs_receive("socket0", "buf7", LrsLastArg);

recv  buf7 30

"230 User logged in, proceed./r/n"

lrs_send("socket0", "buf8", LrsLastArg);

send  buf8 5

"PWD/r/n"

lrs_receive("socket0", "buf9", LrsLastArg);

recv  buf9 38

"257 /"/d:/FTP1/" is current directory./r/n"

lrs_send("socket0", "buf10", LrsLastArg);

send  buf10 6

"FEAT/r/n"

lrs_receive("socket0", "buf11", LrsLastArg);

recv  buf11 228

       "211-Extension supported/r/n"

       " CLNT/r/n"

       " MDTM/r/n"

       " MDTM YYYYMMDDHHMMSS[+-TZ];filename/r/n"

       " SIZE/r/n"

       " SITE PSWD;EXEC;SET;INDEX;ZONE;CHMOD;MSG/r/n"

       " REST STREAM/r/n"

       " XCRC filename;start;end/r/n"

       " MODE Z/r/n"

       " MLST Type*;Size*;Create;Modify*;Win32.ea*;/r/n"

       "211 End/r/n"

lrs_send("socket0", "buf12", LrsLastArg);

send  buf12 8

"MODE Z/r/n"

lrs_receive("socket0", "buf13", LrsLastArg);

recv  buf13 16

"200 MODE Z ok./r/n"

lrs_send("socket0", "buf14", LrsLastArg);

send  buf14 8

       "REST 0/r/n"

lrs_receive("socket0", "buf15", LrsLastArg);

recv  buf15 46

       "350 Restarting at 0. Send STORE or RETRIEVE./r/n"

lrs_send("socket0", "buf16", LrsLastArg);

send  buf16 6

       "PASV/r/n"

lrs_receive("socket0", "buf17", LrsLastArg);

recv  buf17 49

       "227 Entering Passive Mode (192,168,5,187,5,125)/r/n"

lrs_send("socket0", "buf18", LrsLastArg);

send  buf18 6

       "LIST/r/n"

lrs_create_socket("socket1", "TCP", "RemoteHost=192.168.2.195:1080",  LrsLastArg);

lrs_send("socket1", "buf19", LrsLastArg);

send  buf19 3

       "/x05/x01/x00"

 

lrs_receive("socket1", "buf20", LrsLastArg);

recv  buf20 2

       "/x05/x00"

 

lrs_send("socket1", "buf21", LrsLastArg);

send  buf21 10

       "/x05/x01/x00/x01"

       ""

       "/x05/xbb/x05"

       "}"

 

lrs_receive("socket1", "buf22", LrsLastArg);

recv  buf22 10

       "/x05/x00/x00/x01"

       ""

       "/x02"

       ""

       "/x 9f "

 

lrs_receive("socket0", "buf23", LrsLastArg);

recv  buf23 53

       "150 Opening ASCII mode data connection for /bin/ls./r/n"

 

lrs_receive("socket1", "buf24", LrsLastArg);

recv  buf24 137

       "x"

       "/xce"

       "1"

       "/x0e/xc2"

       "0/f"

       "/x05/xd0/x1d/x89"

       ";"

       "/xfc"

       "/v4:M"

       "/x00/x0e"

       "Q1Q橵斲搾"

       "/x01"

       "|y}"

       "/xfe/x 7f "

       "S"

       "/x0e/x00"

       "c}///f{&3"

       "/xbe"

       "!渿"

       "/x17"

       "!"

       "/x11/xc3/x1d/x 0f "

       "2应倆跻钊M穔峠j絇膇6p鰵磪竐[*"

       "/x88"

       "1G"

       "/xfb/x1e"

       ",I/tB"

       "/xce/x06/xab/x1b"

       ""

       "/x 0f "

       "e殶桍7h"

       "/x 1f "

       "Y"

       "/xfc"

    lrs_disable_socket("socket1", DISABLE_SEND);

    lrs_close_socket("socket1");

lrs_receive("socket0", "buf25", LrsLastArg);

recv  buf25 24

       "226 Transfer complete./r/n"

lrs_send("socket0", "buf26", LrsLastArg);

send  buf26 6

       "PASV/r/n"

lrs_receive("socket0", "buf27", LrsLastArg);

recv  buf27 49

       "227 Entering Passive Mode (192,168,5,187,5,126)/r/n"

lrs_send("socket0", "buf28", LrsLastArg);

send  buf28 13

       "RETR 31.txt/r/n"

    lrs_create_socket("socket2", "TCP", "RemoteHost=192.168.2.195:1080",  LrsLastArg);

lrs_send("socket2", "buf29", LrsLastArg);

send  buf29 3

       "/x05/x01/x00"

lrs_receive("socket2", "buf30", LrsLastArg);

recv  buf30 2

       "/x05/x00"

lrs_send("socket2", "buf31", LrsLastArg);

send  buf31 10

       "/x05/x01/x00/x01"

       ""

       "/x05/xbb/x05"

       "~"

lrs_receive("socket2", "buf32", LrsLastArg);

recv  buf32 10

       "/x05/x00/x00/x01"

       ""

       "/x02"

       ""

       "/xa0"

lrs_receive("socket0", "buf33", LrsLastArg);

recv  buf33 63

       "150 Opening ASCII mode data connection for 31.txt (26 Bytes)./r/n"

lrs_receive("socket2", "buf34", LrsLastArg);

recv  buf34 22

       "x"

       "/x 9c "

       "+,V"

       "/x00"

       "遭"

       "/x12/x85/x12"

       "d"

       "/x0e/x00"

       "/ti"

    lrs_disable_socket("socket2", DISABLE_SEND);

    lrs_close_socket("socket2");

lrs_receive("socket0", "buf35", LrsLastArg);

recv  buf35 24

       "226 Transfer complete./r/n"

    return 0;

}

脚本分析

1)        在上述脚本中建立了三个Socket,分别是Socket0socket1socket2,其中Socket0负责FTP命名链的交互,Socket1Socket2完成了两次数据链的交互;

2)        Buf0Buf7完成了FTP用户的登录过程;Buf8-Buf18完成了FTP的一些命令:PWDPEAT等命令;

3)        然后创建Socket1,完成数据的下载;

4)        数据下载完成后Socket1关闭:

   lrs_disable_socket("socket1", DISABLE_SEND);

    lrs_close_socket("socket1");

5)        下面有重新建立了一个Socket2下载另外的数据完成后关闭

lrs_disable_socket("socket2", DISABLE_SEND);

lrs_close_socket("socket2");

6)        看到脚本的尾部,没有发现Socket0的关闭语句,这种情况在VUG中调试脚本的时候是没有问题的,但是,如果都用户并发运行就会出现Socket冲突的问题,所以我们首先加上Socket0关闭的语句;参考Socket1的关闭语句就可以:

lrs_disable_socket("socket0", DISABLE_SEND);

lrs_close_socket("socket0");

7)        回放一下脚本,发现出错了,不要着急,中心按照录制脚本的步骤,录制一个相同操作的脚本;

8)        比较原来的脚本和新录制的脚本,看看有什么不同,哈哈发现了几处不同,但是很多都是Rec的,这个应该不是关键的地方,因为收到的信息一般影响不是很大,所以继续寻找,被我找到了吧,在看看下面的比较结果:

从上图中我看到Send Buf21 的值不同,并且好像是有一位不同,但是我还是茫然,为什么会不同呢,这个值又是从什么地方来的内,在看看上边那个Recv Buf 17 ,小样原来问题在这里,这个BUF 21中的这个"/x05/xbb/x0e/xd7"串,是由Buf17中的数据变化而来的,Buf17 "227 Entering Passive Mode (192,168,5,187,14,215)/r/n"看看21516进制是不是d7,1416进制是不是0e,终于被我找到了,那就把它动态的替换了吧(学名关联);

9)        关联

int lrs_save_param ( char *s_desc,char *buf_desc, char *param_name, int offset, int param_len);

这个函数的意思是,在Buf中查找一个字符串,然后保存到一个LR变量中;

有了他我们就好办了,看看下面的语句:

lrs_receive("socket0", "buf17","Flags= MSG_PEEK",LrsLastArg);

lrs_save_param("socket0", NULL, "param2", 41, 3);

lrs_save_param("socket0",NULL, "param1", 44, 3);

10)     变量变换

但是又遇到一个问题,通过这两个函数取出来的值是两个10进制的数,比如上面的例子取出来的值,param2=14,param1=215;但是我们需要的值是16进制的,所以还需要变化一下,看下面的函数;

n=atoi(lr_eval_string("<param1>"));//LR变量变化为整型付给C语言变量n

m=atoi(lr_eval_string("<param2>"));//LR变量变化为整型付给C语言变量m

sprintf(pam,"//x05//xbb//x0%x//x%x",m,n);//将得到的字符串保存到字符串变量pam中;

lr_save_string (pam,"param");//将字符串C语言变量转换为LR变量Param

11)     增加一个标志

经过上面的操作这个脚本可以成功回放了,但是还是会出现一些recv Buf时等待的问题,这是因为每次返回的值的字节数肯能不同;怎么解决这个问题呢,查找帮助后,需要在函数中增加一个标志:"Flags= MSG_PEEK";这个标志表示不对Buf大小进行检查,如下所示:

lrs_receive("socket0", "buf17","Flags= MSG_PEEK",LrsLastArg);

最终脚本

Action()

{

       /*通过Sockes代理运行Ftp协议

       作者:质量检测部 李刚*/

       int n,m;

       char pam[20];

    lrs_create_socket("socket0", "TCP", "RemoteHost=192.168.2.195:1080",  LrsLastArg);

    lrs_send("socket0", "buf0", LrsLastArg);

    lrs_receive("socket0", "buf1", LrsLastArg);

    lrs_send("socket0", "buf2", LrsLastArg);

    lrs_receive("socket0", "buf3", LrsLastArg);

    lrs_send("socket0", "buf4", LrsLastArg);

    lrs_receive("socket0", "buf5", LrsLastArg);

    lrs_send("socket0", "buf6", LrsLastArg);

    lrs_receive("socket0", "buf7", LrsLastArg);

    lrs_send("socket0", "buf8", LrsLastArg);

    lrs_receive("socket0", "buf9", LrsLastArg);

    lrs_send("socket0", "buf10", LrsLastArg);

    lrs_receive("socket0", "buf11", LrsLastArg);

    lrs_send("socket0", "buf12", LrsLastArg);

    lrs_receive("socket0", "buf13", LrsLastArg);

    lrs_send("socket0", "buf14", LrsLastArg);

    lrs_receive("socket0", "buf15", LrsLastArg);

    lrs_send("socket0", "buf16", LrsLastArg);

        lrs_receive("socket0", "buf17","Flags= MSG_PEEK",LrsLastArg);

       lrs_save_param("socket0", NULL, "param2", 41, 3);

       lrs_save_param("socket0",NULL, "param1", 44, 3);

    n=atoi(lr_eval_string("<param1>"));

       m=atoi(lr_eval_string("<param2>"));

    sprintf(pam,"//x05//xbb//x0%x//x%x",m,n);

       lr_save_string (pam,"param");

    lrs_send("socket0", "buf18", LrsLastArg);

    lrs_create_socket("socket1","TCP","RemoteHost=192.168.2.195:1080",  rsLastArg);

    lrs_send("socket1", "buf19", LrsLastArg);

    lrs_receive("socket1", "buf20", LrsLastArg);

    lrs_send("socket1", "buf21", LrsLastArg);

    lrs_receive("socket1", "buf22","Flags= MSG_PEEK", LrsLastArg);

    lrs_receive("socket0", "buf23","Flags= MSG_PEEK", LrsLastArg);

    lrs_receive("socket1", "buf24", LrsLastArg);

    lrs_disable_socket("socket1", DISABLE_SEND);

    lrs_close_socket("socket1");

    lrs_receive("socket0", "buf25","Flags= MSG_PEEK", LrsLastArg);

    lrs_send("socket0", "buf26", LrsLastArg);

    lrs_receive("socket0", "buf27","Flags= MSG_PEEK", LrsLastArg);

       lrs_save_param("socket0", NULL, "param2", 41, 3);

       lrs_save_param("socket0",NULL, "param1", 44, 3);

     n=atoi(lr_eval_string("<param1>"));

       m=atoi(lr_eval_string("<param2>"));

    sprintf(pam,"//x05//xbb//x0%x//x%x",m,n);

    lr_save_string (pam,"param");

    lrs_send("socket0", "buf28", LrsLastArg);

    lrs_create_socket("socket2","TCP","RemoteHost=192.168.2.195:1080", LrsLastArg);

    lrs_send("socket2", "buf29", LrsLastArg);

    lrs_receive("socket2", "buf30", LrsLastArg);

    lrs_send("socket2", "buf31", LrsLastArg);

    lrs_receive("socket2", "buf32", LrsLastArg);

    lrs_receive("socket0", "buf33", "Flags= MSG_PEEK",LrsLastArg);

    lrs_receive("socket2", "buf34", LrsLastArg);

    lrs_disable_socket("socket2", DISABLE_SEND);

    lrs_close_socket("socket2");

    lrs_receive("socket0", "buf35","Flags= MSG_PEEK", LrsLastArg);

       lrs_disable_socket("socket0", DISABLE_SEND);

    lrs_close_socket("socket0");

    return 0;

}

总结

1)       录制脚本前对脚本进行一些分析;

2)       脚本录制完成后,需要调试;

3)       如果不能运行,查看调试信息,比对不同的脚本;

4)       了解服务本身的情况,比如FTP协议,winsocket协议等;

5)       分析的过程中需要认真;

6)       多看LR的帮助。

 

 

测试对象:网闸

什么是网闸呢?网闸在GB/T20279-2006《信息安全技术网络和终端设备隔离部件安全技术要求》中的定义是这样的:“网闸(GAP)”该信息安全部件位于两个不同的安全域之间,通过协议转换手段,以信息摆渡方式实现数据交换,且只有被系统明确要求传输的信息可以通过。其信息流一般是通用应用服务。

上面提到两个概念协议转换和信息摆渡,下面解释两个概念,此概念出自GB/T20279-2006《信息安全技术网络和终端设备隔离部件安全技术要求》

1)  协议转换

在隔离部件中,协议转换的定义是协议的剥离和重建。在所属某一安全域的隔离部件一端,把基于网络的公共协议中的应用数据剥离出来,封装为系统专用协议传递至所属其他安全域的隔离部件的另一端,在将专用协议剥离,并封装成需要的格式。

2)  信息摆渡

信息交换的一种方式,物理传输信道只在传输进行时存在。信息传输时,信息先由信息源所在安全域的一端传输至中间缓存区域,同是断开中间缓存区域与信息目的所在安全区域的链接;随后接通中间缓存区域与信息目的所在安全区域的传输信道,将信息传输至信息目的所在安全域,同时在信道上物理断开信息源所在安全域与中间缓存区的连接。在任一时刻,中间缓存区域只与一端安全区域连接。

测试环境

      

测试环境说明:

1)  上述测试环境中内网的客户端PC通过交换机链接到网闸的内网口,外网服务器通过交换机链接到外网口;

2)  内网客户端可以通过网闸的代理访问外网应用服务器;

3)  访问过程中内网客户端需要设置代理指向网闸内网IP

4)  在这个测试中假设A安装FTP客户端CuteFTP7.0,D安装FTP服务serV-U 6.2.3

测试工具

1)      LoadRunner 8.1.0 .4 开发脚本生成负载;

2)      CuteFTP 7.0 FTP客户端,生成FTP业务流;

3)      SerV-U6.2 设置FTP服务器破解版(没有并发用户限制),仿真FTP服务;

脚本设计

1)    客户端通过Socks代理访问FTP服务器,正常流程需要在客户端设置socks代理,然后就可以访问外网的FTP服务器;

2)    情况1录制脚本的时候选择FTP协议,直接录制脚本;

3)    情况2选择Winsocks协议,录制脚本;

4)    在情况2时录制脚本后回放确认是否成功。

录制脚本

1.       FTP协议录制

1)        打开LR VUG,选择FTP协议开始录制脚本,程序选择CuteFTP7.0

2)        开始录制,执行用户登录,下载文件,退出;

3)        停止录制,查看脚本;

结果:在录制完成后,查看脚本,VUG中看到没有录制到脚本,当时茫然,但具体分析一下应该是有问题的,首先客户端发出去的请求是发向socks代理服务器的,而不是直接发给FTP服务器,所以交互的信息都是socket信息;这样当然不能生成FTP协议的脚本,因为VUG不能捕捉到正常的FTP交互信息,而这写信息都被封装在socks协议中;经过分析我放弃了这种方法;

2.       Winsocks协议录制

1)        重新选择winsocks协议,程序选择CuteFTP7.0

2)        开始录制,执行用户登录,下载文件,退出;

3)        停止录制,查看脚本,

结果:脚本录制成功,脚本回放失败;分析一般情况下winsocks脚本录制完成后都不能直接回放,需要经过关联和调试后才能通过;脚本如下:

Action()

{

    lrs_create_socket("socket0", "TCP", "RemoteHost=192.168.2.195:1080",  LrsLastArg);

    lrs_send("socket0", "buf0", LrsLastArg); send  buf0 3      "/x05/x01/x00"

    lrs_receive("socket0", "buf1", LrsLastArg); recv  buf1 2   "/x05/x00"

lrs_send("socket0", "buf2", LrsLastArg);

send  buf2 10

       "/x05/x01/x00/x01"

       ""

       "/x05/xbb/x00/x15"

lrs_receive("socket0", "buf3", LrsLastArg);

recv  buf3 59

"/x05/x00/x00/x01"

""

"/x02"

""

"/x9e"

"220 Serv-U FTP Server v6.3 for WinSock ready.../r/n"

lrs_send("socket0", "buf4", LrsLastArg);

send  buf4 11

"USER root/r/n"

lrs_receive("socket0", "buf5", LrsLastArg);

recv  buf5 36

"331 User name okay, need password./r/n"

lrs_send("socket0", "buf6", LrsLastArg);

send  buf6 13

"PASS 111111/r/n"

lrs_receive("socket0", "buf7", LrsLastArg);

recv  buf7 30

"230 User logged in, proceed./r/n"

lrs_send("socket0", "buf8", LrsLastArg);

send  buf8 5

"PWD/r/n"

lrs_receive("socket0", "buf9", LrsLastArg);

recv  buf9 38

"257 /"/d:/FTP1/" is current directory./r/n"

lrs_send("socket0", "buf10", LrsLastArg);

send  buf10 6

"FEAT/r/n"

lrs_receive("socket0", "buf11", LrsLastArg);

recv  buf11 228

       "211-Extension supported/r/n"

       " CLNT/r/n"

       " MDTM/r/n"

       " MDTM YYYYMMDDHHMMSS[+-TZ];filename/r/n"

       " SIZE/r/n"

       " SITE PSWD;EXEC;SET;INDEX;ZONE;CHMOD;MSG/r/n"

       " REST STREAM/r/n"

       " XCRC filename;start;end/r/n"

       " MODE Z/r/n"

       " MLST Type*;Size*;Create;Modify*;Win32.ea*;/r/n"

       "211 End/r/n"

lrs_send("socket0", "buf12", LrsLastArg);

send  buf12 8

"MODE Z/r/n"

lrs_receive("socket0", "buf13", LrsLastArg);

recv  buf13 16

"200 MODE Z ok./r/n"

lrs_send("socket0", "buf14", LrsLastArg);

send  buf14 8

       "REST 0/r/n"

lrs_receive("socket0", "buf15", LrsLastArg);

recv  buf15 46

       "350 Restarting at 0. Send STORE or RETRIEVE./r/n"

lrs_send("socket0", "buf16", LrsLastArg);

send  buf16 6

       "PASV/r/n"

lrs_receive("socket0", "buf17", LrsLastArg);

recv  buf17 49

       "227 Entering Passive Mode (192,168,5,187,5,125)/r/n"

lrs_send("socket0", "buf18", LrsLastArg);

send  buf18 6

       "LIST/r/n"

lrs_create_socket("socket1", "TCP", "RemoteHost=192.168.2.195:1080",  LrsLastArg);

lrs_send("socket1", "buf19", LrsLastArg);

send  buf19 3

       "/x05/x01/x00"

 

lrs_receive("socket1", "buf20", LrsLastArg);

recv  buf20 2

       "/x05/x00"

 

lrs_send("socket1", "buf21", LrsLastArg);

send  buf21 10

       "/x05/x01/x00/x01"

       ""

       "/x05/xbb/x05"

       "}"

 

lrs_receive("socket1", "buf22", LrsLastArg);

recv  buf22 10

       "/x05/x00/x00/x01"

       ""

       "/x02"

       ""

       "/x 9f "

 

lrs_receive("socket0", "buf23", LrsLastArg);

recv  buf23 53

       "150 Opening ASCII mode data connection for /bin/ls./r/n"

 

lrs_receive("socket1", "buf24", LrsLastArg);

recv  buf24 137

       "x"

       "/xce"

       "1"

       "/x0e/xc2"

       "0/f"

       "/x05/xd0/x1d/x89"

       ";"

       "/xfc"

       "/v4:M"

       "/x00/x0e"

       "Q1Q橵斲搾"

       "/x01"

       "|y}"

       "/xfe/x 7f "

       "S"

       "/x0e/x00"

       "c}///f{&3"

       "/xbe"

       "!渿"

       "/x17"

       "!"

       "/x11/xc3/x1d/x 0f "

       "2应倆跻钊M穔峠j絇膇6p鰵磪竐[*"

       "/x88"

       "1G"

       "/xfb/x1e"

       ",I/tB"

       "/xce/x06/xab/x1b"

       ""

       "/x 0f "

       "e殶桍7h"

       "/x 1f "

       "Y"

       "/xfc"

    lrs_disable_socket("socket1", DISABLE_SEND);

    lrs_close_socket("socket1");

lrs_receive("socket0", "buf25", LrsLastArg);

recv  buf25 24

       "226 Transfer complete./r/n"

lrs_send("socket0", "buf26", LrsLastArg);

send  buf26 6

       "PASV/r/n"

lrs_receive("socket0", "buf27", LrsLastArg);

recv  buf27 49

       "227 Entering Passive Mode (192,168,5,187,5,126)/r/n"

lrs_send("socket0", "buf28", LrsLastArg);

send  buf28 13

       "RETR 31.txt/r/n"

    lrs_create_socket("socket2", "TCP", "RemoteHost=192.168.2.195:1080",  LrsLastArg);

lrs_send("socket2", "buf29", LrsLastArg);

send  buf29 3

       "/x05/x01/x00"

lrs_receive("socket2", "buf30", LrsLastArg);

recv  buf30 2

       "/x05/x00"

lrs_send("socket2", "buf31", LrsLastArg);

send  buf31 10

       "/x05/x01/x00/x01"

       ""

       "/x05/xbb/x05"

       "~"

lrs_receive("socket2", "buf32", LrsLastArg);

recv  buf32 10

       "/x05/x00/x00/x01"

       ""

       "/x02"

       ""

       "/xa0"

lrs_receive("socket0", "buf33", LrsLastArg);

recv  buf33 63

       "150 Opening ASCII mode data connection for 31.txt (26 Bytes)./r/n"

lrs_receive("socket2", "buf34", LrsLastArg);

recv  buf34 22

       "x"

       "/x 9c "

       "+,V"

       "/x00"

       "遭"

       "/x12/x85/x12"

       "d"

       "/x0e/x00"

       "/ti"

    lrs_disable_socket("socket2", DISABLE_SEND);

    lrs_close_socket("socket2");

lrs_receive("socket0", "buf35", LrsLastArg);

recv  buf35 24

       "226 Transfer complete./r/n"

    return 0;

}

脚本分析

1)        在上述脚本中建立了三个Socket,分别是Socket0socket1socket2,其中Socket0负责FTP命名链的交互,Socket1Socket2完成了两次数据链的交互;

2)        Buf0Buf7完成了FTP用户的登录过程;Buf8-Buf18完成了FTP的一些命令:PWDPEAT等命令;

3)        然后创建Socket1,完成数据的下载;

4)        数据下载完成后Socket1关闭:

   lrs_disable_socket("socket1", DISABLE_SEND);

    lrs_close_socket("socket1");

5)        下面有重新建立了一个Socket2下载另外的数据完成后关闭

lrs_disable_socket("socket2", DISABLE_SEND);

lrs_close_socket("socket2");

6)        看到脚本的尾部,没有发现Socket0的关闭语句,这种情况在VUG中调试脚本的时候是没有问题的,但是,如果都用户并发运行就会出现Socket冲突的问题,所以我们首先加上Socket0关闭的语句;参考Socket1的关闭语句就可以:

lrs_disable_socket("socket0", DISABLE_SEND);

lrs_close_socket("socket0");

7)        回放一下脚本,发现出错了,不要着急,中心按照录制脚本的步骤,录制一个相同操作的脚本;

8)        比较原来的脚本和新录制的脚本,看看有什么不同,哈哈发现了几处不同,但是很多都是Rec的,这个应该不是关键的地方,因为收到的信息一般影响不是很大,所以继续寻找,被我找到了吧,在看看下面的比较结果:

从上图中我看到Send Buf21 的值不同,并且好像是有一位不同,但是我还是茫然,为什么会不同呢,这个值又是从什么地方来的内,在看看上边那个Recv Buf 17 ,小样原来问题在这里,这个BUF 21中的这个"/x05/xbb/x0e/xd7"串,是由Buf17中的数据变化而来的,Buf17 "227 Entering Passive Mode (192,168,5,187,14,215)/r/n"看看21516进制是不是d7,1416进制是不是0e,终于被我找到了,那就把它动态的替换了吧(学名关联);

9)        关联

int lrs_save_param ( char *s_desc,char *buf_desc, char *param_name, int offset, int param_len);

这个函数的意思是,在Buf中查找一个字符串,然后保存到一个LR变量中;

有了他我们就好办了,看看下面的语句:

lrs_receive("socket0", "buf17","Flags= MSG_PEEK",LrsLastArg);

lrs_save_param("socket0", NULL, "param2", 41, 3);

lrs_save_param("socket0",NULL, "param1", 44, 3);

10)     变量变换

但是又遇到一个问题,通过这两个函数取出来的值是两个10进制的数,比如上面的例子取出来的值,param2=14,param1=215;但是我们需要的值是16进制的,所以还需要变化一下,看下面的函数;

n=atoi(lr_eval_string("<param1>"));//LR变量变化为整型付给C语言变量n

m=atoi(lr_eval_string("<param2>"));//LR变量变化为整型付给C语言变量m

sprintf(pam,"//x05//xbb//x0%x//x%x",m,n);//将得到的字符串保存到字符串变量pam中;

lr_save_string (pam,"param");//将字符串C语言变量转换为LR变量Param

11)     增加一个标志

经过上面的操作这个脚本可以成功回放了,但是还是会出现一些recv Buf时等待的问题,这是因为每次返回的值的字节数肯能不同;怎么解决这个问题呢,查找帮助后,需要在函数中增加一个标志:"Flags= MSG_PEEK";这个标志表示不对Buf大小进行检查,如下所示:

lrs_receive("socket0", "buf17","Flags= MSG_PEEK",LrsLastArg);

最终脚本

Action()

{

       /*通过Sockes代理运行Ftp协议

       作者:质量检测部 李刚*/

       int n,m;

       char pam[20];

    lrs_create_socket("socket0", "TCP", "RemoteHost=192.168.2.195:1080",  LrsLastArg);

    lrs_send("socket0", "buf0", LrsLastArg);

    lrs_receive("socket0", "buf1", LrsLastArg);

    lrs_send("socket0", "buf2", LrsLastArg);

    lrs_receive("socket0", "buf3", LrsLastArg);

    lrs_send("socket0", "buf4", LrsLastArg);

    lrs_receive("socket0", "buf5", LrsLastArg);

    lrs_send("socket0", "buf6", LrsLastArg);

    lrs_receive("socket0", "buf7", LrsLastArg);

    lrs_send("socket0", "buf8", LrsLastArg);

    lrs_receive("socket0", "buf9", LrsLastArg);

    lrs_send("socket0", "buf10", LrsLastArg);

    lrs_receive("socket0", "buf11", LrsLastArg);

    lrs_send("socket0", "buf12", LrsLastArg);

    lrs_receive("socket0", "buf13", LrsLastArg);

    lrs_send("socket0", "buf14", LrsLastArg);

    lrs_receive("socket0", "buf15", LrsLastArg);

    lrs_send("socket0", "buf16", LrsLastArg);

        lrs_receive("socket0", "buf17","Flags= MSG_PEEK",LrsLastArg);

       lrs_save_param("socket0", NULL, "param2", 41, 3);

       lrs_save_param("socket0",NULL, "param1", 44, 3);

    n=atoi(lr_eval_string("<param1>"));

       m=atoi(lr_eval_string("<param2>"));

    sprintf(pam,"//x05//xbb//x0%x//x%x",m,n);

       lr_save_string (pam,"param");

    lrs_send("socket0", "buf18", LrsLastArg);

    lrs_create_socket("socket1","TCP","RemoteHost=192.168.2.195:1080",  rsLastArg);

    lrs_send("socket1", "buf19", LrsLastArg);

    lrs_receive("socket1", "buf20", LrsLastArg);

    lrs_send("socket1", "buf21", LrsLastArg);

    lrs_receive("socket1", "buf22","Flags= MSG_PEEK", LrsLastArg);

    lrs_receive("socket0", "buf23","Flags= MSG_PEEK", LrsLastArg);

    lrs_receive("socket1", "buf24", LrsLastArg);

    lrs_disable_socket("socket1", DISABLE_SEND);

    lrs_close_socket("socket1");

    lrs_receive("socket0", "buf25","Flags= MSG_PEEK", LrsLastArg);

    lrs_send("socket0", "buf26", LrsLastArg);

    lrs_receive("socket0", "buf27","Flags= MSG_PEEK", LrsLastArg);

       lrs_save_param("socket0", NULL, "param2", 41, 3);

       lrs_save_param("socket0",NULL, "param1", 44, 3);

     n=atoi(lr_eval_string("<param1>"));

       m=atoi(lr_eval_string("<param2>"));

    sprintf(pam,"//x05//xbb//x0%x//x%x",m,n);

    lr_save_string (pam,"param");

    lrs_send("socket0", "buf28", LrsLastArg);

    lrs_create_socket("socket2","TCP","RemoteHost=192.168.2.195:1080", LrsLastArg);

    lrs_send("socket2", "buf29", LrsLastArg);

    lrs_receive("socket2", "buf30", LrsLastArg);

    lrs_send("socket2", "buf31", LrsLastArg);

    lrs_receive("socket2", "buf32", LrsLastArg);

    lrs_receive("socket0", "buf33", "Flags= MSG_PEEK",LrsLastArg);

    lrs_receive("socket2", "buf34", LrsLastArg);

    lrs_disable_socket("socket2", DISABLE_SEND);

    lrs_close_socket("socket2");

    lrs_receive("socket0", "buf35","Flags= MSG_PEEK", LrsLastArg);

       lrs_disable_socket("socket0", DISABLE_SEND);

    lrs_close_socket("socket0");

    return 0;

}

总结

1)       录制脚本前对脚本进行一些分析;

2)       脚本录制完成后,需要调试;

3)       如果不能运行,查看调试信息,比对不同的脚本;

4)       了解服务本身的情况,比如FTP协议,winsocket协议等;

5)       分析的过程中需要认真;

6)       多看LR的帮助。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值