ORACLE数据库TNS协议分析详解.docx

上传人:b****4 文档编号:4083860 上传时间:2023-05-06 格式:DOCX 页数:27 大小:26.05KB
下载 相关 举报
ORACLE数据库TNS协议分析详解.docx_第1页
第1页 / 共27页
ORACLE数据库TNS协议分析详解.docx_第2页
第2页 / 共27页
ORACLE数据库TNS协议分析详解.docx_第3页
第3页 / 共27页
ORACLE数据库TNS协议分析详解.docx_第4页
第4页 / 共27页
ORACLE数据库TNS协议分析详解.docx_第5页
第5页 / 共27页
ORACLE数据库TNS协议分析详解.docx_第6页
第6页 / 共27页
ORACLE数据库TNS协议分析详解.docx_第7页
第7页 / 共27页
ORACLE数据库TNS协议分析详解.docx_第8页
第8页 / 共27页
ORACLE数据库TNS协议分析详解.docx_第9页
第9页 / 共27页
ORACLE数据库TNS协议分析详解.docx_第10页
第10页 / 共27页
ORACLE数据库TNS协议分析详解.docx_第11页
第11页 / 共27页
ORACLE数据库TNS协议分析详解.docx_第12页
第12页 / 共27页
ORACLE数据库TNS协议分析详解.docx_第13页
第13页 / 共27页
ORACLE数据库TNS协议分析详解.docx_第14页
第14页 / 共27页
ORACLE数据库TNS协议分析详解.docx_第15页
第15页 / 共27页
ORACLE数据库TNS协议分析详解.docx_第16页
第16页 / 共27页
ORACLE数据库TNS协议分析详解.docx_第17页
第17页 / 共27页
ORACLE数据库TNS协议分析详解.docx_第18页
第18页 / 共27页
ORACLE数据库TNS协议分析详解.docx_第19页
第19页 / 共27页
ORACLE数据库TNS协议分析详解.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

ORACLE数据库TNS协议分析详解.docx

《ORACLE数据库TNS协议分析详解.docx》由会员分享,可在线阅读,更多相关《ORACLE数据库TNS协议分析详解.docx(27页珍藏版)》请在冰点文库上搜索。

ORACLE数据库TNS协议分析详解.docx

ORACLE数据库TNS协议分析详解

ORACLETNS协议分析

1TNS介绍

TNS协议是ORACLE服务端和客户端通讯的协议。

TNS协议传输可以使用TCP/IP协议、使用SSL的TCP/IP协议、命名管道和IPC协议传输,其中TCP/IP协议传输是使用明文传送。

这里我们只分析基于TCP/IP协议上的TNS数据。

ORACLE网络通讯协议TNS有许多版本,并且大部分向下兼容,我们主要oracle9.2.0.1.0客户和服务间的传输协议,他的协议版本号为312,其兼容到300。

TNS协议有一个通用的头,通用头包含一个请求数据类型。

不同的服务请求和数据传输使用不同的请求数据类型。

对于通常意义的查询操作一般使用数据类型,当出现错误或其他情况时可能使用其他类型。

在分析过程中发现以下类型数据:

●查询语句出错会用标记(marker)类型

●客户端向服务器请求失败(如不存在的服务ID),服务器会发送拒绝(refuse)类型

●客户机登陆会发送连接类型,而服务器返回一个重定向类型数据

●当重定向端口连接完成后客户端重现发送连接类型数据,服务器返回接受类型数据,然后能够正常通讯。

2TNS数据格式

TNS数据包含一个通用的包头,这个包头包含包校验,包长度和包类型等信息。

不同的类型的数据实现不同功能的数据传输。

CommonPacketHeader

8

通用包头

Data

可变

数据

2.1通用包头格式

每个TNS完整数据都包含一个通用包头,他说明接受数据的长度及其相关校验和解析的信息。

Length

2

包的长度,包括通用包头

Packetchecksum

2

包的校验和

Type

1

TNS类型

Flag

1

状态

Headerchecksum

2

通用头的校验和

注:

Length:

包长度(包括包头)

Type:

数据包的类型

类型号

类型说明

1

连接(CONNECT)

2

接受(ACCEPT)

3

确认(ACK)

4

拒绝(REFUTE)

5

重定向(REDIRECT)

6

数据(DATA)

7

NULL

8

9

中止(ABORT)

10

11

重新发送(RESEND)

12

标记(MARKER)

13

ATTENTION

14

控制(CONTROL)

2.2连接包结构(0x01)

在客户端和ORACLE要建立连接时,客户端首先发送一个连接结构,然后服务器返回重定向包(参见2.5)。

typedefstructTNS_CONNECT_header{

UCHARNS_ver[2];

UCHARCompatible_ver[2];

UCHARser_opt1;

UCHARser_opt2;

UCHARSDU_size[2];

UCHARTDU_size[2];

UCHARNT_protocol_ch1;

UCHARNT_protocol_ch2;

UCHARMax_packets[2];

UCHARHardware_1[2];

UCHARdata_length[2];

UCHAROffset[2];

UCHARMax_data[4];

UCHARflag0;

UCHARflag1;

/*javathininterfacehasnoitemsandid,

ifitisnotjdbcthin,useoffsettooverridethese

有些版本TNS协议中没有下面几项*/

UCHARitem1[4];

UCHARitem2[4];

UCHARID[8];

UCHARunknown[8];

/*followedbydecode_des_conn_data*/

//连接字符串

}TNS_CONNECT_HEADER;

连接字符串格式:

连接功能

连接字符串

PING

(CONNECT_DATA=(COMMAND=ping));

SHOW

(CONNECT_DATA=(COMMAND=SHOWLOGFILE));

VERSION

(CONNECT_DATA=(COMMAND=version));

STATUS

(CONNECT_DATA=(COMMAND=STATUS));

ESTABLISH

(CONNECT_DATA=(SID=OBJ_SRVR)

(CID=(PROGRAM=)(HOST=140.211.111.111)

(USER=SOME_USER)));

ESTABLISH_REAL_DB

(CONNECT_DATA=(SID=wouprd)

(CID=(PROGRAM=)(HOST=spruce.ous.edu)

(USER=some_user)));

SERVICE_REGISTER

(CONNECT_DATA=(COMMAND=service_register)(LOAD=0)

(MAXLOAD=1)

(INSTANCE_LOAD=0)

(INSTANCE_MAXLOAD=0)

(SHUTDOWN_NOTIFY=ON)(FLAGS=0)

(SERVICE=obj_srvr)(INFO=PID$COLON$pid)

(DISPLAY=PRESPAWNEDSERVER)

(SERVICE_ID=BBB99B99999B-99BB-B999-B99BB9999B99)

(CLASS=ORACLE)(VERSION=81500)

(ADDRESS=(PROTOCOL=tcp)

(HOST=spruce.ous.edu)(PORT=$port)));

REDIRECT

(ADDRESS=(PROTOCOL=tcp)

(HOST=140.211.116.176)(PORT=$port));

如:

数据库一般的连接,即ESTABLISH的连接字符串为:

(DESCRIPTION=

(ADDRESS=

(PROTOCOL=TCP)

(HOST=topsec-syangjp)

(PORT=1521)

(CONNECT_DATA=

(SID=test)

(SERVER=DEDICATED)

(CID=

(PROGRAM=D:

\oracle\ora92\bin\sqlplusw.exe)

(HOST=TOPSEC-MYANGJP)

(USER=myangjp)

2.3接受包结构(0x02)

用户重定向之后,需要用重定向端口向服务器发送连接,客户端发送连接包,服务器连接成功则返回接受包,否则返回refuse包

structTNS_ACCEPT_header{

unsignedcharNS_ver[2];

unsignedcharser_opt1;

unsignedcharser_opt2;

unsignedcharSDU_size[2];

unsignedcharTDU_size[2];

unsignedcharHardware_1[2];

unsignedchardata_length[2];

unsignedcharOffset[2];

unsignedcharflag0;

unsignedcharflag1;

//unsignedcharunknown[8];

/*nofollowingdata*/

};

2.4拒绝包结构(0x04)

typedefstructTNS_REFUSE_header{

UCHARuUserRefuseReason;

UCHARuSysRefuseReason;

unsignedshortintdata_length;

//拒绝字符串

}TNS_REFUSE_HEADER;

拒绝字符串:

REFUTE

(DESCRIPTION=

(TMP=)

(VSNNUM=153092352)

(ERR=12505)

(ERROR_STACK=

(ERROR=

(CODE=12505)

(EMFI=4)

))

2.5重定向包结构(0x05)

typedefstructTNS_REDIRECT_header{

UCHARdata_length[2];

UCHARdata;//长度为data_length;

//重定向数据

}TNS_REDIRECT_HEADER;

重定向数据:

REDIRECT

(ADDRESS=(PROTOCOL=tcp)

(HOST=140.211.116.176)(PORT=$port));

2.6标记包结构(0x0c)

typedefstructTNS_MARKER_header{

UCHARdata_length[3];

}TNS_REDIRECT_HEADER;

注:

当请求命令出错时,服务器会返回三个标记包

2.7控制包结构(0x0d)

暂时没有发现该结构

2.8数据包结构(0x06)

数据包负责传输数据库客户端和服务端的各种操作。

每个操作由一个或几个命令组成,可以是在同一个数据包中有几个命令结构组合起来,也可以分开传输一些命令。

CommonHeader

8

通用包头

Dataflag

2

状态

Commandpacket

可变

数据

Commandpacket

可变

数据

Commandpacket

可变

数据

具体各种操作命令的组成和转换现在还不能完全确定,但是对于一些基本的SQL查询我们是可以分析的,下面我们主要分析一些命令结构和相关ORACLE操作的命令组成序列。

有些有许多结构和它的具体字节不影响ORACLE基本命令的分析,所以只做了简单的分析,对于SQL的一般查询语句TNS协议主要通过数据包的0x0303和0x035e命令来传输数据,返回结果主要是通过0x06和0x08命令传输数据,0x06主要传输数据,0x08主要传输系统配置相关数据。

2.8.1数据包通用结构

数据包有一个2字节的状态包和多个命令包组成:

Dataflag

2

状态

Commandpacket

可变

命令包

Commandpacket

可变

命令包

注:

●Data_flag一般情况为零,分析发现退出时为0x0040

Sendtoken

0x0001

RequestConfirmation

0x0002

Confirmation

0x0004

Reserved

0x0008

UNKNOWN

0x0010

MoreDatatoCome

0x0020

EndofFile

0x0040

DoImmediateConfirmation

0x0080

Requesttosend

0x0100

RequestNtTrailer

0x0200

命令包(Commandpacket)结构如下:

Command

1

命令

Subcommand

1

子命令

Data

可变

命令包数据

注:

命令(Command)说明(以下命令为主命令的基本功能,但是还不能完全确认):

0x01

SetProtocol

0x02

SetDataTypeRepresentation

0x03

UsertoOracleRequest

0x04

ReturnStatus

0x05

AccessUserAddressSpace

0x06

RawTransferHeader

0x07

RawTransferData

0x08

ReturnOPI(OracleProgramInterface)Parameter

0x09

OracleFunctionComplete

0x0a

NErrorReturnDefinition

0x0b

SendingI/oVectoronlyforfastUPI(UserProgramInterface)

0x0c

SendingLongforFastUPI

0x0d

InvokeUserCallback

0x0e

NetworkService

0x0f

DataIntergrity

0x10

Supervisor

0x11

0x12

通过分析具体的包和一些其他相关软件,得到以下相关命令和子命令,许多命令还需要进一步确认

命令

子命令

类型

说明

使用

0x01

0x05

请求

CLIENTTYPE

0x01

0x06

SetProtocol

0x01

0x2c

IDENT

0x02

0x00

RESET

0x02

0x01

CHAR_MAP

0x02

0x54

0x03

0x01

0x03

0x02

SQL_OPEN

0x03

0x03

QUERY

0x03

0x04

QUERYSECOND

0x03

0x05

FETCHMORE

0x03

0x08

0x03

0x09

DISCONNECT

0x03

0x0E

0x03

0x27

SET_LANG

0x03

0x2B

DESC_COLS

0x03

0x3B

DBVERSION

0x03

0x47

FETCH

0x03

0x51

Setpassword

0x03

0x52

Setuser

0x03

0x54

HANDSHAKE4

0x03

0x5E

SQL

0x03

0x73

AUTH2

0x03

0x76

AUTH1

0x03

0x77

查询表结构信息

DESC

0x04

0x01

ACK

0x04

0x02

ACK

0x04

0x05

ACK

0x06

0x00

MoreRowResultInfo

0x06

0x01

FirstRowResultInfo

0x08

0x01

0x08

0x05

0x08

0x08

0x08

0x9c

Dbversion

0x10

0x19

FieldInfo

SELEC返回

0x11

0x69

0x11

0x6b

0x11

0x78

2.8.2DataFormat(length+data)

对于ORACLE的TNS协议结构中数据传输,其主要采用以下方式,即用一个标志和长度字符来传输数据。

具体格式如下

●如果开始的大数据标志为0xfe,则结构如下

BigDataIdentify

1

DataLength

1

返回列数

Data

DataLength

DataLength

1

如果

Data

DataLength

DataLength

1

0

●如果开始的大数据标志不为0xfe,则结构如下:

DataLength

1

返回列数

Data

DataLength

2.8.2.1字符串格式

(1)Char(n),nchar

Data

可变

实际数据

Data1

可变

空格

注:

数据和数据1总长度为n

(2)Varchar(n)

Data

可变(<=n)

实际数据

2.8.2.2数字格式

(1)正数

Id

1

C0+整数部分长度

整数部分

Intlength=Id-c0

小数部分

DecLength=length-intlength-1

注:

●数据的第一位标志整数部分长度

●整数部分长度+小数部分长度=数据总长度-1

●整数部分从后向前每两位(代表0到100)用一个字节(十六进制)表示,且为十六进制值-1

●小数部分从后向前每两位(代表0到100)用一个字节(十六进制)表示,且为十六进制值-1

●如果没有小数部分,Intlength+1〉length(为数字长度),则后面有(Intlength+1-length)位(只传输位)值为0的数据没有传输

(2)负数

Id

1

3f-整数部分长度

整数部分

Intlength=3f-id

小数部分

DecLength=length-intlength-1

Magic

1

0x66

●数据的第一位标志整数部分长度

●整数部分长度+小数部分长度=数据总长度-2

●整数部分从后向前每两位(代表0到100)用一个字节(十六进制)表示,且为101-十六进制值

●小数部分从后向前每两位(代表0到100)用一个字节(十六进制)表示,且为101-十六进制值

●如果没有小数部分,Intlength+2〉length(为数字长度),则后面有(Intlength+2-length)位(只传输位)值为0的数据没有传输

2.8.2.3日期格式

Year1

1

Year1-100

Year2

1

Year2-100

Month

1

Month

Day

1

Day

Hour

1

Hour-1

Minute

1

Minute-1

Second

1

Second-1

注:

●Year1为年前两位,值为year1-100

●Year2为年后两位,值为year2-100

●Month为月,值为month

●Day为月,值为Day

●Hour为月,值为Hour-1

●Minute为月,值为Minute-1

●Second为月,值为Second-1

2.8.30x030x02SQL_OPEN

发现当进行0x0303命令查询时

Requestid

1

Magic

8

2.8.40x030x03QUERY

该命令也传输一些SQL查询请求,不能确定什么时候使用0x0303命令进行查询,在分析过程中,发现在登陆之后进行一些系统请求用到了该命令。

Requestid

1

Magic

12

DataFormat

可变

查询语句

2.8.50x030x04QUERYSECOND

很少出现这个包,也没具体分析

Requestid

1

Magic

12

2.8.60x030x05FETCHMORE

用户查询是通过0x035e命令来请求数据的返回的结果不能一次传输完成,客户端会不断发送该命令向服务器请求数据,直到服务器告诉客户端数据传送完成。

Requestid

1

Magic

8

2.8.70x030x08HANDSHAKE7

Requestid

1

Magic

4

2.8.80x030x09DISCONNECT

当客户端断开连接时,客户端发送请求到服务器(用0x0309),服务器发送0x0901确认。

Requestid

1

2.8.90x030x3BDBVERSION

请求ORACLE数据库版本信息,通过0x089c返回结果。

Requestid

1

Magic

16

2.8.100x030x47FETCH

Requestid

1

Magic

121

2.8.110x030x51Setpassword

当用户使用GRANT更改密码时,客户先通过0x0352发送用户信息,然后通过0x0351发送密码信息。

Requestid

1

Magic1

4

Usernamelength

1

用户名长度

Magic2

99

Username

Usernamelength

Sessionkey

32

Hostinfo

可变

2.8.120x030x52Setuser

当用户使用GRANT更改密码时,客户先通过0x0352发送用户信息,然后通过0x0351发送密码信息。

Requestid

1

Magic1

4

Usernamelength

1

用户名长度

Magic2

99

Username

Usernamelength

Hostinfo

可变

2.8.130x030x5ESQL

一般的SQL查询语句是封装在0x035e命令结构中,用该命令请求数据时,服务器返回数据和确认命令数据。

●如果查询命令错误,则返回错误代码和错误消息。

●如果查询正常,服务器返回执行结果数据和确认命令。

它的结构如下:

Requestid

1

Magic1

80

返回列数

DataFormat

可变

SQL查询语句

Magic3

48

总是为0x07

2.8.140x030x73AUTH2

用户登录过程发送用户密码和用户信息,包括用户名,终端名称,客户端程序,机器,客户端进程号。

2.8.150x030x76AUTH1

用户登录过程发送用户相关信息,包括用户名,会话密钥,终端名称,客户端程序,机器,客户端进程号和对服务器一些设置(语言,时区等)。

2.8.160x030x77desctable

当用户通过DESCTABLEtablename命令查询用户表属性信息时,客户端发送0x0377命令到ORACLE服务器。

Requestid

1

Magic1

4

返回列数

Tablenamelength

1

表名长度

Magic2

16

DataFormat

可变

SQL查询语句

2.8.170x040x01ACK

各种数据库操作会通过0x04命令来返回结果,如是否正常运行,影响行数,影响的表格,操作类型等,如果错误还要返回错误消息,以下0x0402,0x0405均为数据库查询返回,但是还不知道什么情况适用这三种应答。

数据应答报结构如下:

Magic1

4

Recordnum

4

记录数,该操作影响记录数

Errornum

2

返回错误代码

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2