Oracle TNS 314 協議分析——4、SQL執行流程與包分析

来源:https://www.cnblogs.com/yizhu2000/archive/2020/05/11/12866538.html
-Advertisement-
Play Games

本系列重點分析TNS 314下的客戶端與服務端之間的通訊,通過抓包分析,查看在不同客戶端,不同服務端情況下傳輸方式的不同,嘗試還原其協議細節,實現對協議中一些關鍵內容的解析,如登錄用戶名,協議版本,oracle版本,sql命令,同時給出示例LUA代碼。為了分析不同客戶端架構,本系列使用了兩類客戶端3... ...


SQL 命令典型執行過程(以Select為例)

Client

 

 

 

Server

1

-------

Data Piggyback(11) Cursor Close All(69)

註意此處也有可能是 116b,035e,0303

----->

具體語句

2

<-----

Data DescribeInfo(10)  17

-------

返回列

3

-------

Data UOCIFun(03) FetchARow(05)

----->

獲取其他值

4

<-----

Data RowTransferHeader(06)  01

-------

返回值

11g,12c有三種sql命令執行的模式:

  1. 第一種是前序一個piggyback(1169)包,然後緊接execute buddle command(035e)
  2. 第二種是前序一個session switch piggy back(116b)包,然後緊接execute buddle command(035e)
  3. 第三種是直接發送execute buddle command(035e),前者可以看做只是在後者前面加了一個頭

參考網上其他文章Oracle 9.2還有可能使用0303來發命令,而對其的返回(上述流程中2處)可能使用data 1019的包

使用0x1169執行SQL命令的情況

包格式

 

32bit

64bit

 

序列號

1

1

 

Piggyback cusor close all (1169) command

9 or 13

16 or 20

 

Buddle execute (035e)command

變長

變長

 

參考網上一些文章,Oracle9,10  Piggy Command長度為12

1169 command

這個部分是變長的,下麵是幾種變化,都以feMagic(定義參見本系列第二篇 《Oracle TNS 314 協議分析---基礎包結構》)數組開頭,有的長16個位元組,有的20個位元組

語句

Plsql

Sqlplus

Navicat

Select

fe ff ff ff ff ff ff ff

01 00 00 00

04 00 00 00

fe ff ff ff ff ff ff ff

01 00 00 00 00 00 00 00

05 00 00 00

當沒有輸入;05會變03

fe ff ff ff ff ff ff ff

01 00 00 00

05 00 00 00

Update

fe ff ff ff ff ff ff ff

01 00 00 00

02 00 00 00

fe ff ff ff ff ff ff ff

01 00 00 00 00 00 00 00 06 00 00 00

 

Delete

fe ff ff ff ff ff ff ff

01 00 00 00

02 00 00 00

fe ff ff ff ff ff ff ff

01 00 00 00 00 00 00 00 03 00 00 00

 

Insert

 

fe ff ff ff ff ff ff ff

01 00 00 00 00 00 00 00 05 00 00 00

有時是0b 有時是09

 

CreateTable

 

fe ff ff ff ff ff ff ff

01 00 00 00 00 00 00 00 07 00 00 00

 

使用0x116b執行SQL命令的情況

包格式

 

32bit

64bit

 

序列號

1

1

 

Piggy command

12

12

 

Buddle execute command 035e

變長

變長

 

Oracle9 10  Piggy Command長度也為12

Buddle execute Command  035e

 

32bit

64bit

ThinClient

 

序列號

1

1

1

 

命令相關

8

8

5

 

feMagic

1

8

1

 

語句長度相關欄位

2

2

1

 

未知 2 2 1  

固定位元組

54

152

41

所有命令都相同

SQL命令

變長

變長

變長

 

尾部位元組

52

52

17

01開頭

根據其他文章來看Oracle9、10(TNS312,313)下這個包有一定區別(主要是從序列號到SQL的位元組數分別為80,92,而11,12為172)下麵是根據其他文章分析的包結構

序列號

1

 

固定長度頭部

80 or 92

 

SQL命令

變長

SQL查詢語句

尾部位元組

48

 

ThinClient發出的包與此相差較大,將另文描述

命令相關

各個平臺各種語句調用如下

語句

PlSQL

SQLplus

Navicat

Thin Client

Select

61 80 00 00 00 00 00 00

61 80 00 00 00 00 00 00

61 81 00 00 00 00 00 00

02 80 21 00 01

Update

21 80 00 00 00 00 00 00

21 80 00 00 00 00 00 00

21 81 00 00 00 00 00 00

 

Delete

21 80 00 00 00 00 00 00

21 80 00 00 00 00 00 00

21 81 00 00 00 00 00 00

 

Insert

21 80 00 00 00 00 00 00

21 80 00 00 00 00 00 00

21 81 00 00 00 00 00 00

 

CreateTable

21 80 00 00 00 00 00 00

21 80 00 00 00 00 00 00

21 81 00 00 00 00 00 00

 

AlterTable

21 80 00 00 00 00 00 00

21 80 00 00 00 00 00 00

21 81 00 00 00 00 00 00

 

紅色部分見過這些取值

61 80 plsql select

61 81 navicat select

01 80 02 plsql select another

29 04 04 plsql declare function

29 05 04 navicat declare function

21 80 plsql 除select 外

21 81 navicat 除select 外

21 01 04 navicat call function

而在ThinClient中,返現Endian會發生變化,且前序一個長度位元組的情況,且此欄位長度也不相同

於是21 80會變成 02 80 21

語句長度欄位

此位元組與sql長度有關,OCI Client 下為sql長度欄位大小*3,如果sql較長,則會產生進位,註意進位後是little endian的形式,02 01 表示102,ThinClient下直接就是語句長度,ThinClient下語句前不會再附加長度,此處是獲取長度的最佳地點。

39 00 00 00 表示 0x39

21 01 00 00 表示 0x121

在命令超長的情況下,這個長度欄位非常有用,因為一個command會在多個TNSData包中出現,必須用這個長度欄位和TNS Command Header的長度欄位,才能正確組合超長命令。

上圖中可以看出,一個超長命令可能跨越多個TNS包,如果一個TNS包中的Command長度不足,說明還沒有收取完畢,需要繼續從buffer中讀取數據,直到命令長度滿足要求。另外處理程式如果工作在應用層,那麼處理程式從buffer中取出的數據可能橫跨多個TNS包,由於每個TNS包都有自己的頭部,就會在解析的命令中引入這些額外的頭部。為了跳過這些頭部,必須利用第一個TNS 的package Length作為指針,逐個找到每個頭部,從而處理這些額外的10位元組頭。

固定位元組

64bit OCI Client(SQLPLUS,PLSQL,Navicat)

後續19*8=152個固定位元組,使用navicat和plsql無論什麼命令都相同:

0000 fe ff ff ff ff ff ff ff 0d 00 00 00 fe ff ff ff ........ ........

0010 ff ff ff ff fe ff ff ff ff ff ff ff 00 00 00 00 ........ ........

0020 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........

0030 00 00 00 00 00 00 00 00 00 00 00 00 fe ff ff ff ........ ........

0040 ff ff ff ff 00 00 00 00 00 00 00 00 fe ff ff ff ........ ........

0050 ff ff ff ff fe ff ff ff ff ff ff ff fe ff ff ff ........ ........

0060 ff ff ff ff 00 00 00 00 00 00 00 00 fe ff ff ff ........ ........

0070 ff ff ff ff fe ff ff ff ff ff ff ff 00 00 00 00 ........ ........

0080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........

0090 00 00 00 00 00 00 00 00   ........

32bit OCI Client(SQLPLUS,PLSQL,Navicat)

後續54個固定位元組

0000  01 0d 00 00 00 01 01 00  00 00 00 01 00 00 00 00   ........ ........

0010  00 00 00 00 00 00 00 00  00 01 00 01 01 01 00 00   ........ ........

0020  00 00 00 00 00 00 01 01  00 00 00 00 00 00 00 00   ........ ........

0030  00 00 00 00 00 00

Thin Client(JAVA)

後續41個固定位元組

0000  01 0d 00 00 04 ff ff ff  ff 01 0a 04 7f ff ff ff ........ ........

0010  00 00 00 00 00 00 00 00  00 00 00 01 00 00 00 00 ........ ........

0020  00 00 00 00 00 00 00 00  00

Sql命令

後續立刻接sql,sql遵循變長字元串或數組形式,即len+值定義,第一個位元組為長度,或fe表示數組,數組中元素也是變長字元串,當為數組時數組由00結尾,所有sql都後續01。如果輸入時忘記輸入;語句後會多個0a,所以結尾看起來是0a01或0a0001(變長)。

定長命令

00A0                                          13 53 45   ........ ......SE

00B0  4c 45 43 54 20 2a 20 46  52 4f 4d 20 44 45 50 54   LECT * F ROM DEPT

00C0  0a 01 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ........ ........

00D0  00 00 00 00 00 00 00 00  00 00 00 00 00 01 00 00   ........ ........

00E0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ........ ........

00F0  00 00 00 00 00     

變長命令

ThinClient 無長度前序命令

ThinClient下發現此包無前序長度,長度由前面長度相關欄位確定

​​​​​​​包示例(Navicat 15 premium 64bit to Oracle 12)

​​​​​​​ 0303 QUERY

根據其他文章在Oracle9.2下有可能使用這種包發送命令(本文11,12 64bit下未測得),其格式如下

Request id

1

 

Magic

12

 

Data Format

可變

查詢語句

​​​​​​通過​Transfer header 獲取返回值

包示例


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 進程管理類命令 信號: 在linux當中所有的進行管理都是靠信號來管理的.像我們平時要結束某個進程就是使用的15信號SIGTERM,還有想要強制殺死某個進程,就是使用的9信號SIGKILL等等. 在linux可以查看信號有哪些的指定太多了,kill -l ; trap -l; man 7 signa ...
  • liunx中各種監控工具,量大.本篇全是命令介紹,筆者把各個命令的都實驗一遍,給同學們看看. ...
  • 阻塞IO模型(Blocking I/O) 內核一開始提供了 與 阻塞式操作。 當客戶端連接時,會在對應進程的文件描述符目錄(/proc/進程號/fd)生成對應的文件描述符(0 標準輸入;1 標準輸出;2 標準錯誤輸出;),比如 fd 8 , fd 9; 應用程式需要讀取的時候,通過系統調用 讀取,如 ...
  • 自上世紀80年代末至90年代初互聯網誕生以來,Web服務可以說是在互聯網的普及過程當中起到了巨大的作用。而Web服務應該是當今世界上普通用戶訪問互聯網的最廣泛的方式了,用戶只需在瀏覽器中輸入所謂網址的方式即可瀏覽互聯網上的海量信息,而瀏覽器這種瘦客戶端的交互方式也是目前最主流的交互方式。 Web服務 ...
  • 在丟包率0.3%的情況下,mongodb的replicaSet發生了比較嚴重的問題。表現為同步速率大幅下降,然後產生延遲。有的已經超過2-3個小時,造成有些打到延遲mongodb上面的資料庫請求無法反應資料庫的最新更改 ...
  • MongoDB向ES同步數據延遲越來越大,有的已經超過10個小時,造成客戶新加入的用戶無法被搜索出來。由於在系統中ES類似於數倉,很多統計和第三方接系統都需要從ES獲取數據,所以也影響了一些其他依賴ES數據的功能和業務。 ...
  • 本系列重點分析TNS 314下的客戶端與服務端之間的通訊,通過抓包分析,查看在不同客戶端,不同服務端情況下傳輸方式的不同,嘗試還原其協議細節,實現對協議中一些關鍵內容的解析,如登錄用戶名,協議版本,oracle版本,sql命令,同時給出示例LUA代碼。為了分析不同客戶端架構,本系列使用了兩類客戶端3... ...
  • 本系列重點分析TNS 314下的客戶端與服務端之間的通訊,通過抓包分析,查看在不同客戶端,不同服務端情況下傳輸方式的不同,嘗試還原其協議細節,實現對協議中一些關鍵內容的解析,如登錄用戶名,協議版本,oracle版本,sql命令,同時給出示例LUA代碼。為了分析不同客戶端架構,本系列使用了兩類客戶端3... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...