




免费预览已结束,剩余16页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ORACLETNS协议分析1 TNS介绍TNS协议是ORACLE服务端和客户端通讯的协议。TNS协议传输可以使用TCP/IP协议、使用SSL的TCP/IP协议、命名管道和IPC协议传输,其中TCP/IP协议传输是使用明文传送。这里我们只分析基于TCP/IP协议上的TNS数据。ORACLE网络通讯协议TNS有许多版本,并且大部分向下兼容,我们主要oracle .0客户和服务间的传输协议,他的协议版本号为312,其兼容到300。TNS协议有一个通用的头,通用头包含一个请求数据类型。不同的服务请求和数据传输使用不同的请求数据类型。对于通常意义的查询操作一般使用数据类型,当出现错误或其他情况时可能使用其他类型。在分析过程中发现以下类型数据:l 查询语句出错会用标记(marker)类型l 客户端向服务器请求失败(如不存在的服务ID),服务器会发送拒绝(refuse)类型l 客户机登陆会发送连接类型,而服务器返回一个重定向类型数据l 当重定向端口连接完成后客户端重现发送连接类型数据,服务器返回接受类型数据,然后能够正常通讯。2 TNS数据格式TNS数据包含一个通用的包头,这个包头包含包校验,包长度和包类型等信息。不同的类型的数据实现不同功能的数据传输。Common Packet Header8通用包头Data可变数据2.1 通用包头格式每个TNS完整数据都包含一个通用包头,他说明接受数据的长度及其相关校验和解析的信息。Length2包的长度,包括通用包头Packet check sum2包的校验和Type1TNS类型Flag1状态Header check sum2通用头的校验和注:Length:包长度(包括包头)Type: 数据包的类型类型号类型说明1连接(CONNECT)2接受(ACCEPT)3确认(ACK)4拒绝(REFUTE)5重定向(REDIRECT)6数据(DATA)7NULL89中止(ABORT)1011重新发送(RESEND)12标记(MARKER)13ATTENTION14控制(CONTROL)2.2 连接包结构(0x01)在客户端和ORACLE要建立连接时,客户端首先发送一个连接结构,然后服务器返回重定向包(参见2.5)。typedef struct TNS_CONNECT_header UCHAR NS_ver2; UCHAR Compatible_ver2; UCHAR ser_opt1; UCHAR ser_opt2; UCHAR SDU_size2; UCHAR TDU_size2; UCHAR NT_protocol_ch1; UCHAR NT_protocol_ch2; UCHAR Max_packets2; UCHAR Hardware_12; UCHAR data_length2; UCHAR Offset2; UCHAR Max_data4; UCHAR flag0; UCHAR flag1; /*java thin interface has no items and id,if it is not jdbc thin, use offset to override these有些版本TNS协议中没有下面几项*/ UCHAR item14; UCHAR item24; UCHAR ID8; UCHAR unknown8;/*followed by decode_des_conn_data */连接字符串TNS_CONNECT_HEADER;连接字符串格式:连接功能连接字符串PING(CONNECT_DATA=(COMMAND=ping);SHOW(CONNECT_DATA=(COMMAND=SHOW LOGFILE);VERSION(CONNECT_DATA=(COMMAND=version);STATUS(CONNECT_DATA=(COMMAND=STATUS);ESTABLISH(CONNECT_DATA=(SID=OBJ_SRVR)(CID=(PROGRAM=)(HOST=11)(USER=SOME_USER);ESTABLISH_REAL_DB(CONNECT_DATA=(SID=wouprd)(CID=(PROGRAM=)(HOST=)(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=PRESPAWNED SERVER)(SERVICE_ID=BBB99B99999B-99BB-B999-B99BB9999B99)(CLASS=ORACLE)(VERSION=81500)(ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=$port);REDIRECT(ADDRESS=(PROTOCOL=tcp)(HOST=76)(PORT=$port);如:数据库一般的连接,即ESTABLISH的连接字符串为:(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=topsec-syangjp)(PORT=1521)(CONNECT_DATA=(SID=test)(SERVER=DEDICATED)(CID=(PROGRAM=D:oracleora92binsqlplusw.exe)(HOST=TOPSEC-MYANGJP)(USER=myangjp) )2.3 接受包结构(0x02)用户重定向之后,需要用重定向端口向服务器发送连接,客户端发送连接包,服务器连接成功则返回接受包,否则返回refuse包struct TNS_ACCEPT_header unsigned char NS_ver2; unsigned char ser_opt1; unsigned char ser_opt2; unsigned char SDU_size2; unsigned char TDU_size2; unsigned char Hardware_12; unsigned char data_length2; unsigned char Offset2; unsigned char flag0; unsigned char flag1; /unsigned char unknown8; /*no following data*/;2.4 拒绝包结构(0x04)typedef struct TNS_REFUSE_header UCHAR uUserRefuseReason; UCHAR uSysRefuseReason; unsigned short int data_length;/拒绝字符串TNS_REFUSE_HEADER;拒绝字符串:REFUTE(DESCRIPTION= (TMP=) (VSNNUM=153092352) (ERR=12505) (ERROR_STACK= (ERROR= (CODE=12505) (EMFI=4) )2.5 重定向包结构(0x05)typedef struct TNS_REDIRECT_headerUCHAR data_length2;UCHAR data; /长度为data_length;/重定向数据TNS_REDIRECT_HEADER;重定向数据:REDIRECT(ADDRESS=(PROTOCOL=tcp)(HOST=76)(PORT=$port);2.6 标记包结构(0x0c)typedef struct TNS_MARKER_headerUCHAR data_length3;TNS_REDIRECT_HEADER;注:当请求命令出错时,服务器会返回三个标记包2.7 控制包结构(0x0d)暂时没有发现该结构2.8 数据包结构(0x06)数据包负责传输数据库客户端和服务端的各种操作。每个操作由一个或几个命令组成,可以是在同一个数据包中有几个命令结构组合起来,也可以分开传输一些命令。Common Header8通用包头Data flag2状态Command packet可变数据Command packet可变数据Command packet可变数据具体各种操作命令的组成和转换现在还不能完全确定,但是对于一些基本的SQL查询我们是可以分析的,下面我们主要分析一些命令结构和相关ORACLE操作的命令组成序列。有些有许多结构和它的具体字节不影响ORACLE基本命令的分析,所以只做了简单的分析,对于SQL的一般查询语句TNS协议主要通过数据包的0x0303和0x035e命令来传输数据,返回结果主要是通过0x06和0x08命令传输数据,0x06主要传输数据,0x08主要传输系统配置相关数据。2.8.1 数据包通用结构数据包有一个2字节的状态包和多个命令包组成:Data flag2状态Command packet可变命令包Command packet可变命令包注:l Data_flag一般情况为零,分析发现退出时为0x0040Send token0x0001Request Confirmation0x0002Confirmation0x0004Reserved0x0008UNKNOWN0x0010More Data to Come0x0020End of File0x0040Do Immediate Confirmation0x0080Request to send0x0100Request Nt Trailer0x0200命令包(Command packet)结构如下:Command1命令Sub command1子命令Data可变命令包数据注: 命令(Command)说明(以下命令为主命令的基本功能,但是还不能完全确认):0x01Set Protocol0x02Set Data Type Representation0x03User to Oracle Request0x04Return Status0x05Access User Address Space0x06Raw Transfer Header0x07Raw Transfer Data0x08Return OPI(Oracle Program Interface) Parameter0x09Oracle Function Complete0x0aN Error Return Definition0x0bSending I/o Vector only for fast UPI(User Program Interface)0x0cSending Long for Fast UPI0x0dInvoke User Callback0x0eNetwork Service0x0fData Intergrity0x10Supervisor0x110x12 通过分析具体的包和一些其他相关软件,得到以下相关命令和子命令,许多命令还需要进一步确认命令子命令类型说明使用0x010x05请求CLIENT TYPE0x010x06Set Protocol0x010x2cIDENT0x020x00RESET0x020x01CHAR_MAP0x020x540x030x010x030x02SQL_OPEN0x030x03QUERY0x030x04QUERY SECOND0x030x05FETCH MORE0x030x080x030x09DISCONNECT0x030x0E0x030x27SET_LANG0x030x2BDESC_COLS0x030x3BDB VERSION0x030x47FETCH0x030x51Set password0x030x52Set user0x030x54HANDSHAKE40x030x5ESQL0x030x73AUTH20x030x76AUTH10x030x77查询表结构信息DESC0x040x01ACK0x040x02ACK0x040x05ACK0x060x00More Row Result Info0x060x01First Row Result Info0x080x010x080x050x080x080x080x9cDb version0x100x19Field InfoSELEC返回0x110x690x110x6b0x110x782.8.2 Data Format(length+data)对于ORACLE的TNS协议结构中数据传输,其主要采用以下方式,即用一个标志和长度字符来传输数据。具体格式如下l 如果开始的大数据标志为0xfe,则结构如下Big Data Identify1Data Length1返回列数DataData LengthData Length1如果DataData LengthData Length10l 如果开始的大数据标志不为0xfe,则结构如下:Data Length1返回列数DataData Length 字符串格式(1) Char(n),ncharData可变实际数据Data1可变空格注:数据和数据1总长度为n(2) Varchar(n)Data可变(=n)实际数据 数字格式(1) 正数Id1C0+整数部分长度整数部分Intlength=Id-c0小数部分DecLength=length-intlength-1注:l 数据的第一位标志整数部分长度l 整数部分长度+小数部分长度=数据总长度-1l 整数部分从后向前每两位(代表0到100)用一个字节(十六进制)表示,且为十六进制值-1l 小数部分从后向前每两位(代表0到100)用一个字节(十六进制)表示,且为十六进制值-1l 如果没有小数部分,Intlength+1length(为数字长度),则后面有(Intlength+1-length)位(只传输位)值为0的数据没有传输(2) 负数Id13f-整数部分长度整数部分Intlength=3f-id小数部分DecLength=length-intlength-1Magic10x66l 数据的第一位标志整数部分长度l 整数部分长度+小数部分长度=数据总长度-2l 整数部分从后向前每两位(代表0到100)用一个字节(十六进制)表示,且为101-十六进制值l 小数部分从后向前每两位(代表0到100)用一个字节(十六进制)表示,且为101-十六进制值l 如果没有小数部分,Intlength+2length(为数字长度),则后面有(Intlength+2-length)位(只传输位)值为0的数据没有传输 日期格式Year11Year1-100Year21Year2-100Month1MonthDay1DayHour1Hour-1Minute1Minute-1Second1Second-1注:l Year1为年前两位,值为year1-100l Year2为年后两位,值为year2-100l Month为月,值为monthl Day为月,值为Dayl Hour为月,值为Hour-1l Minute为月,值为Minute-1l Second为月,值为Second-1l2.8.3 0x03 0x02 SQL_OPEN发现当进行0x0303命令查询时Request id1Magic82.8.4 0x03 0x03 QUERY该命令也传输一些SQL查询请求,不能确定什么时候使用0x0303命令进行查询,在分析过程中,发现在登陆之后进行一些系统请求用到了该命令。Request id1Magic12Data Format可变查询语句2.8.5 0x03 0x04 QUERY SECOND很少出现这个包,也没具体分析Request id1Magic122.8.6 0x03 0x05 FETCH MORE用户查询是通过0x035e命令来请求数据的返回的结果不能一次传输完成,客户端会不断发送该命令向服务器请求数据,直到服务器告诉客户端数据传送完成。Request id1Magic82.8.7 0x03 0x08 HANDSHAKE7Request id1Magic42.8.8 0x03 0x09 DISCONNECT当客户端断开连接时,客户端发送请求到服务器(用0x0309),服务器发送0x0901确认。Request id12.8.9 0x03 0x3B DB VERSION请求ORACLE数据库版本信息,通过0x089c返回结果。Request id1Magic162.8.10 0x03 0x47 FETCHRequest id1Magic1212.8.11 0x03 0x51 Set password当用户使用GRANT更改密码时,客户先通过0x0352发送用户信息,然后通过0x0351发送密码信息。Request id1Magic14User name length1用户名长度Magic299UsernameUser name lengthSession key32Host info可变2.8.12 0x03 0x52 Set user当用户使用GRANT更改密码时,客户先通过0x0352发送用户信息,然后通过0x0351发送密码信息。Request id1Magic14User name length1用户名长度Magic299UsernameUser name lengthHost info可变2.8.13 0x03 0x5E SQL一般的SQL查询语句是封装在0x035e命令结构中,用该命令请求数据时,服务器返回数据和确认命令数据。l 如果查询命令错误,则返回错误代码和错误消息。l 如果查询正常,服务器返回执行结果数据和确认命令。它的结构如下:Request id1Magic180返回列数Data Format可变SQL查询语句Magic348总是为0x072.8.14 0x03 0x73 AUTH2用户登录过程发送用户密码和用户信息,包括用户名,终端名称,客户端程序,机器,客户端进程号。2.8.15 0x03 0x76 AUTH1用户登录过程发送用户相关信息,包括用户名,会话密钥,终端名称,客户端程序,机器,客户端进程号和对服务器一些设置(语言,时区等)。2.8.16 0x03 0x77 desc table当用户通过DESC TABLE tablename命令查询用户表属性信息时,客户端发送0x0377命令到ORACLE服务器。Request id1Magic14返回列数Table name length1表名长度Magic216Data Format可变SQL查询语句2.8.17 0x04 0x01 ACK各种数据库操作会通过0x04命令来返回结果,如是否正常运行,影响行数,影响的表格,操作类型等,如果错误还要返回错误消息,以下0x0402,0x0405均为数据库查询返回,但是还不知道什么情况适用这三种应答。数据应答报结构如下:Magic14Record num4记录数,该操作影响记录数Error num2返回错误代码Magic28Type1操作类型(如select,insert,create等)Magic32Obj Id2操作对象ID,如表的对象IDMagic419Ack id1确认号(为该请求号+1)Magic546Msg length1消息长度MsgMsg length消息2.8.18 0x04 0x02 ACK同0x04012.8.19 0x04 0x05 ACK同0x04012.8.20 0x060x00 行结果信息如果0x06 01命令传送数据未完成则后续数据用0x06 00命令传输,且每行只传输和前一行不同的列。行结果数据结构信息Magic12Column Num2返回列数Magic223Column distributing可变等于Column Num/8Magic31总是为0x07Row Data可变Row Split可变Row Data可变Row Split可变Row Data可变行数据(Row Data)结构信息Data Format可变列数据Data Format可变列数据Data Format可变列数据注:l 对于第一行列数为Column Numl 非第一行,每行列数和列分布信息根据行分隔结构获取l行分隔结构信息Id1总是0x15Column Num2返回列数Column distributing可变等于Column Num/8Magic31总是为0x07注:l Column distributing 为该行列分布信息,如果第i列不为空,则Column distributing的第I bit为1l2.8.21 0x060x01开始行结果信息SQL查询语句返回结果主要包括字段信息和数据,其中字段数据用0x1019传输,数据有0x0601和0x0600传输。对于0x0601命令只返回开始几行数据(一般为一行),第一行显示所有的列,以后每行传输和前一行不同的列,即如果和前一行数据相同,则不传送数据,如果多行的某一列都相同,则只传送最开始一行的该列数据。Magic12Column Num2返回列数Magic223Column distributing1总是为0x00Magic31总是为0x072.8.22 0x08 0x01 经分析发现验证密钥、查询表的结构、0x033b、0x0302命令返回结果用命令0x0801,不过其格式非常不规则,很难分析。2.8.23 0x08 0x05 当用户查询请求时,有时返回结果之后会出现这个命令,具体怎么使用还不是很清楚。Magic123Value Num2返回列数Data Format数据Data Format数据Data Format数据2.8.24 0x08 0x08 当用户发送密钥成功后服务器返回响应的一些消息,如会话密钥,主机名,程序等。Magic1Data length4Data Format可变数据Data length4Data Format可变数据Data length4Data Format可变数据注:如果data length 为0 则后面数据为2.8.25 0x08 0x20 Session Key当当前用户使用grant命令更改当前用户密码之后,系统需要重新发送用户名(0x0352)和密码(0x0351),并更新会话密钥。Magic1Session key32会话密钥2.8.26 0x08 0x9c Db version当用户请求数据库版本信息(0x033b)时通过本命令返回版本信息。Magic1Data Format可变数据库版本信息Data Format可变数据库版本信息Data Format可变数据库版本信息2.8.27 0x09 0x01当ORACLE服务器收到用户关闭连接的消息时通过本命令确认关闭操作,然后断开TCP/IP连接。Magic11总是0Magic222.8.28 0x10 0x19 Field InfoSQL查询语句如果有数据返回(如SELECT语句),则先返回各字段信息,然后在返回数据信息。字段信息结构:Magic129Field num2字段个数Magic23Field Info可变字段信息Field Info可变字段信息Field Info可变字段信息Magic31207 00 00 00 07 78 6a 05 1a 0f 0b 0c注:字段信息个数为field num单个字段信息结构:Magic11Type1字段类型Magic21Precision1Scale1Magic320Charsetid2Charsetform2Spare32Magic42Is null1length1length4Data Format可变2.8.29 0x110x69当用户查询数据时,即使用0x035e命令时通常会先发送0x1178和0x1169命令。Re
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论