ORACLE数据库TNS协议分析详解Word格式.docx
- 文档编号:19264626
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:25
- 大小:26.06KB
ORACLE数据库TNS协议分析详解Word格式.docx
《ORACLE数据库TNS协议分析详解Word格式.docx》由会员分享,可在线阅读,更多相关《ORACLE数据库TNS协议分析详解Word格式.docx(25页珍藏版)》请在冰豆网上搜索。
类型号
类型说明
连接(CONNECT)
接受(ACCEPT)
3
确认(ACK)
4
拒绝(REFUTE)
5
重定向(REDIRECT)
6
数据(DATA)
7
NULL
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
(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
(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;
重定向数据:
2.6标记包结构(0x0c)
typedefstructTNS_MARKER_header{
UCHARdata_length[3];
当请求命令出错时,服务器会返回三个标记包
2.7控制包结构(0x0d)
暂时没有发现该结构
2.8数据包结构(0x06)
数据包负责传输数据库客户端和服务端的各种操作。
每个操作由一个或几个命令组成,可以是在同一个数据包中有几个命令结构组合起来,也可以分开传输一些命令。
CommonHeader
Dataflag
Commandpacket
…
具体各种操作命令的组成和转换现在还不能完全确定,但是对于一些基本的SQL查询我们是可以分析的,下面我们主要分析一些命令结构和相关ORACLE操作的命令组成序列。
有些有许多结构和它的具体字节不影响ORACLE基本命令的分析,所以只做了简单的分析,对于SQL的一般查询语句TNS协议主要通过数据包的0x0303和0x035e命令来传输数据,返回结果主要是通过0x06和0x08命令传输数据,0x06主要传输数据,0x08主要传输系统配置相关数据。
2.8.1数据包通用结构
数据包有一个2字节的状态包和多个命令包组成:
命令包
注:
●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
命令
Subcommand
子命令
命令包数据
命令(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
通过分析具体的包和一些其他相关软件,得到以下相关命令和子命令,许多命令还需要进一步确认
类型
说明
使用
请求
CLIENTTYPE
0x2c
IDENT
0x00
RESET
CHAR_MAP
0x54
SQL_OPEN
QUERY
QUERYSECOND
FETCHMORE
DISCONNECT
0x0E
0x27
SET_LANG
0x2B
DESC_COLS
0x3B
DBVERSION
0x47
FETCH
0x51
Setpassword
0x52
Setuser
HANDSHAKE4
0x5E
SQL
0x73
AUTH2
0x76
AUTH1
0x77
查询表结构信息
DESC
ACK
MoreRowResultInfo
FirstRowResultInfo
0x9c
Dbversion
0x19
FieldInfo
SELEC返回
0x69
0x6b
0x78
2.8.2DataFormat(length+data)
对于ORACLE的TNS协议结构中数据传输,其主要采用以下方式,即用一个标志和长度字符来传输数据。
具体格式如下
●如果开始的大数据标志为0xfe,则结构如下
BigDataIdentify
DataLength
返回列数
如果
●如果开始的大数据标志不为0xfe,则结构如下:
2.8.2.1字符串格式
(1)Char(n),nchar
实际数据
Data1
空格
数据和数据1总长度为n
(2)Varchar(n)
Data
可变(<
=n)
2.8.2.2数字格式
(1)正数
Id
C0+整数部分长度
整数部分
Intlength=Id-c0
小数部分
DecLength=length-intlength-1
●数据的第一位标志整数部分长度
●整数部分长度+小数部分长度=数据总长度-1
●整数部分从后向前每两位(代表0到100)用一个字节(十六进制)表示,且为十六进制值-1
●小数部分从后向前每两位(代表0到100)用一个字节(十六进制)表示,且为十六进制值-1
●如果没有小数部分,Intlength+1〉length(为数字长度),则后面有(Intlength+1-length)位(只传输位)值为0的数据没有传输
(2)负数
3f-整数部分长度
Intlength=3f-id
Magic
0x66
●整数部分长度+小数部分长度=数据总长度-2
●整数部分从后向前每两位(代表0到100)用一个字节(十六进制)表示,且为101-十六进制值
●小数部分从后向前每两位(代表0到100)用一个字节(十六进制)表示,且为101-十六进制值
●如果没有小数部分,Intlength+2〉length(为数字长度),则后面有(Intlength+2-length)位(只传输位)值为0的数据没有传输
2.8.2.3日期格式
Year1
Year1-100
Year2
Year2-100
Month
Day
Hour
Hour-1
Minute
Minute-1
Second
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
2.8.40x030x03QUERY
该命令也传输一些SQL查询请求,不能确定什么时候使用0x0303命令进行查询,在分析过程中,发现在登陆之后进行一些系统请求用到了该命令。
DataFormat
查询语句
2.8.50x030x04QUERYSECOND
很少出现这个包,也没具体分析
2.8.60x030x05FETCHMORE
用户查询是通过0x035e命令来请求数据的返回的结果不能一次传输完成,客户端会不断发送该命令向服务器请求数据,直到服务器告诉客户端数据传送完成。
2.8.70x030x08HANDSHAKE7
2.8.80x030x09DISCONNECT
当客户端断开连接时,客户端发送请求到服务器(用0x0309),服务器发送0x0901确认。
2.8.90x030x3BDBVERSION
请求ORACLE数据库版本信息,通过0x089c返回结果。
16
2.8.100x030x47FETCH
121
2.8.110x030x51Setpassword
当用户使用GRANT更改密码时,客户先通过0x0352发送用户信息,然后通过0x0351发送密码信息。
Magic1
Usernamelength
用户名长度
Magic2
99
Username
Sessionkey
32
Hostinfo
2.8.120x030x52Setuser
2.8.130x030x5ESQL
一般的SQL查询语句是封装在0x035e命令结构中,用该命令请求数据时,服务器返回数据和确认命令数据。
●如果查询命令错误,则返回错误代码和错误消息。
●如果查询正常,服务器返回执行结果数据和确认命令。
它的结构如下:
80
SQL查询语句
Magic3
48
总是为0x07
2.8.140x030x73AUTH2
用户登录过程发送用户密码和用户信息,包括用户名,终端名称,客户端程序,机器,客户端进程号。
2.8.150x030x76AUTH1
用户登录过程发送用户相关信息,包括用户名,会话密钥,终端名称,客户端程序,机器,客户端进程号和对服务器一些设置(语言,时区等)。
2.8.160x030x77desctable
当用户通过DESCTABLEtablename命令查询用户表属性信息时,客户端发送0x0377命令到ORACLE服务器。
Tablenamelength
表名长度
2.8.170x040x01ACK
各种数据库操作会通过0x04命令来返回结果,如是否正常运行,影响行数,影响的表格,操作类型等,如果错误还要返回错误消息,以下0x0402,0x0405均为数据库查询返回,但是还不知道什么情况适用这三种应答。
数据应答报结构如下:
Recordnum
记录数,该操作影响记录数
Errornum
返回错误代码
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ORACLE 数据库 TNS 协议 分析 详解