当前位置:
文档之家› (完整版)ORACLE-TNS协议分析
(完整版)ORACLE-TNS协议分析
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.8.1
数据包有一个2字节的状态包和多个命令包组成:
Data flag
2
状态
Command packet
可变
命令包
…
…
…
Command packet
可变
命令包
注:
Data_flag一般情况为零,分析发现退出时为0x0040
Send token
0x0001
Request Confirmation
0x0002
(ERR=12505)
(ERROR_STACK=
(ERROR=
(CODE=12505)
(EMFI=4)
)
))
2.5
typedef struct TNS_REDIRECT_header{
UCHA源自文库 data_length[2];
UCHAR data;//长度为data_length;
//重定向数据
}TNS_REDIRECT_HEADER;
UCHAR uUserRefuseReason;
UCHAR uSysRefuseReason;
unsigned short int data_length;
//拒绝字符串
}TNS_REFUSE_HEADER;
拒绝字符串:
REFUTE
(DESCRIPTION=
(TMP=)
(VSNNUM=153092352)
UCHAR SDU_size[2];
UCHAR TDU_size[2];
UCHAR NT_protocol_ch1;
UCHAR NT_protocol_ch2;
UCHAR Max_packets[2];
UCHAR Hardware_1[2];
UCHAR data_length[2];
UCHAR Offset[2];
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)
TNS协议有一个通用的头,通用头包含一个请求数据类型。不同的服务请求和数据传输使用不同的请求数据类型。对于通常意义的查询操作一般使用数据类型,当出现错误或其他情况时可能使用其他类型。在分析过程中发现以下类型数据:
查询语句出错会用标记(marker)类型
客户端向服务器请求失败(如不存在的服务ID),服务器会发送拒绝(refuse)类型
(DISPLAY=PRESPAWNED SERVER)
(SERVICE_ID=BBB99B99999B-99BB-B999-B99BB9999B99)
(CLASS=ORACLE)(VERSION=81500)
(ADDRESS=(PROTOCOL=tcp)
(HOST=spruce.ous.edu)(PORT=$port)));
SQL
0x03
0x73
AUTH2
0x03
0x76
AUTH1
Confirmation
0x0004
Reserved
0x0008
UNKNOWN
0x0010
More Data to Come
0x0020
End of File
0x0040
Do Immediate Confirmation
0x0080
Request to send
0x0100
Request Nt Trailer
SHOW
(CONNECT_DATA=(COMMAND=SHOW LOGFILE));
VERSION
(CONNECT_DATA=(COMMAND=version));
STATUS
(CONNECT_DATA=(COMMAND=STATUS));
ESTABLISH
(CONNECT_DATA=(SID=OBJ_SRVR)
REDIRECT
(ADDRESS=(PROTOCOL=tcp)
(HOST=140.211.116.176)(PORT=$port));
如:
数据库一般的连接,即ESTABLISH的连接字符串为:
(DESCRIPTION=
(ADDRESS=
(PROTOCOL=TCP)
(HOST=topsec-syangjp)
注:
当请求命令出错时,服务器会返回三个标记包
2.7
暂时没有发现该结构
2.8
数据包负责传输数据库客户端和服务端的各种操作。每个操作由一个或几个命令组成,可以是在同一个数据包中有几个命令结构组合起来,也可以分开传输一些命令。
Common Header
8
通用包头
Data flag
2
状态
Command packet
0x09
Oracle Function Complete
0x0a
N Error Return Definition
0x0b
Sending I/o Vector only for fast UPI(User Program Interface)
0x0c
Sending Long for Fast UPI
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
QUERY SECOND
0x03
0x05
FETCH MORE
0x03
0x08
可变
数据
Command packet
可变
数据
…
…
…
Command packet
可变
数据
具体各种操作命令的组成和转换现在还不能完全确定,但是对于一些基本的SQL查询我们是可以分析的,下面我们主要分析一些命令结构和相关ORACLE操作的命令组成序列。
有些有许多结构和它的具体字节不影响ORACLE基本命令的分析,所以只做了简单的分析,对于SQL的一般查询语句TNS协议主要通过数据包的0x0303和0x035e命令来传输数据,返回结果主要是通过0x06和0x08命令传输数据,0x06主要传输数据,0x08主要传输系统配置相关数据。
2.2
在客户端和ORACLE要建立连接时,客户端首先发送一个连接结构,然后服务器返回重定向包(参见2.5)。
typedef struct TNS_CONNECT_header{
UCHAR NS_ver[2];
UCHAR Compatible_ver[2];
UCHAR ser_opt1;
UCHAR ser_opt2;
UCHAR Max_data[4];
UCHAR flag0;
UCHAR flag1;
/*java thin interface has no items and id,
if it is not jdbc thin, use offset to override these
有些版本TNS协议中没有下面几项*/
重定向数据:
REDIRECT
(ADDRESS=(PROTOCOL=tcp)
(HOST=140.211.116.176)(PORT=$port));
2.6
typedef struct TNS_MARKER_header{
UCHAR data_length[3];
}TNS_REDIRECT_HEADER;
(PORT=1521)
)
(CONNECT_DATA=
(SID=test)
(SERVER=DEDICATED)
(CID=
(PROGRAM=D:\oracle\ora92\bin\sqlplusw.exe)
(HOST=TOPSEC-MYANGJP)
(USER=myangjp)
)
)
)
2.3
用户重定向之后,需要用重定向端口向服务器发送连接,客户端发送连接包,服务器连接成功则返回接受包,否则返回refuse包
8
通用包头
Data
可变
数据
2.1
每个TNS完整数据都包含一个通用包头,他说明接受数据的长度及其相关校验和解析的信息。
Length
2
包的长度,包括通用包头
Packet check sum
2
包的校验和
Type
1
TNS类型
Flag
1
状态
Header check sum
2
通用头的校验和
注:
Length:包长度(包括包头)
UCHAR item1[4];
UCHAR item2[4];
UCHAR ID[8];
UCHAR unknown[8];
/*followed by decode_des_conn_data */
//连接字符串
}TNS_CONNECT_HEADER;
连接字符串格式:
连接功能
连接字符串
PING
(CONNECT_DATA=(COMMAND=ping));
struct TNS_ACCEPT_header{
unsigned char NS_ver[2];
unsigned char ser_opt1;
unsigned char ser_opt2;
unsigned char SDU_size[2];
unsigned char TDU_size[2];
unsigned char Hardware_1[2];
0x03
User to Oracle Request
0x04
Return Status
0x05
Access User Address Space
0x06
Raw Transfer Header
0x07
Raw Transfer Data
0x08
Return OPI(Oracle Program Interface) Parameter
0x0d
Invoke User Callback
0x0e
Network Service
0x0f
Data Intergrity
0x10
Supervisor
0x11
0x12
通过分析具体的包和一些其他相关软件,得到以下相关命令和子命令,许多命令还需要进一步确认
命令
子命令
类型
说明
使用
0x01
0x05
请求
CLIENTTYPE
0x0200
命令包(Command packet)结构如下:
Command
1
命令
Sub command
1
子命令
Data
可变
命令包数据
注:
命令(Command)说明(以下命令为主命令的基本功能,但是还不能完全确认):
0x01
Set Protocol
0x02
Set Data Type Representation
0x03
0x09
DISCONNECT
0x03
0x0E
0x03
0x27
SET_LANG
0x03
0x2B
DESC_COLS
0x03
0x3B
DB VERSION
0x03
0x47
FETCH
0x03
0x51
Set password
0x03
0x52
Set user
0x03
0x54
HANDSHAKE4
0x03
0x5E
(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)));
客户机登陆会发送连接类型,而服务器返回一个重定向类型数据
当重定向端口连接完成后客户端重现发送连接类型数据,服务器返回接受类型数据,然后能够正常通讯。
2
TNS数据包含一个通用的包头,这个包头包含包校验,包长度和包类型等信息。
不同的类型的数据实现不同功能的数据传输。
Common Packet Header
unsigned char data_length[2];
unsigned char Offset[2];
unsigned char flag0;
unsigned char flag1;
//unsigned char unknown[8];
/*no following data*/
};
2.4
typedef struct TNS_REFUSE_header{
ORACLE协议分析
1
TNS协议是ORACLE服务端和客户端通讯的协议。TNS协议传输可以使用TCP/IP协议、使用SSL的TCP/IP协议、命名管道和IPC协议传输,其中TCP/IP协议传输是使用明文传送。这里我们只分析基于TCP/IP协议上的TNS数据。
ORACLE网络通讯协议TNS有许多版本,并且大部分向下兼容,我们主要oracle9.2.0.1.0客户和服务间的传输协议,他的协议版本号为312,其兼容到300。