完整版ORACLETNS协议分析.docx
- 文档编号:27319930
- 上传时间:2023-06-29
- 格式:DOCX
- 页数:28
- 大小:73.56KB
完整版ORACLETNS协议分析.docx
《完整版ORACLETNS协议分析.docx》由会员分享,可在线阅读,更多相关《完整版ORACLETNS协议分析.docx(28页珍藏版)》请在冰豆网上搜索。
完整版ORACLETNS协议分析
ORACLE协议分析
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
先发送0x0376然后在发送0x0373
用户登录过程发送用户密码和用户信息,包括用户名,终端名称,客户端程序,机器,客户端进程号。
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
返回错误代码
Magic2
8
Type
1
操作类型(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整版 ORACLETNS 协议 分析