smbRpc 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +22 -7
- data/examples/regAdd.rb +44 -0
- data/examples/regQuery.rb +40 -0
- data/examples/regSave.rb +26 -0
- data/lib/smbRpc.rb +1 -18
- data/lib/smbRpc/rpc/endpoints.rb +7 -2
- data/lib/smbRpc/winreg.rb +27 -0
- data/lib/smbRpc/winreg/baseRegCloseKey.rb +50 -0
- data/lib/smbRpc/winreg/baseRegCreateKey.rb +58 -0
- data/lib/smbRpc/winreg/baseRegDeleteKey.rb +38 -0
- data/lib/smbRpc/winreg/baseRegDeleteValue.rb +38 -0
- data/lib/smbRpc/winreg/baseRegEnumKey.rb +53 -0
- data/lib/smbRpc/winreg/baseRegEnumValue.rb +57 -0
- data/lib/smbRpc/winreg/baseRegOpenKey.rb +47 -0
- data/lib/smbRpc/winreg/baseRegQueryInfoKey.rb +56 -0
- data/lib/smbRpc/winreg/baseRegQueryValue.rb +81 -0
- data/lib/smbRpc/winreg/baseRegSaveKey.rb +39 -0
- data/lib/smbRpc/winreg/baseRegSetValue.rb +46 -0
- data/lib/smbRpc/winreg/constants.rb +33 -0
- data/lib/smbRpc/winreg/openClassesRoot.rb +37 -0
- data/lib/smbRpc/winreg/openCurrentConfig.rb +37 -0
- data/lib/smbRpc/winreg/openCurrentUser.rb +37 -0
- data/lib/smbRpc/winreg/openLocalMachine.rb +37 -0
- data/lib/smbRpc/winreg/openUsers.rb +37 -0
- data/smbRpc.gemspec +2 -2
- metadata +23 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 300363413b5dcdb199df282c238b28340d5feb864c91f34d41624e3baa23c558
|
4
|
+
data.tar.gz: 3625981dfdca5e97929b3489eb678760e99e26f5766ca9c8e6aad07d1fc7f977
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 02043c408515bba0e8535bfe4d5cb5b11a50ce58dacf3cc6f2f6cf4fc4e8db0230787a7b5c98ece82974951998221b58740f92949fbf2c1d19e1a431a2515322
|
7
|
+
data.tar.gz: 956e2afdc2abd9bcb05ba98136c6ab11fb7ed83c20f68a4f4fd2047d02e6014db04c8dc3bc14b3828a51ed8395e480066fa88313df89fbd91bd5d996b171c254
|
data/README.md
CHANGED
@@ -1,11 +1,26 @@
|
|
1
|
-
|
2
|
-
All function names and arguments were written to closely reflct the originals MS documented specifications.
|
1
|
+
This is a Windows RPC over SMB namepipe library modeled over the ruby_smb library.
|
2
|
+
All function names and arguments were written to closely reflct the originals MS documented specifications. So if you want to know how to use it, just read the respective MS name pipe protocol documentations, see what functions I have exposed, and read the respective function definition.
|
3
|
+
Example:
|
4
|
+
To look up names in LSA; MS-LSAD and MS-LSAT would tell you to call openPolicy then lookUpNames. If you look in the lsarpc folder you'll see both functions available. All you have to do is read the function definition in the file and decide what arguments you want to pass in.
|
5
|
+
|
6
|
+
lsarpc = SmbRpc::Lsarpc.new(ip:ip, user:user, pass:pass)
|
7
|
+
|
8
|
+
policy = lsarpc.openPolicy
|
9
|
+
|
10
|
+
p policy.lookupNames(name:"guest")
|
11
|
+
|
3
12
|
Currently I have only exposed some functions to the following namepipes. I'll be adding more as I continue developing this project.
|
4
13
|
|
5
|
-
epmapper
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
14
|
+
epmapper https://svn.nmap.org/nmap-exp/drazen/var/IDL/epmapper.idl?p=25000
|
15
|
+
|
16
|
+
samr [MS-SAMR]
|
17
|
+
|
18
|
+
srvsvc [MS-SRVS]
|
19
|
+
|
20
|
+
svcctl [MS-SCMR]
|
21
|
+
|
22
|
+
lsarpc [MS-LSAD] and [MS-LSAT]
|
23
|
+
|
24
|
+
winreg [MS-RRP]
|
10
25
|
|
11
26
|
Comments and suggestions are welcome, please email to rubysmbrpc@gmail.com
|
data/examples/regAdd.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
require"smbRpc"
|
3
|
+
|
4
|
+
ip = "10.1.1.234"
|
5
|
+
port = 445
|
6
|
+
user = "admin"
|
7
|
+
pass = "superSecret"
|
8
|
+
key = "HKLM\\HARDWARE"
|
9
|
+
|
10
|
+
splitKey = key.split("\\")
|
11
|
+
rKey = splitKey[0].upcase
|
12
|
+
sKey = splitKey[1..-1].join("\\")
|
13
|
+
|
14
|
+
newKey = "BLA"
|
15
|
+
newValues = {
|
16
|
+
"sz" => [ WINREG_REG_VALUE_TYPE["REG_SZ"], "abcd\x00".bytes.pack("v*")],
|
17
|
+
"exp" => [ WINREG_REG_VALUE_TYPE["REG_EXPAND_SZ"], "System32\\Drivers\\ACPI.sys".bytes.pack("v*")],
|
18
|
+
"bin" => [ WINREG_REG_VALUE_TYPE["REG_BINARY"], "\x23\x56\xff\xde\xed\x56\x7c\x44"],
|
19
|
+
"dwle" => [ WINREG_REG_VALUE_TYPE["REG_DWORDLE"], "\x01\x00\x00\x00"],
|
20
|
+
"dwbe" => [ WINREG_REG_VALUE_TYPE["REG_DWORDBE"], "\x00\x00\x00\xff"],
|
21
|
+
"multi" => [ WINREG_REG_VALUE_TYPE["REG_MULTI_SZ"], "System32\x00Drivers\x00ACPI.sys\x00".bytes.pack("v*")],
|
22
|
+
"qw" => [ WINREG_REG_VALUE_TYPE["REG_QWORDLE"], [4096].pack("<q")]
|
23
|
+
}
|
24
|
+
|
25
|
+
rootKeys = {
|
26
|
+
"HKLM" => SmbRpc::Winreg.new(ip:ip, user:user, pass:pass).openLocalMachine,
|
27
|
+
"HKCU" => SmbRpc::Winreg.new(ip:ip, user:user, pass:pass).openCurrentUser,
|
28
|
+
"HKCR" => SmbRpc::Winreg.new(ip:ip, user:user, pass:pass).openClassesRoot,
|
29
|
+
"HKU" => SmbRpc::Winreg.new(ip:ip, user:user, pass:pass).openUsers,
|
30
|
+
"HKCC" => SmbRpc::Winreg.new(ip:ip, user:user, pass:pass).openCurrentConfig
|
31
|
+
}
|
32
|
+
|
33
|
+
winreg = rootKeys[rKey].baseRegOpenKey(subKey:sKey)
|
34
|
+
|
35
|
+
p WINREG_DISPOSITION.key(winreg.baseRegCreateKey(subKey:newKey).disposition) #can not create key imediately under HKLM/HKU
|
36
|
+
|
37
|
+
newValues.each do |k,v|
|
38
|
+
winreg.baseRegSetValue(valueName:k, type:v[0], data:v[1])
|
39
|
+
puts"%s\\%s => %s"%[key, k, v[1].inspect]
|
40
|
+
end
|
41
|
+
|
42
|
+
winreg.close
|
43
|
+
|
44
|
+
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
require"smbRpc"
|
3
|
+
|
4
|
+
#regQuery.rb 10.1.1.245 admin seperSecret HkLm\\System\\CurrentControlset\\services\\ALG
|
5
|
+
|
6
|
+
ip = ARGV[0]
|
7
|
+
port = 445
|
8
|
+
user = ARGV[1]
|
9
|
+
pass = ARGV[2]
|
10
|
+
#key = "HkLm\\System\\CurrentControlset\\services\\ALG"
|
11
|
+
key = ARGV[3]
|
12
|
+
puts"reading: %s\n\n"%[key]
|
13
|
+
|
14
|
+
splitKey = key.split("\\")
|
15
|
+
rKey = splitKey[0].upcase
|
16
|
+
sKey = splitKey[1..-1].join("\\")
|
17
|
+
|
18
|
+
rootKeys = {
|
19
|
+
"HKLM" => SmbRpc::Winreg.new(ip:ip, user:user, pass:pass).openLocalMachine,
|
20
|
+
"HKCU" => SmbRpc::Winreg.new(ip:ip, user:user, pass:pass).openCurrentUser,
|
21
|
+
"HKCR" => SmbRpc::Winreg.new(ip:ip, user:user, pass:pass).openClassesRoot,
|
22
|
+
"HKU" => SmbRpc::Winreg.new(ip:ip, user:user, pass:pass).openUsers,
|
23
|
+
"HKCC" => SmbRpc::Winreg.new(ip:ip, user:user, pass:pass).openCurrentConfig
|
24
|
+
}
|
25
|
+
|
26
|
+
winreg = rootKeys[rKey].baseRegOpenKey(subKey:sKey)
|
27
|
+
|
28
|
+
keyInfo = winreg.baseRegQueryInfoKey
|
29
|
+
keyInfo[:numberOfSubkeys].times do |i| #enum keys if subkeys count > 0
|
30
|
+
p winreg.baseRegEnumKey(index:i)
|
31
|
+
end if keyInfo[:numberOfSubkeys] > 0
|
32
|
+
|
33
|
+
keyInfo[:numberOfValues].times do |i| #enum values if values count > 0
|
34
|
+
h = winreg.baseRegEnumValue(index:i)
|
35
|
+
puts"%s : %i : %s"%[h[:valueName], h[:type], winreg.baseRegQueryValue(valueName:h[:valueName]).inspect]
|
36
|
+
end if keyInfo[:numberOfValues] > 0
|
37
|
+
|
38
|
+
winreg.close
|
39
|
+
|
40
|
+
|
data/examples/regSave.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
require"smbRpc"
|
3
|
+
|
4
|
+
#regSave.rb 10.1.1.234 admin superSecret HkLm\\SAM C:\\sam
|
5
|
+
ip = ARGV[0]
|
6
|
+
port = 445
|
7
|
+
user = ARGV[1]
|
8
|
+
pass = ARGV[2]
|
9
|
+
key = ARGV[3]
|
10
|
+
file = ARGV[4]
|
11
|
+
|
12
|
+
splitKey = key.split("\\")
|
13
|
+
rKey = splitKey[0].upcase
|
14
|
+
sKey = splitKey[1..-1].join("\\")
|
15
|
+
|
16
|
+
rootKeys = {
|
17
|
+
"HKLM" => SmbRpc::Winreg.new(ip:ip, user:user, pass:pass).openLocalMachine,
|
18
|
+
"HKCU" => SmbRpc::Winreg.new(ip:ip, user:user, pass:pass).openCurrentUser,
|
19
|
+
"HKCR" => SmbRpc::Winreg.new(ip:ip, user:user, pass:pass).openClassesRoot,
|
20
|
+
"HKU" => SmbRpc::Winreg.new(ip:ip, user:user, pass:pass).openUsers,
|
21
|
+
"HKCC" => SmbRpc::Winreg.new(ip:ip, user:user, pass:pass).openCurrentConfig
|
22
|
+
}
|
23
|
+
|
24
|
+
winreg = rootKeys[rKey].baseRegOpenKey(subKey:sKey).baseRegSaveKey(file:file).close
|
25
|
+
puts"%s \nsaved to\n %s"%[key, file]
|
26
|
+
|
data/lib/smbRpc.rb
CHANGED
@@ -3,7 +3,6 @@ require"ruby_smb"
|
|
3
3
|
require"bindata"
|
4
4
|
require"windows_error/win32"
|
5
5
|
require"smbhash" #nice little library to make Lm/NTLM hash
|
6
|
-
#require"windows_error/nt_status" #already loaded by ruby_smb
|
7
6
|
|
8
7
|
#$:.unshift(File.expand_path('.',__dir__))
|
9
8
|
require"smbRpc/rpc"
|
@@ -12,22 +11,6 @@ require"smbRpc/svcctl"
|
|
12
11
|
require"smbRpc/lsarpc"
|
13
12
|
require"smbRpc/epmapper"
|
14
13
|
require"smbRpc/samr"
|
14
|
+
require"smbRpc/winreg"
|
15
15
|
require"smbRpc/updateRuby_smb"
|
16
16
|
require"smbRpc/updateString"
|
17
|
-
|
18
|
-
#require"rpc_packet"
|
19
|
-
#require"endpoints"
|
20
|
-
#require"constants"
|
21
|
-
#require"ndrep"
|
22
|
-
#require"srvsvc_packet"
|
23
|
-
#require"svcctl_packet"
|
24
|
-
|
25
|
-
#require_relative"endpoints"
|
26
|
-
#require_relative"constants"
|
27
|
-
#require_relative"ndrep"
|
28
|
-
#require_relative"rpc"
|
29
|
-
#require_relative"rpc_packet"
|
30
|
-
#require_relative"srvsvc"
|
31
|
-
#require_relative"srvsvc_packet"
|
32
|
-
#require_relative"svcctl"
|
33
|
-
#require_relative"svcctl_packet"
|
data/lib/smbRpc/rpc/endpoints.rb
CHANGED
@@ -25,6 +25,11 @@ module SmbRpc
|
|
25
25
|
VER_MAJOR = 1
|
26
26
|
VER_MINOR = 0
|
27
27
|
end
|
28
|
+
module Winreg
|
29
|
+
UUID = '338CD001-2244-31F1-AAAA-900038001003'
|
30
|
+
VER_MAJOR = 1
|
31
|
+
VER_MINOR = 0
|
32
|
+
end
|
28
33
|
end
|
29
34
|
end
|
30
35
|
|
@@ -33,6 +38,6 @@ ENDPOINT = {
|
|
33
38
|
"svcctl" => SmbRpc::Endpoint::Svcctl,
|
34
39
|
"lsarpc" => SmbRpc::Endpoint::Lsarpc,
|
35
40
|
"epmapper" => SmbRpc::Endpoint::Epmapper,
|
36
|
-
"samr" => SmbRpc::Endpoint::Samr
|
41
|
+
"samr" => SmbRpc::Endpoint::Samr,
|
42
|
+
"winreg" => SmbRpc::Endpoint::Winreg
|
37
43
|
}
|
38
|
-
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require"smbRpc/winreg/constants"
|
2
|
+
require"smbRpc/winreg/openLocalMachine"
|
3
|
+
require"smbRpc/winreg/baseRegOpenKey"
|
4
|
+
require"smbRpc/winreg/baseRegQueryValue"
|
5
|
+
require"smbRpc/winreg/baseRegCloseKey"
|
6
|
+
require"smbRpc/winreg/baseRegEnumKey"
|
7
|
+
require"smbRpc/winreg/baseRegQueryInfoKey"
|
8
|
+
require"smbRpc/winreg/baseRegEnumValue"
|
9
|
+
require"smbRpc/winreg/openClassesRoot"
|
10
|
+
require"smbRpc/winreg/openCurrentUser"
|
11
|
+
require"smbRpc/winreg/openUsers"
|
12
|
+
require"smbRpc/winreg/openCurrentConfig"
|
13
|
+
require"smbRpc/winreg/baseRegCreateKey"
|
14
|
+
require"smbRpc/winreg/baseRegSetValue"
|
15
|
+
require"smbRpc/winreg/baseRegDeleteValue"
|
16
|
+
require"smbRpc/winreg/baseRegDeleteKey"
|
17
|
+
require"smbRpc/winreg/baseRegSaveKey"
|
18
|
+
|
19
|
+
module SmbRpc
|
20
|
+
class Winreg < Rpc
|
21
|
+
def initialize(**argv)
|
22
|
+
super(argv)
|
23
|
+
self.connect
|
24
|
+
self.bind(pipe:"winreg")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
|
2
|
+
module SmbRpc
|
3
|
+
class Winreg < Rpc
|
4
|
+
|
5
|
+
class BaseRegCloseKeyReq < BinData::Record
|
6
|
+
endian :little
|
7
|
+
request :request
|
8
|
+
string :hKey, :length => 20
|
9
|
+
def initialize_instance
|
10
|
+
super
|
11
|
+
hKey.value = get_parameter(:handle)
|
12
|
+
request.pduHead.frag_length = self.num_bytes
|
13
|
+
request.opnum.value = 5 #BaseRegCloseKey
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class BaseRegCloseKeyRes < BinData::Record
|
18
|
+
endian :little
|
19
|
+
request :request
|
20
|
+
string :hKey, :length => 20
|
21
|
+
uint32 :windowsError
|
22
|
+
end
|
23
|
+
|
24
|
+
def closeRootKey()
|
25
|
+
if !@rootKeyHandle.nil?
|
26
|
+
baseRegCloseKeyReq = BaseRegCloseKeyReq.new(handle:@rootKeyHandle)
|
27
|
+
baseRegCloseKeyRes = @file.ioctl_send_recv(baseRegCloseKeyReq).buffer
|
28
|
+
baseRegCloseKeyRes.raise_not_error_success("closeRootKey")
|
29
|
+
baseRegCloseKeyRes = BaseRegCloseKeyRes.read(baseRegCloseKeyRes)
|
30
|
+
@rootKeyHandle = nil
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def closeSubKey()
|
35
|
+
if !@subKeyHandle.nil?
|
36
|
+
baseRegCloseKeyReq = BaseRegCloseKeyReq.new(handle:@subKeyHandle)
|
37
|
+
baseRegCloseKeyRes = @file.ioctl_send_recv(baseRegCloseKeyReq).buffer
|
38
|
+
baseRegCloseKeyRes.raise_not_error_success("closeSubKey")
|
39
|
+
baseRegCloseKeyRes = BaseRegCloseKeyRes.read(baseRegCloseKeyRes)
|
40
|
+
@subKeyHandle = nil
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def close()
|
45
|
+
closeSubKey()
|
46
|
+
closeRootKey()
|
47
|
+
super
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Winreg < Rpc
|
3
|
+
attr_reader :disposition
|
4
|
+
|
5
|
+
class BaseRegCreateKeyReq < BinData::Record
|
6
|
+
endian :little
|
7
|
+
request :request
|
8
|
+
string :hKey, :length => 20
|
9
|
+
rpc_unicode_string :lpSubKey
|
10
|
+
conformantandVaryingStrings :lpSubKeyNdr
|
11
|
+
rpc_unicode_string :lpClass
|
12
|
+
uint32 :dwOptions
|
13
|
+
uint32 :samDesired
|
14
|
+
uint32 :lpSecurityAttributes
|
15
|
+
uint32 :ref_id_lpdwDisposition, :initial_value => 1
|
16
|
+
uint32 :lpdwDisposition
|
17
|
+
|
18
|
+
def initialize_instance
|
19
|
+
super
|
20
|
+
hKey.value = get_parameter(:handle)
|
21
|
+
uniString = "#{get_parameter(:name)}\x00".bytes.pack("v*")
|
22
|
+
lpSubKey.len.value = uniString.bytesize
|
23
|
+
lpSubKey.maximumLength.value = uniString.bytesize
|
24
|
+
lpSubKeyNdr.str.value = uniString
|
25
|
+
lpClass.len.value = 0
|
26
|
+
lpClass.maximumLength.value = 0
|
27
|
+
lpClass.ref_id_buffer.value = 0
|
28
|
+
dwOptions.value = get_parameter(:options)
|
29
|
+
samDesired.value = get_parameter(:desired)
|
30
|
+
request.pduHead.frag_length = self.num_bytes
|
31
|
+
request.opnum.value = 6 #BaseRegCreateKey
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class BaseRegCreateKeyRes < BinData::Record
|
36
|
+
endian :little
|
37
|
+
request :request
|
38
|
+
string :phkResult, :length => 20
|
39
|
+
uint32 :ref_id_lpdwDisposition
|
40
|
+
uint32 :lpdwDisposition
|
41
|
+
uint32 :windowsError
|
42
|
+
end
|
43
|
+
|
44
|
+
#https://msdn.microsoft.com/en-us/library/cc244922.aspx
|
45
|
+
#can not create remote key imediately under HKLM/HKU, will get ERROR_INVALID_PARAMETER
|
46
|
+
def baseRegCreateKey(subKey:, samDesired:WINREG_REGSAM["MAXIMUM_ALLOWED"], options:WINREG_OPTIONS["NONE"])
|
47
|
+
baseRegCreateKeyReq = BaseRegCreateKeyReq.new(handle:(@subKeyHandle || @rootKeyHandle), name:subKey, desired:samDesired, options:options)
|
48
|
+
baseRegCreateKeyRes = @file.ioctl_send_recv(baseRegCreateKeyReq).buffer
|
49
|
+
baseRegCreateKeyRes.raise_not_error_success("baseRegCreateKey")
|
50
|
+
baseRegCreateKeyRes = BaseRegCreateKeyRes.read(baseRegCreateKeyRes)
|
51
|
+
@disposition = baseRegCreateKeyRes.lpdwDisposition
|
52
|
+
@subKeyHandle = baseRegCreateKeyRes.phkResult
|
53
|
+
return self
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Winreg < Rpc
|
3
|
+
|
4
|
+
class BaseRegDeleteKeyReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
string :hKey, :length => 20
|
8
|
+
rpc_unicode_string :lpSubKey
|
9
|
+
conformantandVaryingStrings :lpSubKeyNdr
|
10
|
+
|
11
|
+
def initialize_instance
|
12
|
+
super
|
13
|
+
hKey.value = get_parameter(:handle)
|
14
|
+
uniString = "#{get_parameter(:subKey)}\x00".bytes.pack("v*")
|
15
|
+
lpSubKey.len.value = uniString.bytesize
|
16
|
+
lpSubKey.maximumLength.value = uniString.bytesize
|
17
|
+
lpSubKeyNdr.str.value = uniString
|
18
|
+
request.pduHead.frag_length = self.num_bytes
|
19
|
+
request.opnum.value = 7 #BaseRegDeleteKey
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class BaseRegDeleteKeyRes < BinData::Record
|
24
|
+
endian :little
|
25
|
+
request :request
|
26
|
+
uint32 :windowsError
|
27
|
+
end
|
28
|
+
|
29
|
+
def baseRegDeleteKey(subKey:)
|
30
|
+
baseRegDeleteKeyReq = BaseRegDeleteKeyReq.new(handle:@subKeyHandle, subKey:subKey)
|
31
|
+
baseRegDeleteKeyRes = @file.ioctl_send_recv(baseRegDeleteKeyReq).buffer
|
32
|
+
baseRegDeleteKeyRes.raise_not_error_success("baseRegDeleteKey")
|
33
|
+
return self
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Winreg < Rpc
|
3
|
+
|
4
|
+
class BaseRegDeleteValueReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
string :hKey, :length => 20
|
8
|
+
rpc_unicode_string :lpValueName
|
9
|
+
conformantandVaryingStrings :lpValueNameNdr
|
10
|
+
|
11
|
+
def initialize_instance
|
12
|
+
super
|
13
|
+
hKey.value = get_parameter(:handle)
|
14
|
+
uniString = "#{get_parameter(:valueName)}\x00".bytes.pack("v*")
|
15
|
+
lpValueName.len.value = uniString.bytesize
|
16
|
+
lpValueName.maximumLength.value = uniString.bytesize
|
17
|
+
lpValueNameNdr.str.value = uniString
|
18
|
+
request.pduHead.frag_length = self.num_bytes
|
19
|
+
request.opnum.value = 8 #BaseRegDeleteValue
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class BaseRegDeleteValueRes < BinData::Record
|
24
|
+
endian :little
|
25
|
+
request :request
|
26
|
+
uint32 :windowsError
|
27
|
+
end
|
28
|
+
|
29
|
+
def baseRegDeleteValue(valueName:)
|
30
|
+
baseRegDeleteValueReq = BaseRegDeleteValueReq.new(handle:(@subKeyHandle || @rootKeyHandle), valueName:valueName)
|
31
|
+
baseRegDeleteValueRes = @file.ioctl_send_recv(baseRegDeleteValueReq).buffer
|
32
|
+
baseRegDeleteValueRes.raise_not_error_success("baseRegDeleteValue")
|
33
|
+
return self
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Winreg < Rpc
|
3
|
+
|
4
|
+
class BaseRegEnumKeyReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
string :hKey, :length => 20
|
8
|
+
|
9
|
+
uint32 :dwIndex
|
10
|
+
rpc_unicode_string :lpNameIn
|
11
|
+
uint32 :ref_id_lpClassIn, :value => 1
|
12
|
+
rpc_unicode_string :lpClassIn
|
13
|
+
uint32 :lpftLastWriteTime
|
14
|
+
|
15
|
+
def initialize_instance
|
16
|
+
super
|
17
|
+
hKey.value = get_parameter(:handle)
|
18
|
+
dwIndex.value = get_parameter(:index)
|
19
|
+
lpNameIn.len.value = 0
|
20
|
+
lpNameIn.maximumLength.value = 0x1000
|
21
|
+
lpNameIn.ref_id_buffer.value = 0
|
22
|
+
lpClassIn.len.value = 0
|
23
|
+
lpClassIn.maximumLength.value = 0x1000
|
24
|
+
lpClassIn.ref_id_buffer.value = 0
|
25
|
+
request.pduHead.frag_length = self.num_bytes
|
26
|
+
request.opnum.value = 9 #BaseRegEnumKey
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class BaseRegEnumKeyRes < BinData::Record
|
31
|
+
endian :little
|
32
|
+
request :request
|
33
|
+
|
34
|
+
rpc_unicode_string :lpNameOut
|
35
|
+
conformantandVaryingStrings :lpNameOutNdr
|
36
|
+
rpc_unicode_string :lplpClassOut
|
37
|
+
uint32 :lpftLastWriteTime
|
38
|
+
|
39
|
+
uint32 :windowsError
|
40
|
+
end
|
41
|
+
|
42
|
+
def baseRegEnumKey(index:)
|
43
|
+
baseRegEnumKeyReq = BaseRegEnumKeyReq.new(handle:(@subKeyHandle || @rootKeyHandle), index:index)
|
44
|
+
baseRegEnumKeyRes = @file.ioctl_send_recv(baseRegEnumKeyReq).buffer
|
45
|
+
baseRegEnumKeyRes.raise_not_error_success("baseRegEnumKey")
|
46
|
+
baseRegEnumKeyRes = BaseRegEnumKeyRes.read(baseRegEnumKeyRes)
|
47
|
+
out = baseRegEnumKeyRes.lpNameOutNdr.str.unpack("v*").pack("c*")
|
48
|
+
return out.chop if out[-1] == "\x00"
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Winreg < Rpc
|
3
|
+
|
4
|
+
class BaseRegEnumValueReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
string :hKey, :length => 20
|
8
|
+
uint32 :dwIndex
|
9
|
+
rpc_unicode_string :lpValueNameIn
|
10
|
+
conformantandVaryingStrings :lpValueNameInNdr
|
11
|
+
uint32 :ref_id_lpType, :value => 1
|
12
|
+
uint32 :lpType
|
13
|
+
uint32 :ref_id_lpData, :initial_value => 0
|
14
|
+
uint32 :ref_id_lpcbData, :initial_value => 0
|
15
|
+
uint32 :ref_id_lpcbLen, :initial_value => 0
|
16
|
+
|
17
|
+
def initialize_instance
|
18
|
+
super
|
19
|
+
hKey.value = get_parameter(:handle)
|
20
|
+
dwIndex.value = get_parameter(:index)
|
21
|
+
#https://support.microsoft.com/en-us/help/256986/windows-registry-information-for-advanced-users
|
22
|
+
maxValueNameLen = 0x100
|
23
|
+
lpValueNameIn.len.value = maxValueNameLen
|
24
|
+
lpValueNameIn.maximumLength.value = maxValueNameLen
|
25
|
+
lpValueNameInNdr.str = "\x00" * maxValueNameLen #this is so weird :_
|
26
|
+
request.pduHead.frag_length = self.num_bytes
|
27
|
+
request.opnum.value = 10 #BaseRegEnumValue
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class BaseRegEnumValueRes < BinData::Record
|
32
|
+
endian :little
|
33
|
+
request :request
|
34
|
+
rpc_unicode_string :lpValueNameOut
|
35
|
+
conformantandVaryingStrings :lpValueNameOutNdr
|
36
|
+
uint32 :ref_id_lpType, :value => 1
|
37
|
+
uint32 :lpType
|
38
|
+
uint32 :lpData
|
39
|
+
uint32 :lpcbData
|
40
|
+
uint32 :lpcbLen
|
41
|
+
uint32 :windowsError
|
42
|
+
end
|
43
|
+
|
44
|
+
def baseRegEnumValue(index:)
|
45
|
+
baseRegEnumValueReq = BaseRegEnumValueReq.new(handle:(@subKeyHandle || @rootKeyHandle), index:index)
|
46
|
+
baseRegEnumValueRes = @file.ioctl_send_recv(baseRegEnumValueReq).buffer
|
47
|
+
baseRegEnumValueRes.raise_not_error_success("baseRegEnumValue")
|
48
|
+
baseRegEnumValueRes = BaseRegEnumValueRes.read(baseRegEnumValueRes)
|
49
|
+
valueName = baseRegEnumValueRes.lpValueNameOutNdr.str.unpack("v*").pack("c*").chop
|
50
|
+
return { :valueName => valueName,
|
51
|
+
:type => baseRegEnumValueRes.lpType.to_i
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Winreg < Rpc
|
3
|
+
|
4
|
+
attr_accessor :subKeyHandle
|
5
|
+
|
6
|
+
class BaseRegOpenKeyReq < BinData::Record
|
7
|
+
endian :little
|
8
|
+
request :request
|
9
|
+
string :hKey, :length => 20
|
10
|
+
rpc_unicode_string :lpSubKey
|
11
|
+
conformantandVaryingStrings :lpSubKeyNdr
|
12
|
+
uint32 :dwOptions
|
13
|
+
uint32 :samDesired
|
14
|
+
|
15
|
+
def initialize_instance
|
16
|
+
super
|
17
|
+
hKey.value = get_parameter(:handle)
|
18
|
+
uniString = "#{get_parameter(:subKey)}\x00".bytes.pack("v*")
|
19
|
+
lpSubKey.len.value = uniString.bytesize
|
20
|
+
lpSubKey.maximumLength.value = uniString.bytesize
|
21
|
+
lpSubKeyNdr.str.value = uniString
|
22
|
+
dwOptions.value = get_parameter(:options)
|
23
|
+
samDesired.value = get_parameter(:desired)
|
24
|
+
request.pduHead.frag_length = self.num_bytes
|
25
|
+
request.opnum.value = 15 #BaseRegOpenKey
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class BaseRegOpenKeyRes < BinData::Record
|
30
|
+
endian :little
|
31
|
+
request :request
|
32
|
+
string :phkResult, :length => 20
|
33
|
+
uint32 :windowsError
|
34
|
+
end
|
35
|
+
|
36
|
+
def baseRegOpenKey(subKey:, samDesired:WINREG_REGSAM["MAXIMUM_ALLOWED"], options:WINREG_OPTIONS["NONE"])
|
37
|
+
baseRegOpenKeyReq = BaseRegOpenKeyReq.new(handle:@rootKeyHandle, subKey:subKey, desired:samDesired, options:options)
|
38
|
+
baseRegOpenKeyRes = @file.ioctl_send_recv(baseRegOpenKeyReq).buffer
|
39
|
+
baseRegOpenKeyRes.raise_not_error_success("baseRegOpenKey")
|
40
|
+
baseRegOpenKeyRes = BaseRegOpenKeyRes.read(baseRegOpenKeyRes)
|
41
|
+
@subKeyHandle = baseRegOpenKeyRes.phkResult
|
42
|
+
return self
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Winreg < Rpc
|
3
|
+
|
4
|
+
class BaseRegQueryInfoKeyReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
string :hKey, :length => 20
|
8
|
+
rpc_unicode_string :lpClassIn
|
9
|
+
|
10
|
+
def initialize_instance
|
11
|
+
super
|
12
|
+
hKey.value = get_parameter(:handle)
|
13
|
+
lpClassIn.len.value = 0
|
14
|
+
lpClassIn.maximumLength.value = 0x1000
|
15
|
+
lpClassIn.ref_id_buffer.value = 0
|
16
|
+
request.pduHead.frag_length = self.num_bytes
|
17
|
+
request.opnum.value = 16 #BaseRegQueryInfoKey
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class BaseRegQueryInfoKeyRes < BinData::Record
|
22
|
+
endian :little
|
23
|
+
request :request
|
24
|
+
rpc_unicode_string :lpClassOut
|
25
|
+
conformantandVaryingStrings :lpClassOutNdr
|
26
|
+
uint32 :lpcSubKeys
|
27
|
+
uint32 :lpcbMaxSubKeyLen
|
28
|
+
uint32 :lpcbMaxClassLen
|
29
|
+
uint32 :lpcValues
|
30
|
+
uint32 :lpcbMaxValueNameLen
|
31
|
+
uint32 :lpcbMaxValueLen
|
32
|
+
uint32 :lpcbSecurityDescriptor
|
33
|
+
uint64 :lpftLastWriteTime
|
34
|
+
uint32 :windowsError
|
35
|
+
end
|
36
|
+
|
37
|
+
def baseRegQueryInfoKey
|
38
|
+
baseRegQueryInfoKeyReq = BaseRegQueryInfoKeyReq.new(handle:(@subKeyHandle || @rootKeyHandle))
|
39
|
+
baseRegQueryInfoKeyRes = @file.ioctl_send_recv(baseRegQueryInfoKeyReq).buffer
|
40
|
+
baseRegQueryInfoKeyRes.raise_not_error_success("baseRegQueryInfoKey")
|
41
|
+
baseRegQueryInfoKeyRes = BaseRegQueryInfoKeyRes.read(baseRegQueryInfoKeyRes)
|
42
|
+
k = baseRegQueryInfoKeyRes
|
43
|
+
return { :numberOfSubkeys => k.lpcSubKeys,
|
44
|
+
:maxSubkeySize => k.lpcbMaxSubKeyLen,
|
45
|
+
:maxClassSize => k.lpcbMaxClassLen,
|
46
|
+
:numberOfValues => k.lpcValues,
|
47
|
+
:maxValueNameSize => k.lpcbMaxValueNameLen,
|
48
|
+
:maxValueSize => k.lpcbMaxValueLen,
|
49
|
+
:securityDescriptorSize => k.lpcbSecurityDescriptor,
|
50
|
+
:lastWriteTime => k.lpftLastWriteTime
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Winreg < Rpc
|
3
|
+
|
4
|
+
class BaseRegQueryValueReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
string :hKey, :length => 20
|
8
|
+
rpc_unicode_string :lpValueName
|
9
|
+
conformantandVaryingStrings :lpValueNameNdr
|
10
|
+
uint32 :ref_id_lpType, :value => 1
|
11
|
+
uint32 :lpType
|
12
|
+
uint32 :ref_id_lpData, :initial_value => 1
|
13
|
+
conformantandVaryingStringsAscii :lpData
|
14
|
+
uint32 :ref_id_lpcbData, :initial_value => 1
|
15
|
+
uint32 :lpcbData
|
16
|
+
uint32 :ref_id_lpcbLen, :initial_value => 1
|
17
|
+
uint32 :lpcbLen
|
18
|
+
|
19
|
+
def initialize_instance
|
20
|
+
super
|
21
|
+
|
22
|
+
hKey.value = get_parameter(:handle)
|
23
|
+
uniString = "#{get_parameter(:vName)}\x00".bytes.pack("v*")
|
24
|
+
lpValueName.len.value = uniString.bytesize
|
25
|
+
lpValueName.maximumLength.value = uniString.bytesize
|
26
|
+
lpValueNameNdr.str.value = uniString
|
27
|
+
lpType.value = get_parameter(:type)
|
28
|
+
lpData.str = ""
|
29
|
+
lpData.max_count.value = 0x1000
|
30
|
+
|
31
|
+
lpcbData.value = 0x1000
|
32
|
+
request.pduHead.frag_length = self.num_bytes
|
33
|
+
request.opnum.value = 17 #BaseRegQueryValue
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class BaseRegQueryValueRes < BinData::Record
|
38
|
+
endian :little
|
39
|
+
request :request
|
40
|
+
uint32 :ref_id_lpType
|
41
|
+
uint32 :lpType
|
42
|
+
uint32 :ref_id_lpData
|
43
|
+
conformantandVaryingStringsAscii :lpData
|
44
|
+
uint32 :ref_id_lpcbData
|
45
|
+
uint32 :lpcbData
|
46
|
+
uint32 :ref_id_lpcbLen
|
47
|
+
uint32 :lpcbLen
|
48
|
+
|
49
|
+
uint32 :windowsError
|
50
|
+
end
|
51
|
+
|
52
|
+
def baseRegQueryValue(valueName:, type:WINREG_REG_VALUE_TYPE["UNDEF"])
|
53
|
+
baseRegQueryValueReq = BaseRegQueryValueReq.new(handle:(@subKeyHandle || @rootKeyHandle), vName:valueName, type:type)
|
54
|
+
baseRegQueryValueRes = @file.ioctl_send_recv(baseRegQueryValueReq).buffer
|
55
|
+
baseRegQueryValueRes.raise_not_error_success("baseRegQueryValue")
|
56
|
+
baseRegQueryValueRes = BaseRegQueryValueRes.read(baseRegQueryValueRes)
|
57
|
+
type = baseRegQueryValueRes.lpType
|
58
|
+
data = baseRegQueryValueRes.lpData.str
|
59
|
+
case type
|
60
|
+
when 0
|
61
|
+
return data
|
62
|
+
when 1
|
63
|
+
return data.unpack("v*").pack("c*").chop
|
64
|
+
when 2
|
65
|
+
return data.unpack("v*").pack("c*").chop
|
66
|
+
when 3
|
67
|
+
return data
|
68
|
+
when 4
|
69
|
+
return data.unpack("V")[0]
|
70
|
+
when 5
|
71
|
+
return data.unpack("N")[0]
|
72
|
+
when 7
|
73
|
+
return data.unpack("v*").pack("c*").split("\x00")
|
74
|
+
when 11
|
75
|
+
return data.unpack("Q<")[0]
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Winreg < Rpc
|
3
|
+
|
4
|
+
class BaseRegSaveKeyReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
string :hKey, :length => 20
|
8
|
+
rpc_unicode_string :lpFile
|
9
|
+
conformantandVaryingStrings :lpFileNdr
|
10
|
+
uint32 :pSecurityAttributes
|
11
|
+
|
12
|
+
def initialize_instance
|
13
|
+
super
|
14
|
+
hKey.value = get_parameter(:handle)
|
15
|
+
uniString = "#{get_parameter(:file)}\x00".bytes.pack("v*")
|
16
|
+
lpFile.len.value = uniString.bytesize
|
17
|
+
lpFile.maximumLength.value = uniString.bytesize
|
18
|
+
lpFileNdr.str.value = uniString
|
19
|
+
request.pduHead.frag_length = self.num_bytes
|
20
|
+
request.opnum.value = 20 #BaseRegSaveKey
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class BaseRegSaveKeyRes < BinData::Record
|
25
|
+
endian :little
|
26
|
+
request :request
|
27
|
+
uint32 :windowsError
|
28
|
+
end
|
29
|
+
|
30
|
+
def baseRegSaveKey(file:)
|
31
|
+
baseRegSaveKeyReq = BaseRegSaveKeyReq.new(handle:(@subKeyHandle || @rootKeyHandle), file:file)
|
32
|
+
baseRegSaveKeyRes = @file.ioctl_send_recv(baseRegSaveKeyReq).buffer
|
33
|
+
baseRegSaveKeyRes.raise_not_error_success("baseRegSaveKey")
|
34
|
+
return self
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Winreg < Rpc
|
3
|
+
|
4
|
+
class BaseRegSetValueReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
string :hKey, :length => 20
|
8
|
+
rpc_unicode_string :lpValueName
|
9
|
+
conformantandVaryingStrings :lpValueNameNdr
|
10
|
+
uint32 :dwType
|
11
|
+
uint32 :maxCount, :value => lambda{ lpData.num_bytes }
|
12
|
+
string :lpData, :read_length => :maxCount
|
13
|
+
#pad to 4 bytes align per RPC spec
|
14
|
+
string :pad, :onlyif => lambda{ (maxCount.value % 4) > 0}, :length => lambda { (4 - (maxCount % 4)) % 4 }
|
15
|
+
uint32 :cbData, :value => :maxCount
|
16
|
+
|
17
|
+
def initialize_instance
|
18
|
+
super
|
19
|
+
hKey.value = get_parameter(:handle)
|
20
|
+
uniString = "#{get_parameter(:valueName)}\x00".bytes.pack("v*")
|
21
|
+
lpValueName.len.value = uniString.bytesize
|
22
|
+
lpValueName.maximumLength.value = uniString.bytesize
|
23
|
+
lpValueNameNdr.str.value = uniString
|
24
|
+
dwType.value = get_parameter(:type)
|
25
|
+
lpData.value = get_parameter(:data)
|
26
|
+
request.pduHead.frag_length = self.num_bytes
|
27
|
+
request.opnum.value = 22 #BaseRegSetValue
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class BaseRegSetValueRes < BinData::Record
|
32
|
+
endian :little
|
33
|
+
request :request
|
34
|
+
uint32 :windowsError
|
35
|
+
end
|
36
|
+
|
37
|
+
def baseRegSetValue(valueName:, type:, data:)
|
38
|
+
baseRegSetValueReq = BaseRegSetValueReq.new(handle:(@subKeyHandle || @rootKeyHandle), valueName:valueName, type:type, data:data)
|
39
|
+
baseRegSetValueRes = @file.ioctl_send_recv(baseRegSetValueReq).buffer
|
40
|
+
baseRegSetValueRes.raise_not_error_success("baseRegSetValue")
|
41
|
+
return self
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
WINREG_REGSAM = {
|
2
|
+
"KEY_QUERY_VALUE" => 0x00000001,
|
3
|
+
"KEY_SET_VALUE" => 0x00000002,
|
4
|
+
"KEY_CREATE_SUB_KEY" => 0x00000004,
|
5
|
+
"KEY_ENUMERATE_SUB_KEYS" => 0x00000008,
|
6
|
+
"KEY_CREATE_LINK" => 0x00000020,
|
7
|
+
"KEY_WOW64_64KEY" => 0x00000100,
|
8
|
+
"KEY_WOW64_32KEY" => 0x00000200,
|
9
|
+
"MAXIMUM_ALLOWED" => 0x02000000
|
10
|
+
}
|
11
|
+
|
12
|
+
WINREG_OPTIONS = {
|
13
|
+
"NONE" => 0x00000000,
|
14
|
+
"REG_OPTION_BACKUP_RESTORE" => 0x00000004,
|
15
|
+
"REG_OPTION_OPEN_LINK" => 0x00000008,
|
16
|
+
"REG_OPTION_DONT_VIRTUALIZE" => 0x00000010
|
17
|
+
}
|
18
|
+
|
19
|
+
WINREG_REG_VALUE_TYPE = {
|
20
|
+
"UNDEF" => 0,
|
21
|
+
"REG_SZ" => 1,
|
22
|
+
"REG_EXPAND_SZ" => 2,
|
23
|
+
"REG_BINARY" => 3,
|
24
|
+
"REG_DWORDLE" => 4,
|
25
|
+
"REG_DWORDBE" => 5,
|
26
|
+
"REG_MULTI_SZ" => 7,
|
27
|
+
"REG_QWORDLE" => 11
|
28
|
+
}
|
29
|
+
|
30
|
+
WINREG_DISPOSITION = {
|
31
|
+
"REG_CREATED_NEW_KEY" => 0x00000001,
|
32
|
+
"REG_OPENED_EXISTING_KEY" => 0x00000002
|
33
|
+
}
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Winreg < Rpc
|
3
|
+
|
4
|
+
class OpenClassesRootReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
uint32 :serverName
|
8
|
+
uint32 :samDesired
|
9
|
+
|
10
|
+
def initialize_instance
|
11
|
+
super
|
12
|
+
samDesired.value = get_parameter(:access)
|
13
|
+
|
14
|
+
request.pduHead.frag_length = self.num_bytes
|
15
|
+
request.opnum.value = 0 #OpenClassesRoot
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class OpenClassesRootRes < BinData::Record
|
20
|
+
endian :little
|
21
|
+
request :request
|
22
|
+
string :phKey, :length => 20
|
23
|
+
uint32 :windowsError
|
24
|
+
end
|
25
|
+
|
26
|
+
def openClassesRoot(samDesired:WINREG_REGSAM["MAXIMUM_ALLOWED"])
|
27
|
+
openClassesRootReq = OpenClassesRootReq.new(access:samDesired)
|
28
|
+
openClassesRootRes = @file.ioctl_send_recv(openClassesRootReq).buffer
|
29
|
+
openClassesRootRes.raise_not_error_success("openClassesRoot")
|
30
|
+
openClassesRootRes = OpenClassesRootRes.read(openClassesRootRes)
|
31
|
+
@rootKeyHandle = openClassesRootRes.phKey
|
32
|
+
return self
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Winreg < Rpc
|
3
|
+
|
4
|
+
class OpenCurrentConfigReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
uint32 :serverName
|
8
|
+
uint32 :samDesired
|
9
|
+
|
10
|
+
def initialize_instance
|
11
|
+
super
|
12
|
+
samDesired.value = get_parameter(:access)
|
13
|
+
|
14
|
+
request.pduHead.frag_length = self.num_bytes
|
15
|
+
request.opnum.value = 27 #OpenCurrentConfig
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class OpenCurrentConfigRes < BinData::Record
|
20
|
+
endian :little
|
21
|
+
request :request
|
22
|
+
string :phKey, :length => 20
|
23
|
+
uint32 :windowsError
|
24
|
+
end
|
25
|
+
|
26
|
+
def openCurrentConfig(samDesired:WINREG_REGSAM["MAXIMUM_ALLOWED"])
|
27
|
+
openCurrentConfigReq = OpenCurrentConfigReq.new(access:samDesired)
|
28
|
+
openCurrentConfigRes = @file.ioctl_send_recv(openCurrentConfigReq).buffer
|
29
|
+
openCurrentConfigRes.raise_not_error_success("openCurrentConfig")
|
30
|
+
openCurrentConfigRes = OpenCurrentConfigRes.read(openCurrentConfigRes)
|
31
|
+
@rootKeyHandle = openCurrentConfigRes.phKey
|
32
|
+
return self
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Winreg < Rpc
|
3
|
+
|
4
|
+
class OpenCurrentUserReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
uint32 :serverName
|
8
|
+
uint32 :samDesired
|
9
|
+
|
10
|
+
def initialize_instance
|
11
|
+
super
|
12
|
+
samDesired.value = get_parameter(:access)
|
13
|
+
|
14
|
+
request.pduHead.frag_length = self.num_bytes
|
15
|
+
request.opnum.value = 1 #OpenCurrentUser
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class OpenCurrentUserRes < BinData::Record
|
20
|
+
endian :little
|
21
|
+
request :request
|
22
|
+
string :phKey, :length => 20
|
23
|
+
uint32 :windowsError
|
24
|
+
end
|
25
|
+
|
26
|
+
def openCurrentUser(samDesired:WINREG_REGSAM["MAXIMUM_ALLOWED"])
|
27
|
+
openCurrentUserReq = OpenCurrentUserReq.new(access:samDesired)
|
28
|
+
openCurrentUserRes = @file.ioctl_send_recv(openCurrentUserReq).buffer
|
29
|
+
openCurrentUserRes.raise_not_error_success("openCurrentUser")
|
30
|
+
openCurrentUserRes = OpenCurrentUserRes.read(openCurrentUserRes)
|
31
|
+
@rootKeyHandle = openCurrentUserRes.phKey
|
32
|
+
return self
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Winreg < Rpc
|
3
|
+
|
4
|
+
class OpenLocalMachineReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
uint32 :serverName
|
8
|
+
uint32 :samDesired
|
9
|
+
|
10
|
+
def initialize_instance
|
11
|
+
super
|
12
|
+
samDesired.value = get_parameter(:access)
|
13
|
+
|
14
|
+
request.pduHead.frag_length = self.num_bytes
|
15
|
+
request.opnum.value = 2 #OpenLocalMachine
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class OpenLocalMachineRes < BinData::Record
|
20
|
+
endian :little
|
21
|
+
request :request
|
22
|
+
string :phKey, :length => 20
|
23
|
+
uint32 :windowsError
|
24
|
+
end
|
25
|
+
|
26
|
+
def openLocalMachine(samDesired:WINREG_REGSAM["MAXIMUM_ALLOWED"])
|
27
|
+
openLocalMachineReq = OpenLocalMachineReq.new(access:samDesired)
|
28
|
+
openLocalMachineRes = @file.ioctl_send_recv(openLocalMachineReq).buffer
|
29
|
+
openLocalMachineRes.raise_not_error_success("openLocalMachine")
|
30
|
+
openLocalMachineRes = OpenLocalMachineRes.read(openLocalMachineRes)
|
31
|
+
@rootKeyHandle = openLocalMachineRes.phKey
|
32
|
+
return self
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Winreg < Rpc
|
3
|
+
|
4
|
+
class OpenUsersReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
uint32 :serverName
|
8
|
+
uint32 :samDesired
|
9
|
+
|
10
|
+
def initialize_instance
|
11
|
+
super
|
12
|
+
samDesired.value = get_parameter(:access)
|
13
|
+
|
14
|
+
request.pduHead.frag_length = self.num_bytes
|
15
|
+
request.opnum.value = 4 #OpenUsers
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class OpenUsersRes < BinData::Record
|
20
|
+
endian :little
|
21
|
+
request :request
|
22
|
+
string :phKey, :length => 20
|
23
|
+
uint32 :windowsError
|
24
|
+
end
|
25
|
+
|
26
|
+
def openUsers(samDesired:WINREG_REGSAM["MAXIMUM_ALLOWED"])
|
27
|
+
openUsersReq = OpenUsersReq.new(access:samDesired)
|
28
|
+
openUsersRes = @file.ioctl_send_recv(openUsersReq).buffer
|
29
|
+
openUsersRes.raise_not_error_success("openUsers")
|
30
|
+
openUsersRes = OpenUsersRes.read(openUsersRes)
|
31
|
+
@rootKeyHandle = openUsersRes.phKey
|
32
|
+
return self
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
data/smbRpc.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'smbRpc'
|
3
|
-
s.version = '0.0.
|
4
|
-
s.date = '2019-
|
3
|
+
s.version = '0.0.5'
|
4
|
+
s.date = '2019-02-09'
|
5
5
|
s.summary = "Interface to various Windows RPC services over SMB namepipes"
|
6
6
|
s.description = "As describe in summary"
|
7
7
|
s.authors = ["Rungsree Singholka"]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smbRpc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rungsree Singholka
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-02-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby_smb
|
@@ -49,6 +49,9 @@ files:
|
|
49
49
|
- examples/enumServices.rb
|
50
50
|
- examples/enumSmbPipe.rb
|
51
51
|
- examples/enumUsers.rb
|
52
|
+
- examples/regAdd.rb
|
53
|
+
- examples/regQuery.rb
|
54
|
+
- examples/regSave.rb
|
52
55
|
- examples/serverGetInfo.rb
|
53
56
|
- lib/smbRpc.rb
|
54
57
|
- lib/smbRpc/epmapper.rb
|
@@ -123,6 +126,24 @@ files:
|
|
123
126
|
- lib/smbRpc/updateString.rb
|
124
127
|
- lib/smbRpc/updateString/raise_not_error_success.rb
|
125
128
|
- lib/smbRpc/updateString/to_des_ecb_lm.rb
|
129
|
+
- lib/smbRpc/winreg.rb
|
130
|
+
- lib/smbRpc/winreg/baseRegCloseKey.rb
|
131
|
+
- lib/smbRpc/winreg/baseRegCreateKey.rb
|
132
|
+
- lib/smbRpc/winreg/baseRegDeleteKey.rb
|
133
|
+
- lib/smbRpc/winreg/baseRegDeleteValue.rb
|
134
|
+
- lib/smbRpc/winreg/baseRegEnumKey.rb
|
135
|
+
- lib/smbRpc/winreg/baseRegEnumValue.rb
|
136
|
+
- lib/smbRpc/winreg/baseRegOpenKey.rb
|
137
|
+
- lib/smbRpc/winreg/baseRegQueryInfoKey.rb
|
138
|
+
- lib/smbRpc/winreg/baseRegQueryValue.rb
|
139
|
+
- lib/smbRpc/winreg/baseRegSaveKey.rb
|
140
|
+
- lib/smbRpc/winreg/baseRegSetValue.rb
|
141
|
+
- lib/smbRpc/winreg/constants.rb
|
142
|
+
- lib/smbRpc/winreg/openClassesRoot.rb
|
143
|
+
- lib/smbRpc/winreg/openCurrentConfig.rb
|
144
|
+
- lib/smbRpc/winreg/openCurrentUser.rb
|
145
|
+
- lib/smbRpc/winreg/openLocalMachine.rb
|
146
|
+
- lib/smbRpc/winreg/openUsers.rb
|
126
147
|
- smbRpc.gemspec
|
127
148
|
homepage: https://github.com/smbRpc/smbRpc
|
128
149
|
licenses:
|