mirror of
https://github.com/yv1ing/ShotRDP.git
synced 2025-09-16 15:10:57 +08:00
基本适应win7,win10,win server 08,win server 12,win server 16的截图
This commit is contained in:
203
grdp/protocol/t125/per/per.go
Normal file
203
grdp/protocol/t125/per/per.go
Normal file
@@ -0,0 +1,203 @@
|
||||
package per
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
|
||||
"ShotRDP/grdp/glog"
|
||||
|
||||
"ShotRDP/grdp/core"
|
||||
)
|
||||
|
||||
func ReadEnumerates(r io.Reader) (uint8, error) {
|
||||
return core.ReadUInt8(r)
|
||||
}
|
||||
|
||||
func WriteInteger(n int, w io.Writer) {
|
||||
if n <= 0xff {
|
||||
WriteLength(1, w)
|
||||
core.WriteUInt8(uint8(n), w)
|
||||
} else if n <= 0xffff {
|
||||
WriteLength(2, w)
|
||||
core.WriteUInt16BE(uint16(n), w)
|
||||
} else {
|
||||
WriteLength(4, w)
|
||||
core.WriteUInt32BE(uint32(n), w)
|
||||
}
|
||||
}
|
||||
|
||||
func ReadInteger16(r io.Reader) (uint16, error) {
|
||||
return core.ReadUint16BE(r)
|
||||
}
|
||||
|
||||
func WriteInteger16(value uint16, w io.Writer) {
|
||||
core.WriteUInt16BE(value, w)
|
||||
}
|
||||
|
||||
/**
|
||||
* @param choice {integer}
|
||||
* @returns {type.UInt8} choice per encoded
|
||||
*/
|
||||
func WriteChoice(choice uint8, w io.Writer) {
|
||||
core.WriteUInt8(choice, w)
|
||||
}
|
||||
|
||||
/**
|
||||
* @param value {raw} value to convert to per format
|
||||
* @returns type objects per encoding value
|
||||
*/
|
||||
func WriteLength(value int, w io.Writer) {
|
||||
if value > 0x7f {
|
||||
core.WriteUInt16BE(uint16(value|0x8000), w)
|
||||
} else {
|
||||
core.WriteUInt8(uint8(value), w)
|
||||
}
|
||||
}
|
||||
|
||||
func ReadLength(r io.Reader) (uint16, error) {
|
||||
b, err := core.ReadUInt8(r)
|
||||
if err != nil {
|
||||
return 0, nil
|
||||
}
|
||||
var size uint16
|
||||
if b&0x80 > 0 {
|
||||
b = b &^ 0x80
|
||||
size = uint16(b) << 8
|
||||
left, _ := core.ReadUInt8(r)
|
||||
size += uint16(left)
|
||||
} else {
|
||||
size = uint16(b)
|
||||
}
|
||||
return size, nil
|
||||
}
|
||||
|
||||
/**
|
||||
* @param oid {array} oid to write
|
||||
* @returns {type.Component} per encoded object identifier
|
||||
*/
|
||||
func WriteObjectIdentifier(oid []byte, w io.Writer) {
|
||||
core.WriteUInt8(5, w)
|
||||
core.WriteByte((oid[0]<<4)&(oid[1]&0x0f), w)
|
||||
core.WriteByte(oid[2], w)
|
||||
core.WriteByte(oid[3], w)
|
||||
core.WriteByte(oid[4], w)
|
||||
core.WriteByte(oid[5], w)
|
||||
}
|
||||
|
||||
/**
|
||||
* @param selection {integer}
|
||||
* @returns {type.UInt8} per encoded selection
|
||||
*/
|
||||
func WriteSelection(selection uint8, w io.Writer) {
|
||||
core.WriteUInt8(selection, w)
|
||||
}
|
||||
|
||||
func WriteNumericString(s string, minValue int, w io.Writer) {
|
||||
length := len(s)
|
||||
mLength := minValue
|
||||
if length >= minValue {
|
||||
mLength = length - minValue
|
||||
}
|
||||
buff := &bytes.Buffer{}
|
||||
for i := 0; i < length; i += 2 {
|
||||
c1 := int(s[i])
|
||||
c2 := 0x30
|
||||
if i+1 < length {
|
||||
c2 = int(s[i+1])
|
||||
}
|
||||
c1 = (c1 - 0x30) % 10
|
||||
c2 = (c2 - 0x30) % 10
|
||||
core.WriteUInt8(uint8((c1<<4)|c2), buff)
|
||||
}
|
||||
WriteLength(mLength, w)
|
||||
w.Write(buff.Bytes())
|
||||
}
|
||||
|
||||
func WritePadding(length int, w io.Writer) {
|
||||
b := make([]byte, length)
|
||||
w.Write(b)
|
||||
}
|
||||
|
||||
func WriteNumberOfSet(n int, w io.Writer) {
|
||||
core.WriteUInt8(uint8(n), w)
|
||||
}
|
||||
|
||||
/**
|
||||
* @param oStr {String}
|
||||
* @param minValue {integer} default 0
|
||||
* @returns {type.Component} per encoded octet stream
|
||||
*/
|
||||
func WriteOctetStream(oStr string, minValue int, w io.Writer) {
|
||||
length := len(oStr)
|
||||
mlength := minValue
|
||||
|
||||
if length-minValue >= 0 {
|
||||
mlength = length - minValue
|
||||
}
|
||||
WriteLength(mlength, w)
|
||||
w.Write([]byte(oStr)[:length])
|
||||
}
|
||||
|
||||
func ReadChoice(r io.Reader) uint8 {
|
||||
choice, _ := core.ReadUInt8(r)
|
||||
return choice
|
||||
}
|
||||
func ReadNumberOfSet(r io.Reader) uint8 {
|
||||
choice, _ := core.ReadUInt8(r)
|
||||
return choice
|
||||
}
|
||||
func ReadInteger(r io.Reader) uint32 {
|
||||
size, _ := ReadLength(r)
|
||||
switch size {
|
||||
case 1:
|
||||
ret, _ := core.ReadUInt8(r)
|
||||
return uint32(ret)
|
||||
case 2:
|
||||
ret, _ := core.ReadUint16BE(r)
|
||||
return uint32(ret)
|
||||
case 4:
|
||||
ret, _ := core.ReadUInt32BE(r)
|
||||
return ret
|
||||
default:
|
||||
glog.Info("ReadInteger")
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func ReadObjectIdentifier(r io.Reader, oid []byte) bool {
|
||||
size, _ := ReadLength(r)
|
||||
if size != 5 {
|
||||
return false
|
||||
}
|
||||
|
||||
a_oid := []byte{0, 0, 0, 0, 0, 0}
|
||||
t12, _ := core.ReadByte(r)
|
||||
a_oid[0] = t12 >> 4
|
||||
a_oid[1] = t12 & 0x0f
|
||||
a_oid[2], _ = core.ReadByte(r)
|
||||
a_oid[3], _ = core.ReadByte(r)
|
||||
a_oid[4], _ = core.ReadByte(r)
|
||||
a_oid[5], _ = core.ReadByte(r)
|
||||
|
||||
for i, _ := range oid {
|
||||
if oid[i] != a_oid[i] {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
func ReadOctetStream(r io.Reader, s string, min int) bool {
|
||||
ln, _ := ReadLength(r)
|
||||
size := int(ln) + min
|
||||
if size != len(s) {
|
||||
return false
|
||||
}
|
||||
for i := 0; i < size; i++ {
|
||||
b, _ := core.ReadByte(r)
|
||||
if b != s[i] {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
Reference in New Issue
Block a user