從零寫一個相容MySQL/Oracle的Proxy中件間(一)《初識Oracle的通信協議》

来源:https://www.cnblogs.com/wokofo/archive/2023/02/01/17081670.html
-Advertisement-
Play Games

0.前言 MySQL由於開源的原因,有各式各樣的中件間Proxy ,極大的豐富了做高可用或遷移的方案,習慣了MySQL生態圈的靈活和便利,Oracle官方不開源代碼和協議,沒有中間件proxy,顯得很笨重。 比如以下的方案就會很不好辦: 實時抓取Oralce的訪問SQL日誌 慢日誌捕獲和收集 高可用 ...


0.前言

MySQL由於開源的原因,有各式各樣的中件間Proxy ,極大的豐富了做高可用或遷移的方案,習慣了MySQL生態圈的靈活和便利,Oracle官方不開源代碼和協議,沒有中間件proxy,顯得很笨重。

比如以下的方案就會很不好辦

  • 實時抓取Oralce的訪問SQL日誌
  • 慢日誌捕獲和收集
  • 高可用中件間Proxy在故障時自動切換
  • SQL訪問黑名單。

基於以上的一些困難,打算自己從頭寫一個相容MySQL/Oracle的中件間,希望從中件間層同時支持兩種資料庫。方便我們做資料庫的高可用管理和從Oracle到MySQL的遷移。

這個計劃是在年前的2021年最後一次組內會議上提出來的構想。元旦放假期間我就一直在想這事怎麼搞

問題的難點在於:Oracle的client/server端通信沒有文檔的說明,沒人能說清楚Oracle是怎麼交互的

這兩天用最原始的方法抓包,一個包一個包的去看,找到包的規律,分析它的通信協議。竟然發現這個方法可行

1.步驟

1.寫一個Python腳本去連接(192.168.1.1:1521)上的Oracle


#!/usr/bin/env python
## coding: utf-8
import cx_Oracle

conn = cx_Oracle.connect('dboopreader/[email protected]:1521/testdb')
print("連接成功")
conn.close()
print("連接關閉")

通過wireshark抓包,發現一次簡單的連接,有38個通信包。

wireshark抓包

2.捕獲這些包,發現它的規律

挨個點開這些包,發現了一些有用的信息,然後發現wireshark的包看起來不方便,
本地模擬一個埠1522埠,劫持這些請求,列印出來,得到如下這種的tcp包

抓到:127.0.0.1到192.168.1.1的包
二進位展示如下:
0.0x7 0xaf 0x0 0x0 0x6 0x0 0x0 0x0 0x0 0x0 0x2 0x54 0x3 0x54 0x3 0x3 0x2a 0x6 0x1 0x1 
20.0x1 0x6f 0x1 0x1 0xc 0x1 0x1 0x1 0x1 0x1 0x1 0x1 0x7f 0xff 0x3 0xe 0x3 0x3 0x1 0x1 
40.0xff 0x1 0xff 0xff 0x1 0xb 0x1 0x1 0xff 0x1 0x6 0xa 0xe2 0x1 0x7f 0x5 0xf 0xf 0xd 0x7 
60.0x2 0x1 0x0 0x0 0x18 0x0 0x7 0x80 0x0 0x0 0x0 0x3c 0x3c 0x3c 0x80 0x0 0x0 0x0 0x0 0x0 
80.0x0 0x20 0xd0 0x7 0x0 0x1 0x0 0x1 0x0 0x1 0x0 0x0 0x0 0x2 0x0 0x2 0x0 0xa 0x0 0x0 
100.0x0 0x8 0x0 0x8 0x0 0x1 0x0 0x0 0x0 0xc 0x0 0xc 0x0 0xa 0x0 0x0 0x0 0x17 0x0 0x17 
120.0x0 0x1 0x0 0x0 0x0 0x18 0x0 0x18 0x0 0x1 0x0 0x0 0x0 0x19 0x0 0x19 0x0 0x18 0x0 0x19 
140.0x0 0x1 0x0 0x0 0x0 0x1a 0x0 0x1a 0x0 0x19 0x0 0x1a 0x0 0x1 0x0 0x0 0x0 0x1b 0x0 0x1b 
160.0x0 0xa 0x0 0x1b 0x0 0x1 0x0 0x0 0x0 0x1c 0x0 0x1c 0x0 0x16 0x0 0x1c 0x0 0x1 0x0 0x0 
180.0x0 0x1d 0x0 0x1d 0x0 0x17 0x0 0x1d 0x0 0x1 0x0 0x0 0x0 0x1e 0x0 0x1e 0x0 0x17 0x0 0x1e 
200.0x0 0x1 0x0 0x0 0x0 0x1f 0x0 0x1f 0x0 0x19 0x0 0x1f 0x0 0x1 0x0 0x0 0x0 0x20 0x0 0x20 
220.0x0 0xc 0x0 0x20 0x0 0x1 0x0 0x0 0x0 0x21 0x0 0x21 0x0 0xc 0x0 0x21 0x0 0x1 0x0 0x0 
240.0x0 0xa 0x0 0xa 0x0 0x1 0x0 0x0 0x0 0xb 0x0 0xb 0x0 0x1 0x0 0x0 0x0 0x28 0x0 0x28 
260.0x0 0x1 0x0 0x0 0x0 0x29 0x0 0x29 0x0 0x1 0x0 0x0 0x0 0x75 0x0 0x75 0x0 0x1 0x0 0x0 
280.0x0 0x78 0x0 0x78 0x0 0x1 0x0 0x0 0x1 0x22 0x1 0x22 0x0 0x1 0x0 0x0 0x1 0x23 0x1 0x23 
300.0x0 0x1 0x1 0x23 0x0 0x1 0x0 0x0 0x1 0x24 0x1 0x24 0x0 0x1 0x0 0x0 0x1 0x25 0x1 0x25 
320.0x0 0x1 0x0 0x0 0x1 0x26 0x1 0x26 0x0 0x1 0x0 0x0 0x1 0x2a 0x1 0x2a 0x0 0x1 0x0 0x0 
340.0x1 0x2b 0x1 0x2b 0x0 0x1 0x0 0x0 0x1 0x2c 0x1 0x2c 0x0 0x1 0x0 0x0 0x1 0x2d 0x1 0x2d 
360.0x0 0x1 0x0 0x0 0x1 0x2e 0x1 0x2e 0x0 0x1 0x0 0x0 0x1 0x2f 0x1 0x2f 0x0 0x1 0x0 0x0 
380.0x1 0x30 0x1 0x30 0x0 0x1 0x0 0x0 0x1 0x31 0x1 0x31 0x0 0x1 0x0 0x0 0x1 0x32 0x1 0x32 
400.0x0 0x1 0x0 0x0 0x1 0x33 0x1 0x33 0x0 0x1 0x0 0x0 0x1 0x34 0x1 0x34 0x0 0x1 0x0 0x0 
420.0x1 0x35 0x1 0x35 0x0 0x1 0x0 0x0 0x1 0x36 0x1 0x36 0x0 0x1 0x0 0x0 0x1 0x37 0x1 0x37 
440.0x0 0x1 0x0 0x0 0x1 0x38 0x1 0x38 0x0 0x1 0x0 0x0 0x1 0x39 0x1 0x39 0x0 0x1 0x0 0x0 
460.0x1 0x3b 0x1 0x3b 0x0 0x1 0x0 0x0 0x1 0x3c 0x1 0x3c 0x0 0x1 0x0 0x0 0x1 0x3d 0x1 0x3d 
480.0x0 0x1 0x0 0x0 0x1 0x3e 0x1 0x3e 0x0 0x1 0x0 0x0 0x1 0x3f 0x1 0x3f 0x0 0x1 0x0 0x0 
500.0x1 0x40 0x1 0x40 0x0 0x1 0x0 0x0 0x1 0x41 0x1 0x41 0x0 0x1 0x0 0x0 0x1 0x42 0x1 0x42 
520.0x0 0x1 0x0 0x0 0x1 0x43 0x1 0x43 0x0 0x1 0x0 0x0 0x1 0x47 0x1 0x47 0x0 0x1 0x0 0x0 
540.0x1 0x48 0x1 0x48 0x0 0x1 0x0 0x0 0x1 0x49 0x1 0x49 0x0 0x1 0x0 0x0 0x1 0x4b 0x1 0x4b 
560.0x0 0x1 0x0 0x0 0x1 0x4d 0x1 0x4d 0x0 0x1 0x0 0x0 0x1 0x4e 0x1 0x4e 0x0 0x1 0x0 0x0 
580.0x1 0x4f 0x1 0x4f 0x0 0x1 0x0 0x0 0x1 0x50 0x1 0x50 0x0 0x1 0x0 0x0 0x1 0x51 0x1 0x51 
600.0x0 0x1 0x0 0x0 0x1 0x52 0x1 0x52 0x0 0x1 0x0 0x0 0x1 0x53 0x1 0x53 0x0 0x1 0x0 0x0 
620.0x1 0x54 0x1 0x54 0x0 0x1 0x0 0x0 0x1 0x55 0x1 0x55 0x0 0x1 0x0 0x0 0x1 0x56 0x1 0x56 
640.0x0 0x1 0x0 0x0 0x1 0x57 0x1 0x57 0x0 0x1 0x1 0x57 0x0 0x1 0x0 0x0 0x1 0x58 0x1 0x58 
660.0x0 0x1 0x0 0x0 0x1 0x59 0x1 0x59 0x0 0x1 0x0 0x0 0x1 0x5a 0x1 0x5a 0x0 0x1 0x0 0x0 
680.0x1 0x5c 0x1 0x5c 0x0 0x1 0x0 0x0 0x1 0x5d 0x1 0x5d 0x0 0x1 0x0 0x0 0x1 0x62 0x1 0x62 
700.0x0 0x1 0x0 0x0 0x1 0x63 0x1 0x63 0x0 0x1 0x0 0x0 0x1 0x67 0x1 0x67 0x0 0x1 0x0 0x0 
720.0x1 0x6b 0x1 0x6b 0x0 0x1 0x0 0x0 0x1 0x7c 0x1 0x7c 0x0 0x1 0x0 0x0 0x1 0x7d 0x1 0x7d 
740.0x0 0x1 0x0 0x0 0x1 0x7e 0x1 0x7e 0x0 0x1 0x0 0x0 0x1 0x7f 0x1 0x7f 0x0 0x1 0x0 0x0 
760.0x1 0x80 0x1 0x80 0x0 0x1 0x0 0x0 0x1 0x81 0x1 0x81 0x0 0x1 0x0 0x0 0x1 0x82 0x1 0x82 
780.0x0 0x1 0x0 0x0 0x1 0x83 0x1 0x83 0x0 0x1 0x0 0x0 0x1 0x84 0x1 0x84 0x0 0x1 0x0 0x0 
800.0x1 0x85 0x1 0x85 0x0 0x1 0x0 0x0 0x1 0x86 0x1 0x86 0x0 0x1 0x0 0x0 0x1 0x87 0x1 0x87 
820.0x0 0x1 0x0 0x0 0x1 0x89 0x1 0x89 0x0 0x1 0x0 0x0 0x1 0x8a 0x1 0x8a 0x0 0x1 0x0 0x0 
840.0x1 0x8b 0x1 0x8b 0x0 0x1 0x0 0x0 0x1 0x8c 0x1 0x8c 0x0 0x1 0x0 0x0 0x1 0x8d 0x1 0x8d 
860.0x0 0x1 0x0 0x0 0x1 0x8e 0x1 0x8e 0x0 0x1 0x0 0x0 0x1 0x8f 0x1 0x8f 0x0 0x1 0x0 0x0 
880.0x1 0x90 0x1 0x90 0x0 0x1 0x0 0x0 0x1 0x91 0x1 0x91 0x0 0x1 0x0 0x0 0x1 0x94 0x1 0x94 
900.0x0 0x1 0x1 0x25 0x0 0x1 0x0 0x0 0x1 0x95 0x1 0x95 0x0 0x1 0x0 0x0 0x1 0x96 0x1 0x96 
920.0x0 0x1 0x0 0x0 0x1 0x97 0x1 0x97 0x0 0x1 0x0 0x0 0x1 0x9d 0x1 0x9d 0x0 0x1 0x0 0x0 
940.0x1 0x9e 0x1 0x9e 0x0 0x1 0x0 0x0 0x1 0x9f 0x1 0x9f 0x0 0x1 0x0 0x0 0x1 0xa0 0x1 0xa0 
960.0x0 0x1 0x0 0x0 0x1 0xa1 0x1 0xa1 0x0 0x1 0x0 0x0 0x1 0xa2 0x1 0xa2 0x0 0x1 0x0 0x0 
980.0x1 0xa3 0x1 0xa3 0x0 0x1 0x0 0x0 0x1 0xa4 0x1 0xa4 0x0 0x1 0x0 0x0 0x1 0xa5 0x1 0xa5 
1000.0x0 0x1 0x0 0x0 0x1 0xa6 0x1 0xa6 0x0 0x1 0x0 0x0 0x1 0xa7 0x1 0xa7 0x0 0x1 0x0 0x0 
1020.0x1 0xa8 0x1 0xa8 0x0 0x1 0x0 0x0 0x1 0xa9 0x1 0xa9 0x0 0x1 0x0 0x0 0x1 0xaa 0x1 0xaa 
1040.0x0 0x1 0x0 0x0 0x1 0xab 0x1 0xab 0x0 0x1 0x0 0x0 0x1 0xad 0x1 0xad 0x0 0x1 0x0 0x0 
1060.0x1 0xae 0x1 0xae 0x0 0x1 0x0 0x0 0x1 0xaf 0x1 0xaf 0x0 0x1 0x0 0x0 0x1 0xb0 0x1 0xb0 
1080.0x0 0x1 0x0 0x0 0x1 0xb1 0x1 0xb1 0x0 0x1 0x0 0x0 0x1 0xc1 0x1 0xc1 0x0 0x1 0x0 0x0 
1100.0x1 0xc2 0x1 0xc2 0x0 0x1 0x1 0x25 0x0 0x1 0x0 0x0 0x1 0xc6 0x1 0xc6 0x0 0x1 0x0 0x0 
1120.0x1 0xc7 0x1 0xc7 0x0 0x1 0x0 0x0 0x1 0xc8 0x1 0xc8 0x0 0x1 0x0 0x0 0x1 0xc9 0x1 0xc9 
1140.0x0 0x1 0x0 0x0 0x1 0xca 0x1 0xca 0x0 0x1 0x1 0x9f 0x0 0x1 0x0 0x0 0x1 0xcb 0x1 0xcb 
1160.0x0 0x1 0x1 0xa0 0x0 0x1 0x0 0x0 0x1 0xcc 0x1 0xcc 0x0 0x1 0x1 0xa2 0x0 0x1 0x0 0x0 
1180.0x1 0xcd 0x1 0xcd 0x0 0x1 0x1 0xa3 0x0 0x1 0x0 0x0 0x1 0xce 0x1 0xce 0x0 0x1 0x1 0xb1 
1200.0x0 0x1 0x0 0x0 0x1 0xcf 0x1 0xcf 0x0 0x1 0x1 0x22 0x0 0x1 0x0 0x0 0x1 0xd2 0x1 0xd2 
1220.0x0 0x1 0x0 0x0 0x1 0xd3 0x1 0xd3 0x0 0x1 0x1 0xab 0x0 0x1 0x0 0x0 0x1 0xd4 0x1 0xd4 
1240.0x0 0x1 0x0 0x0 0x1 0xd5 0x1 0xd5 0x0 0x1 0x0 0x0 0x1 0xd6 0x1 0xd6 0x0 0x1 0x0 0x0 
1260.0x1 0xd7 0x1 0xd7 0x0 0x1 0x0 0x0 0x1 0xd8 0x1 0xd8 0x0 0x1 0x0 0x0 0x1 0xd9 0x1 0xd9 
1280.0x0 0x1 0x0 0x0 0x1 0xda 0x1 0xda 0x0 0x1 0x0 0x0 0x1 0xdb 0x1 0xdb 0x0 0x1 0x0 0x0 
1300.0x1 0xdc 0x1 0xdc 0x0 0x1 0x0 0x0 0x1 0xdd 0x1 0xdd 0x0 0x1 0x0 0x0 0x1 0xde 0x1 0xde 
1320.0x0 0x1 0x0 0x0 0x1 0xdf 0x1 0xdf 0x0 0x1 0x0 0x0 0x1 0xe0 0x1 0xe0 0x0 0x1 0x0 0x0 
1340.0x1 0xe1 0x1 0xe1 0x0 0x1 0x0 0x0 0x1 0xe2 0x1 0xe2 0x0 0x1 0x0 0x0 0x1 0xe3 0x1 0xe3 
1360.0x0 0x1 0x1 0x6b 0x0 0x1 0x0 0x0 0x1 0xe4 0x1 0xe4 0x0 0x1 0x0 0x0 0x1 0xe5 0x1 0xe5 
1380.0x0 0x1 0x0 0x0 0x1 0xe6 0x1 0xe6 0x0 0x1 0x0 0x0 0x1 0xea 0x1 0xea 0x0 0x1 0x0 0x0 
1400.0x1 0xeb 0x1 0xeb 0x0 0x1 0x0 0x0 0x1 0xec 0x1 0xec 0x0 0x1 0x0 0x0 0x1 0xed 0x1 0xed 
1420.0x0 0x1 0x0 0x0 0x1 0xee 0x1 0xee 0x0 0x1 0x0 0x0 0x1 0xef 0x1 0xef 0x0 0x1 0x0 0x0 
1440.0x1 0xf0 0x1 0xf0 0x0 0x1 0x0 0x0 0x1 0xf2 0x1 0xf2 0x0 0x1 0x0 0x0 0x1 0xf3 0x1 0xf3 
1460.0x0 0x1 0x0 0x0 0x1 0xf4 0x1 0xf4 0x0 0x1 0x0 0x0 0x1 0xf5 0x1 0xf5 0x0 0x1 0x0 0x0 
1480.0x1 0xf6 0x1 0xf6 0x0 0x1 0x0 0x0 0x1 0xfd 0x1 0xfd 0x0 0x1 0x0 0x0 0x1 0xfe 0x1 0xfe 
1500.0x0 0x1 0x0 0x0 0x2 0x1 0x2 0x1 0x0 0x1 0x0 0x0 0x2 0x2 0x2 0x2 0x0 0x1 0x0 0x0 
1520.0x2 0x4 0x2 0x4 0x0 0x1 0x0 0x0 0x2 0x5 0x2 0x5 0x0 0x1 0x0 0x0 0x2 0x6 0x2 0x6 
1540.0x0 0x1 0x0 0x0 0x2 0x7 0x2 0x7 0x0 0x1 0x0 0x0 0x2 0x8 0x2 0x8 0x0 0x1 0x0 0x0 
1560.0x2 0x9 0x2 0x9 0x0 0x1 0x0 0x0 0x2 0xa 0x2 0xa 0x0 0x1 0x0 0x0 0x2 0xb 0x2 0xb 
1580.0x0 0x1 0x0 0x0 0x2 0xc 0x2 0xc 0x0 0x1 0x0 0x0 0x2 0xd 0x2 0xd 0x0 0x1 0x0 0x0 
1600.0x2 0xe 0x2 0xe 0x0 0x1 0x0 0x0 0x2 0xf 0x2 0xf 0x0 0x1 0x0 0x0 0x2 0x10 0x2 0x10 
1620.0x0 0x1 0x0 0x0 0x2 0x11 0x2 0x11 0x0 0x1 0x0 0x0 0x2 0x12 0x2 0x12 0x0 0x1 0x0 0x0 
1640.0x2 0x13 0x2 0x13 0x0 0x1 0x0 0x0 0x2 0x14 0x2 0x14 0x0 0x1 0x0 0x0 0x2 0x15 0x2 0x15 
1660.0x0 0x1 0x0 0x0 0x2 0x16 0x2 0x16 0x0 0x1 0x0 0x0 0x2 0x17 0x2 0x17 0x0 0x1 0x0 0x0 
1680.0x2 0x18 0x2 0x18 0x0 0x1 0x0 0x0 0x2 0x19 0x2 0x19 0x0 0x1 0x0 0x0 0x2 0x1a 0x2 0x1a 
1700.0x0 0x1 0x0 0x0 0x2 0x1b 0x2 0x1b 0x0 0x1 0x0 0x0 0x2 0x1f 0x2 0x1f 0x0 0x1 0x0 0x0 
1720.0x2 0x20 0x2 0x20 0x0 0x1 0x0 0x0 0x2 0x21 0x2 0x21 0x0 0x1 0x0 0x0 0x2 0x22 0x2 0x22 
1740.0x0 0x1 0x0 0x0 0x2 0x23 0x2 0x23 0x0 0x1 0x0 0x0 0x2 0x24 0x2 0x24 0x0 0x1 0x0 0x0 
1760.0x2 0x25 0x2 0x25 0x0 0x1 0x0 0x0 0x2 0x26 0x2 0x26 0x0 0x1 0x0 0x0 0x2 0x27 0x2 0x27 
1780.0x0 0x1 0x0 0x0 0x2 0x28 0x2 0x28 0x0 0x1 0x0 0x0 0x2 0x29 0x2 0x29 0x0 0x1 0x0 0x0 
1800.0x2 0x2a 0x2 0x2a 0x0 0x1 0x0 0x0 0x2 0x2b 0x2 0x2b 0x0 0x1 0x0 0x0 0x2 0x2c 0x2 0x2c 
1820.0x0 0x1 0x0 0x0 0x2 0x2d 0x2 0x2d 0x0 0x1 0x0 0x0 0x2 0x2e 0x2 0x2e 0x0 0x1 0x0 0x0 
1840.0x2 0x2f 0x2 0x2f 0x0 0x1 0x0 0x0 0x2 0x30 0x2 0x30 0x0 0x1 0x0 0x0 0x2 0x31 0x2 0x31 
1860.0x0 0x1 0x0 0x0 0x2 0x32 0x2 0x32 0x0 0x1 0x0 0x0 0x2 0x33 0x2 0x33 0x0 0x1 0x0 0x0 
1880.0x2 0x34 0x2 0x34 0x0 0x1 0x0 0x0 0x2 0x36 0x2 0x36 0x0 0x1 0x0 0x0 0x2 0x37 0x2 0x37 
1900.0x0 0x1 0x0 0x0 0x2 0x38 0x2 0x38 0x0 0x1 0x0 0x0 0x2 0x39 0x2 0x39 0x0 0x1 0x0 0x0 
1920.0x2 0x3a 0x2 0x3a 0x0 0x1 0x0 0x0 0x2 0x3b 0x2 0x3b 0x0 0x1 0x0 0x0 0x2 0x3c 0x2 0x3c 
1940.0x0 0x1 0x0 0x0 0x2 0x3d 0x2 0x3d 0x0 0x1 0x0 0x0 0x2 0x3e 0x2 0x3e 0x0 0x1 0x0 0x0 
1960.0x2 0x3f 0x2 0x3f 0x0 0x1 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 
轉換成字元如下:
0.¯TT*
20.oÿ
40.ÿÿÿÿâ
60.€<<<€
80. Ð
100.
120.
140.
160.
180.
200.  
220. !!!
240.((
260.))uu
280.xx""##
300.#$$%%
320.&&**
340.++,,--
360...//
380.001122
400.3344
420.556677
440.8899
460.;;<<==
480.>>??
500.@@AABB
520.CCGG
540.HHIIKK
560.MMNN
580.OOPPQQ
600.RRSS
620.TTUUVV
640.WWWXX
660.YYZZ
680.\\]]bb
700.ccgg
720.kk||}}

是不是看起來很亂,一點一點的對比。還是從這些包里找到了一些規律

用戶連接通訊協議

byte{0x4, 0x8e, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x73, 0x3, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}開頭的包是用戶登錄驗證包,寫了一段代碼來捕獲這種包,我們就可以攔截用戶的登錄請求

寫一段代碼:

//臨時放在這裡定義,正式用的時候,需要拉出來const
  bLogininfo := [...]byte{0x4, 0x8e, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x73, 0x3, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
  //print(bLogininfo)
  for {
    n, err := src.Read(buffer)
    if err != nil {
      return
    }
    if n >= 80 {
      //不處理size小的包    
      if eqByte(bLogininfo[0:], buffer[0:20]) {
        fmt.Printf("抓到:%s到%s的用戶登錄包\n", sqlInfo.client, sqlInfo.server)
        fmt.Printf("%s\n", getLogininfo(buffer[58:260]))
      } else {
        fmt.Printf("抓到:%s到%s的包\n", sqlInfo.client, sqlInfo.server)          
        printBufferHead(buffer, 40)
      }
    }
 }

運行這段代碼,劫持請求,得到結果:

抓到:127.0.0.1到192.168.1.1的用戶登錄包
user:dboopreader,
信息:AUTH_SESSKEY,163E93DAE74B0DE9064655D10B5EE4A99B74EAD98C9F7435E216815ADB016F42758C860CF8A951D57F760FC783D0646A,
密文:AUTH_PASSWORD,@C1BCC4B909251E032F2635AD1E592D7A684DAC2F58169E

這裡我們看到了Oracle的認證協議,理論上這裡我們就可以在Proxy這層改動這個包,修改傳過去的用戶名和密碼。

SQL請求協議

實現一個Oracle代理最重要的一步是要抓到訪問的SQL,這裡是實現sql日誌/sql黑名單/讀寫分離的關鍵。經過耐心對比,確定這兩種包頭的通訊包里包含了SQL信息

OracleSQL請求協議頭

其中

  • 紅圈的包是首次執行SQL時發起的包。

  • 綠色的是同一個連接(conn沒有close) 後續發起的SQL.

攔截這兩種頭的通訊包,就可以拿到真正的SQL語句。

Oralce通訊信息的分析,SQL部分,明天再續....


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

-Advertisement-
Play Games
更多相關文章
  • 題目背景(題目鏈接) 題目描述 給定一個N*M方格的迷宮,迷宮裡有T處障礙,障礙處不可通過。 在迷宮中移動有上下左右四種方式,每次只能移動一個方格。數據保證起點上沒有障礙。 給定起點坐標和終點坐標,每個方格最多經過一次,問有多少種從起點坐標到終點坐標的方案。 輸入格式 第一行為三個正整數 N,M,T ...
  • 當我們在製作PDF文件或者PPT演示文稿的時候,為了讓自己的文件更全面詳細,就會在文件中添加附件。並且將相關文檔附加到 PDF 可以方便文檔的集中管理和傳輸。那麼如何添加或刪除 PDF 中的附件呢?別擔心,我們可以通過編程方式輕鬆實現此操作。下麵是我整理的具體步驟,並附上Java代碼供大家參考。 文 ...
  • Java實現BP神經網路,內含BP神經網路類,採用MNIST數據集,包含伺服器和客戶端程式,可在伺服器訓練後使客戶端直接使用訓練結果,界面有畫板,可以手寫數字 ...
  • 一 引入 考慮實現一種三軸機器人控制項。 三軸機器人用來將某種工件從一個位置運送到另一個位置。 其X軸為手臂軸,可以正向和反向運動,它處於末端,直接接觸工件; 其T軸為旋轉軸,可以對手臂進行旋轉; 其Z軸為升降軸,可以對手臂和旋轉部分進行升降。 二 RobotControl 定義出機器人的軸動作枚舉, ...
  • 前言 相信大家看過不少講C# async await的文章,博客園就能搜到很多,但還是有很多C#程式員不明白。 如果搞不明白,其實也不影響使用。但有人就會疑惑,為什麼要用非同步?我感覺它更慢了,跟同步有啥區別? 有的人研究深入,比如去研究狀態機,可能會明白其中的原理。但深入研究的畢竟少數。有的人寫一些 ...
  • 疑惑 最近在反覆搭建ceph集群過程中,總是遇到osd創建不成功的問題,疑似硬碟殘留信息,排查中引出了很多陌生的命令,比如vgremove等,於是打算重新瞭解這部分。 LVM是什麼? 邏輯捲管理器(LVM,Logical Volume Manager)是一種把硬碟空間分配成邏輯捲的方法。 看到定義可 ...
  • Windows server 2016 搭建DNS伺服器 環境說明: 1、Windows server 2016標準版 實操步驟: 1、添加DNS伺服器功能 1.1、點擊win圖標打開菜單,點擊打開伺服器管理器。 1.2、點擊“ 管理 ”,點擊“ 添加角色和功能 ” 下一步 基於角色或功能的安裝,下 ...
  • Taier 介紹 Taier 是袋鼠雲開源項目之一,是一個分散式可視化的DAG任務調度系統。 旨在降低ETL開發成本、提高大數據平臺穩定性,大數據開發人員可以在 Taier 直接進行業務邏輯的開發,而不用關心任務錯綜複雜的依賴關係與底層的大數據平臺的架構實現,將工作的重心更多地聚焦在業務之中。 項目 ...
一周排行
    -Advertisement-
    Play Games
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...