mirror of https://github.com/40t/go-sniffer.git
added rpc sp_executesql
This commit is contained in:
parent
4ebbd8cf59
commit
02ce0a6d80
|
@ -7,7 +7,9 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
"unicode/utf16"
|
||||||
|
|
||||||
"github.com/google/gopacket"
|
"github.com/google/gopacket"
|
||||||
)
|
)
|
||||||
|
@ -197,6 +199,17 @@ func readStream(r io.Reader) (*packet, error) {
|
||||||
return p, nil
|
return p, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ucs22str(s []byte) (string, error) {
|
||||||
|
if len(s)%2 != 0 {
|
||||||
|
return "", fmt.Errorf("Illegal UCS2 string length: %d", len(s))
|
||||||
|
}
|
||||||
|
buf := make([]uint16, len(s)/2)
|
||||||
|
for i := 0; i < len(s); i += 2 {
|
||||||
|
buf[i/2] = binary.LittleEndian.Uint16(s[i:])
|
||||||
|
}
|
||||||
|
return string(utf16.Decode(buf)), nil
|
||||||
|
}
|
||||||
|
|
||||||
func (m *stream) resolveClientPacket(p *packet) {
|
func (m *stream) resolveClientPacket(p *packet) {
|
||||||
|
|
||||||
var msg string
|
var msg string
|
||||||
|
@ -204,7 +217,7 @@ func (m *stream) resolveClientPacket(p *packet) {
|
||||||
switch p.packetType {
|
switch p.packetType {
|
||||||
case 1:
|
case 1:
|
||||||
headerLength := int(binary.LittleEndian.Uint32(p.payload[0:4]))
|
headerLength := int(binary.LittleEndian.Uint32(p.payload[0:4]))
|
||||||
// fmt.Printf("headers %d\n", headerLength)
|
// fmt.Printf("headers %x %d\n %x \n", p.payload[0:4], headerLength, p.payload)
|
||||||
if headerLength > 22 {
|
if headerLength > 22 {
|
||||||
//not exists headers
|
//not exists headers
|
||||||
msg = fmt.Sprintf("【query】 %s", string(p.payload))
|
msg = fmt.Sprintf("【query】 %s", string(p.payload))
|
||||||
|
@ -213,6 +226,55 @@ func (m *stream) resolveClientPacket(p *packet) {
|
||||||
//tds 7.2+
|
//tds 7.2+
|
||||||
msg = fmt.Sprintf("【query】 %s", string(p.payload[headerLength:]))
|
msg = fmt.Sprintf("【query】 %s", string(p.payload[headerLength:]))
|
||||||
}
|
}
|
||||||
|
case 3:
|
||||||
|
// 4 byte
|
||||||
|
pos := 0
|
||||||
|
headerLength := int(binary.LittleEndian.Uint32(p.payload[0:4]))
|
||||||
|
// fmt.Printf("rpc headers %x %d\n \n", p.payload[0:4], headerLength)
|
||||||
|
pos += headerLength
|
||||||
|
|
||||||
|
//rpc name length
|
||||||
|
rpcLength := int(binary.LittleEndian.Uint16(p.payload[pos : pos+2]))
|
||||||
|
|
||||||
|
rpcLength = rpcLength * 2
|
||||||
|
|
||||||
|
pos += 2
|
||||||
|
|
||||||
|
rpcName, _ := ucs22str(p.payload[pos : pos+rpcLength])
|
||||||
|
|
||||||
|
// fmt.Printf("rpc name %s %d %x", rpcName, rpcLength, p.payload[pos:pos+rpcLength])
|
||||||
|
|
||||||
|
pos += rpcLength
|
||||||
|
|
||||||
|
if strings.Compare(rpcName, `sp_executesql`) != 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
//OPTIONS Flags 2byte
|
||||||
|
|
||||||
|
pos += 2
|
||||||
|
|
||||||
|
//name length 1byte
|
||||||
|
nameLength := int(p.payload[pos])
|
||||||
|
// fmt.Printf("parameter nameLength %d", nameLength)
|
||||||
|
|
||||||
|
pos = pos + 1 + nameLength*2
|
||||||
|
|
||||||
|
//STATUS FLAGS 1byte
|
||||||
|
pos += 1
|
||||||
|
|
||||||
|
typeNvarchar := p.payload[pos]
|
||||||
|
// fmt.Printf("typeNvarchar %x ", typeNvarchar)
|
||||||
|
if typeNvarchar == 0xe7 {
|
||||||
|
pos += 7
|
||||||
|
|
||||||
|
//value
|
||||||
|
valueLength := int(binary.LittleEndian.Uint16(p.payload[pos+1 : pos+3]))
|
||||||
|
pos += 2
|
||||||
|
|
||||||
|
msg = fmt.Sprintf("【query】%s", string(p.payload[pos:pos+valueLength]))
|
||||||
|
|
||||||
|
}
|
||||||
|
// ParameterData
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
msg = fmt.Sprintf("【query】 %s", "Tabular result")
|
msg = fmt.Sprintf("【query】 %s", "Tabular result")
|
||||||
|
|
Loading…
Reference in New Issue