ruby_smb 1.0.0 → 1.1.0

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.
Files changed (171) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/.travis.yml +4 -1
  4. data/README.md +35 -47
  5. data/examples/enum_registry_key.rb +28 -0
  6. data/examples/enum_registry_values.rb +30 -0
  7. data/examples/pipes.rb +2 -1
  8. data/examples/read_registry_key_value.rb +32 -0
  9. data/lib/ruby_smb/client/authentication.rb +43 -25
  10. data/lib/ruby_smb/client/echo.rb +20 -2
  11. data/lib/ruby_smb/client/negotiation.rb +27 -12
  12. data/lib/ruby_smb/client/tree_connect.rb +20 -14
  13. data/lib/ruby_smb/client/utils.rb +2 -2
  14. data/lib/ruby_smb/client/winreg.rb +46 -0
  15. data/lib/ruby_smb/client.rb +28 -4
  16. data/lib/ruby_smb/dcerpc/bind.rb +2 -2
  17. data/lib/ruby_smb/dcerpc/bind_ack.rb +2 -2
  18. data/lib/ruby_smb/dcerpc/error.rb +3 -0
  19. data/lib/ruby_smb/dcerpc/ndr.rb +95 -16
  20. data/lib/ruby_smb/dcerpc/pdu_header.rb +1 -1
  21. data/lib/ruby_smb/dcerpc/request.rb +28 -9
  22. data/lib/ruby_smb/dcerpc/rrp_unicode_string.rb +35 -0
  23. data/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all.rb +9 -0
  24. data/lib/ruby_smb/dcerpc/srvsvc.rb +10 -0
  25. data/lib/ruby_smb/dcerpc/winreg/close_key_request.rb +24 -0
  26. data/lib/ruby_smb/dcerpc/winreg/close_key_response.rb +27 -0
  27. data/lib/ruby_smb/dcerpc/winreg/enum_key_request.rb +45 -0
  28. data/lib/ruby_smb/dcerpc/winreg/enum_key_response.rb +42 -0
  29. data/lib/ruby_smb/dcerpc/winreg/enum_value_request.rb +39 -0
  30. data/lib/ruby_smb/dcerpc/winreg/enum_value_response.rb +36 -0
  31. data/lib/ruby_smb/dcerpc/winreg/open_key_request.rb +34 -0
  32. data/lib/ruby_smb/dcerpc/winreg/open_key_response.rb +25 -0
  33. data/lib/ruby_smb/dcerpc/winreg/open_root_key_request.rb +43 -0
  34. data/lib/ruby_smb/dcerpc/winreg/open_root_key_response.rb +35 -0
  35. data/lib/ruby_smb/dcerpc/winreg/query_info_key_request.rb +27 -0
  36. data/lib/ruby_smb/dcerpc/winreg/query_info_key_response.rb +40 -0
  37. data/lib/ruby_smb/dcerpc/winreg/query_value_request.rb +39 -0
  38. data/lib/ruby_smb/dcerpc/winreg/query_value_response.rb +57 -0
  39. data/lib/ruby_smb/dcerpc/winreg/regsam.rb +40 -0
  40. data/lib/ruby_smb/dcerpc/winreg.rb +340 -0
  41. data/lib/ruby_smb/dcerpc.rb +38 -0
  42. data/lib/ruby_smb/dispatcher/socket.rb +3 -1
  43. data/lib/ruby_smb/error.rb +40 -1
  44. data/lib/ruby_smb/generic_packet.rb +33 -4
  45. data/lib/ruby_smb/smb1/file.rb +67 -11
  46. data/lib/ruby_smb/smb1/packet/close_request.rb +2 -5
  47. data/lib/ruby_smb/smb1/packet/close_response.rb +2 -1
  48. data/lib/ruby_smb/smb1/packet/echo_request.rb +2 -4
  49. data/lib/ruby_smb/smb1/packet/echo_response.rb +2 -1
  50. data/lib/ruby_smb/smb1/packet/empty_packet.rb +10 -1
  51. data/lib/ruby_smb/smb1/packet/logoff_request.rb +2 -4
  52. data/lib/ruby_smb/smb1/packet/logoff_response.rb +2 -1
  53. data/lib/ruby_smb/smb1/packet/negotiate_request.rb +2 -5
  54. data/lib/ruby_smb/smb1/packet/negotiate_response.rb +3 -7
  55. data/lib/ruby_smb/smb1/packet/negotiate_response_extended.rb +4 -4
  56. data/lib/ruby_smb/smb1/packet/nt_create_andx_request.rb +2 -4
  57. data/lib/ruby_smb/smb1/packet/nt_create_andx_response.rb +2 -1
  58. data/lib/ruby_smb/smb1/packet/nt_trans/create_request.rb +2 -1
  59. data/lib/ruby_smb/smb1/packet/nt_trans/create_response.rb +2 -1
  60. data/lib/ruby_smb/smb1/packet/nt_trans/request.rb +2 -4
  61. data/lib/ruby_smb/smb1/packet/nt_trans/response.rb +2 -1
  62. data/lib/ruby_smb/smb1/packet/read_andx_request.rb +2 -5
  63. data/lib/ruby_smb/smb1/packet/read_andx_response.rb +2 -1
  64. data/lib/ruby_smb/smb1/packet/session_setup_legacy_request.rb +2 -1
  65. data/lib/ruby_smb/smb1/packet/session_setup_legacy_response.rb +2 -1
  66. data/lib/ruby_smb/smb1/packet/session_setup_request.rb +2 -5
  67. data/lib/ruby_smb/smb1/packet/session_setup_response.rb +2 -1
  68. data/lib/ruby_smb/smb1/packet/trans/peek_nmpipe_request.rb +0 -1
  69. data/lib/ruby_smb/smb1/packet/trans/peek_nmpipe_response.rb +3 -2
  70. data/lib/ruby_smb/smb1/packet/trans/request.rb +2 -5
  71. data/lib/ruby_smb/smb1/packet/trans/response.rb +2 -1
  72. data/lib/ruby_smb/smb1/packet/trans/transact_nmpipe_request.rb +1 -1
  73. data/lib/ruby_smb/smb1/packet/trans/transact_nmpipe_response.rb +1 -1
  74. data/lib/ruby_smb/smb1/packet/trans2/find_first2_request.rb +2 -1
  75. data/lib/ruby_smb/smb1/packet/trans2/find_first2_response.rb +8 -2
  76. data/lib/ruby_smb/smb1/packet/trans2/find_next2_request.rb +2 -1
  77. data/lib/ruby_smb/smb1/packet/trans2/find_next2_response.rb +8 -2
  78. data/lib/ruby_smb/smb1/packet/trans2/open2_request.rb +2 -1
  79. data/lib/ruby_smb/smb1/packet/trans2/open2_response.rb +2 -1
  80. data/lib/ruby_smb/smb1/packet/trans2/request.rb +2 -4
  81. data/lib/ruby_smb/smb1/packet/trans2/request_secondary.rb +2 -4
  82. data/lib/ruby_smb/smb1/packet/trans2/response.rb +2 -1
  83. data/lib/ruby_smb/smb1/packet/trans2/set_file_information_request.rb +2 -1
  84. data/lib/ruby_smb/smb1/packet/trans2/set_file_information_response.rb +2 -1
  85. data/lib/ruby_smb/smb1/packet/tree_connect_request.rb +2 -4
  86. data/lib/ruby_smb/smb1/packet/tree_connect_response.rb +13 -3
  87. data/lib/ruby_smb/smb1/packet/tree_disconnect_request.rb +2 -4
  88. data/lib/ruby_smb/smb1/packet/tree_disconnect_response.rb +2 -1
  89. data/lib/ruby_smb/smb1/packet/write_andx_request.rb +2 -5
  90. data/lib/ruby_smb/smb1/packet/write_andx_response.rb +2 -1
  91. data/lib/ruby_smb/smb1/pipe.rb +86 -5
  92. data/lib/ruby_smb/smb1/tree.rb +40 -2
  93. data/lib/ruby_smb/smb2/file.rb +97 -1
  94. data/lib/ruby_smb/smb2/packet/close_request.rb +2 -4
  95. data/lib/ruby_smb/smb2/packet/close_response.rb +2 -1
  96. data/lib/ruby_smb/smb2/packet/create_request.rb +2 -4
  97. data/lib/ruby_smb/smb2/packet/create_response.rb +2 -1
  98. data/lib/ruby_smb/smb2/packet/echo_request.rb +2 -4
  99. data/lib/ruby_smb/smb2/packet/echo_response.rb +2 -1
  100. data/lib/ruby_smb/smb2/packet/error_packet.rb +15 -3
  101. data/lib/ruby_smb/smb2/packet/ioctl_request.rb +2 -5
  102. data/lib/ruby_smb/smb2/packet/ioctl_response.rb +2 -1
  103. data/lib/ruby_smb/smb2/packet/logoff_request.rb +2 -4
  104. data/lib/ruby_smb/smb2/packet/logoff_response.rb +2 -1
  105. data/lib/ruby_smb/smb2/packet/negotiate_request.rb +2 -5
  106. data/lib/ruby_smb/smb2/packet/negotiate_response.rb +2 -1
  107. data/lib/ruby_smb/smb2/packet/query_directory_request.rb +2 -4
  108. data/lib/ruby_smb/smb2/packet/query_directory_response.rb +8 -2
  109. data/lib/ruby_smb/smb2/packet/read_request.rb +2 -4
  110. data/lib/ruby_smb/smb2/packet/read_response.rb +2 -1
  111. data/lib/ruby_smb/smb2/packet/session_setup_request.rb +2 -5
  112. data/lib/ruby_smb/smb2/packet/session_setup_response.rb +2 -1
  113. data/lib/ruby_smb/smb2/packet/set_info_request.rb +2 -4
  114. data/lib/ruby_smb/smb2/packet/set_info_response.rb +2 -1
  115. data/lib/ruby_smb/smb2/packet/tree_connect_request.rb +2 -5
  116. data/lib/ruby_smb/smb2/packet/tree_connect_response.rb +8 -2
  117. data/lib/ruby_smb/smb2/packet/tree_disconnect_request.rb +2 -4
  118. data/lib/ruby_smb/smb2/packet/tree_disconnect_response.rb +2 -1
  119. data/lib/ruby_smb/smb2/packet/write_request.rb +2 -4
  120. data/lib/ruby_smb/smb2/packet/write_response.rb +2 -1
  121. data/lib/ruby_smb/smb2/pipe.rb +98 -11
  122. data/lib/ruby_smb/smb2/tree.rb +44 -6
  123. data/lib/ruby_smb/version.rb +1 -1
  124. data/lib/ruby_smb.rb +0 -1
  125. data/ruby_smb.gemspec +3 -3
  126. data/spec/lib/ruby_smb/client_spec.rb +271 -11
  127. data/spec/lib/ruby_smb/dcerpc/bind_ack_spec.rb +2 -2
  128. data/spec/lib/ruby_smb/dcerpc/bind_spec.rb +2 -2
  129. data/spec/lib/ruby_smb/dcerpc/ndr_spec.rb +410 -0
  130. data/spec/lib/ruby_smb/dcerpc/request_spec.rb +50 -7
  131. data/spec/lib/ruby_smb/dcerpc/rrp_unicode_string_spec.rb +98 -0
  132. data/spec/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all_spec.rb +13 -0
  133. data/spec/lib/ruby_smb/dcerpc/srvsvc_spec.rb +60 -0
  134. data/spec/lib/ruby_smb/dcerpc/winreg/close_key_request_spec.rb +28 -0
  135. data/spec/lib/ruby_smb/dcerpc/winreg/close_key_response_spec.rb +36 -0
  136. data/spec/lib/ruby_smb/dcerpc/winreg/enum_key_request_spec.rb +108 -0
  137. data/spec/lib/ruby_smb/dcerpc/winreg/enum_key_response_spec.rb +97 -0
  138. data/spec/lib/ruby_smb/dcerpc/winreg/enum_value_request_spec.rb +94 -0
  139. data/spec/lib/ruby_smb/dcerpc/winreg/enum_value_response_spec.rb +82 -0
  140. data/spec/lib/ruby_smb/dcerpc/winreg/open_key_request_spec.rb +74 -0
  141. data/spec/lib/ruby_smb/dcerpc/winreg/open_key_response_spec.rb +35 -0
  142. data/spec/lib/ruby_smb/dcerpc/winreg/open_root_key_request_spec.rb +90 -0
  143. data/spec/lib/ruby_smb/dcerpc/winreg/open_root_key_response_spec.rb +38 -0
  144. data/spec/lib/ruby_smb/dcerpc/winreg/query_info_key_request_spec.rb +39 -0
  145. data/spec/lib/ruby_smb/dcerpc/winreg/query_info_key_response_spec.rb +113 -0
  146. data/spec/lib/ruby_smb/dcerpc/winreg/query_value_request_spec.rb +88 -0
  147. data/spec/lib/ruby_smb/dcerpc/winreg/query_value_response_spec.rb +150 -0
  148. data/spec/lib/ruby_smb/dcerpc/winreg/regsam_spec.rb +32 -0
  149. data/spec/lib/ruby_smb/dcerpc/winreg_spec.rb +710 -0
  150. data/spec/lib/ruby_smb/dcerpc_spec.rb +81 -0
  151. data/spec/lib/ruby_smb/dispatcher/socket_spec.rb +3 -1
  152. data/spec/lib/ruby_smb/generic_packet_spec.rb +52 -4
  153. data/spec/lib/ruby_smb/smb1/file_spec.rb +191 -2
  154. data/spec/lib/ruby_smb/smb1/packet/empty_packet_spec.rb +68 -0
  155. data/spec/lib/ruby_smb/smb1/packet/trans2/find_first2_response_spec.rb +11 -2
  156. data/spec/lib/ruby_smb/smb1/packet/trans2/find_next2_response_spec.rb +11 -2
  157. data/spec/lib/ruby_smb/smb1/packet/tree_connect_response_spec.rb +40 -0
  158. data/spec/lib/ruby_smb/smb1/pipe_spec.rb +272 -149
  159. data/spec/lib/ruby_smb/smb1/tree_spec.rb +44 -7
  160. data/spec/lib/ruby_smb/smb2/file_spec.rb +295 -2
  161. data/spec/lib/ruby_smb/smb2/packet/error_packet_spec.rb +78 -0
  162. data/spec/lib/ruby_smb/smb2/packet/query_directory_response_spec.rb +8 -0
  163. data/spec/lib/ruby_smb/smb2/packet/tree_connect_response_spec.rb +8 -0
  164. data/spec/lib/ruby_smb/smb2/pipe_spec.rb +322 -145
  165. data/spec/lib/ruby_smb/smb2/tree_spec.rb +214 -0
  166. data.tar.gz.sig +0 -0
  167. metadata +70 -11
  168. metadata.gz.sig +0 -0
  169. data/lib/ruby_smb/smb1/dcerpc.rb +0 -67
  170. data/lib/ruby_smb/smb2/dcerpc.rb +0 -70
  171. data/spec/lib/ruby_smb/smb1/packet/error_packet_spec.rb +0 -37
@@ -0,0 +1,28 @@
1
+ RSpec.describe RubySMB::Dcerpc::Winreg::RpcHkey do
2
+ it 'is NdrContextHandle subclass' do
3
+ expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrContextHandle
4
+ end
5
+ end
6
+
7
+ RSpec.describe RubySMB::Dcerpc::Winreg::CloseKeyRequest do
8
+ subject(:packet) { described_class.new }
9
+
10
+ it { is_expected.to respond_to :hkey }
11
+ it { is_expected.to respond_to :opnum }
12
+
13
+ it 'is little endian' do
14
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
15
+ end
16
+
17
+ describe '#hkey' do
18
+ it 'is a RpcHkey structure' do
19
+ expect(packet.hkey).to be_a RubySMB::Dcerpc::Winreg::RpcHkey
20
+ end
21
+ end
22
+
23
+ describe '#initialize_instance' do
24
+ it 'sets #opnum to REG_CLOSE_KEY constant' do
25
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Winreg::REG_CLOSE_KEY)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,36 @@
1
+ RSpec.describe RubySMB::Dcerpc::Winreg::RpcHkey do
2
+ it 'is NdrContextHandle subclass' do
3
+ expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrContextHandle
4
+ end
5
+ end
6
+
7
+ RSpec.describe RubySMB::Dcerpc::Winreg::CloseKeyResponse do
8
+ subject(:packet) { described_class.new }
9
+
10
+ it { is_expected.to respond_to :hkey }
11
+ it { is_expected.to respond_to :error_status }
12
+ it { is_expected.to respond_to :opnum }
13
+
14
+ it 'is little endian' do
15
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
16
+ end
17
+
18
+ describe '#hkey' do
19
+ it 'is a RpcHkey structure' do
20
+ expect(packet.hkey).to be_a RubySMB::Dcerpc::Winreg::RpcHkey
21
+ end
22
+ end
23
+
24
+ describe '#error_status' do
25
+ it 'is a 32-bit unsigned integer' do
26
+ expect(packet.error_status).to be_a BinData::Uint32le
27
+ end
28
+ end
29
+
30
+ describe '#initialize_instance' do
31
+ it 'sets #opnum to REG_CLOSE_KEY constant' do
32
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Winreg::REG_CLOSE_KEY)
33
+ end
34
+ end
35
+ end
36
+
@@ -0,0 +1,108 @@
1
+ RSpec.describe RubySMB::Dcerpc::Winreg::RpcHkey do
2
+ it 'is NdrContextHandle subclass' do
3
+ expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrContextHandle
4
+ end
5
+ end
6
+
7
+ RSpec.describe RubySMB::Dcerpc::Winreg::EnumKeyRequest do
8
+ subject(:packet) { described_class.new }
9
+
10
+ it { is_expected.to respond_to :hkey }
11
+ it { is_expected.to respond_to :dw_index }
12
+ it { is_expected.to respond_to :lp_name }
13
+ it { is_expected.to respond_to :pad1 }
14
+ it { is_expected.to respond_to :lp_class }
15
+ it { is_expected.to respond_to :pad2 }
16
+ it { is_expected.to respond_to :lpft_last_write_time }
17
+ it { is_expected.to respond_to :opnum }
18
+
19
+ it 'is little endian' do
20
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
21
+ end
22
+
23
+ describe '#hkey' do
24
+ it 'is a RpcHkey structure' do
25
+ expect(packet.hkey).to be_a RubySMB::Dcerpc::Winreg::RpcHkey
26
+ end
27
+ end
28
+
29
+ describe '#dw_index' do
30
+ it 'is a 32-bit unsigned integer' do
31
+ expect(packet.dw_index).to be_a BinData::Uint32le
32
+ end
33
+ end
34
+
35
+ describe '#lp_name' do
36
+ it 'is a RrpUnicodeString structure' do
37
+ expect(packet.lp_name).to be_a RubySMB::Dcerpc::RrpUnicodeString
38
+ end
39
+ end
40
+
41
+ describe '#pad1' do
42
+ it 'is a string' do
43
+ expect(packet.pad1).to be_a BinData::String
44
+ end
45
+
46
+ it 'should keep #lp_class 4-byte aligned' do
47
+ packet.lp_name = "test"
48
+ expect(packet.lp_class.abs_offset % 4).to eq 0
49
+ end
50
+ end
51
+
52
+ describe '#lp_class' do
53
+ it 'is a PrrpUnicodeString structure' do
54
+ expect(packet.lp_class).to be_a RubySMB::Dcerpc::PrrpUnicodeString
55
+ end
56
+
57
+ it 'has a initial value of 0' do
58
+ expect(packet.lp_class).to eq(0)
59
+ end
60
+ end
61
+
62
+ describe '#pad2' do
63
+ it 'is a string' do
64
+ expect(packet.pad2).to be_a BinData::String
65
+ end
66
+
67
+ it 'should keep #lpft_last_write_time 4-byte aligned' do
68
+ packet.lp_class = "test"
69
+ expect(packet.lpft_last_write_time.abs_offset % 4).to eq 0
70
+ end
71
+ end
72
+
73
+ describe '#lpft_last_write_time' do
74
+ it 'is a NdrLpFileTime structure' do
75
+ expect(packet.lpft_last_write_time).to be_a RubySMB::Dcerpc::Ndr::NdrLpFileTime
76
+ end
77
+ end
78
+
79
+ describe '#initialize_instance' do
80
+ it 'sets #opnum to REG_ENUM_KEY constant' do
81
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Winreg::REG_ENUM_KEY)
82
+ end
83
+ end
84
+
85
+ describe '#pad_length1' do
86
+ it 'returns 0 when #lp_class is already 4-byte aligned' do
87
+ packet.lp_name = 'align'
88
+ expect(packet.pad_length1).to eq 0
89
+ end
90
+
91
+ it 'returns 2 when #lp_class is only 2-byte aligned' do
92
+ packet.lp_name = 'align' + 'A'
93
+ expect(packet.pad_length1).to eq 2
94
+ end
95
+ end
96
+
97
+ describe '#pad_length2' do
98
+ it 'returns 0 when #lpft_last_write_time is already 4-byte aligned' do
99
+ packet.lp_class = 'align'
100
+ expect(packet.pad_length2).to eq 0
101
+ end
102
+
103
+ it 'returns 2 when #lpft_last_write_time is only 2-byte aligned' do
104
+ packet.lp_class = 'align' + 'A'
105
+ expect(packet.pad_length2).to eq 2
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,97 @@
1
+ RSpec.describe RubySMB::Dcerpc::Winreg::EnumKeyResponse do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :lp_name }
5
+ it { is_expected.to respond_to :pad1 }
6
+ it { is_expected.to respond_to :lp_class }
7
+ it { is_expected.to respond_to :pad2 }
8
+ it { is_expected.to respond_to :lpft_last_write_time }
9
+ it { is_expected.to respond_to :error_status }
10
+ it { is_expected.to respond_to :opnum }
11
+
12
+ it 'is little endian' do
13
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
14
+ end
15
+
16
+
17
+ describe '#lp_name' do
18
+ it 'is a RrpUnicodeString structure' do
19
+ expect(packet.lp_name).to be_a RubySMB::Dcerpc::RrpUnicodeString
20
+ end
21
+ end
22
+
23
+ describe '#pad1' do
24
+ it 'is a string' do
25
+ expect(packet.pad1).to be_a BinData::String
26
+ end
27
+
28
+ it 'should keep #lp_class 4-byte aligned' do
29
+ packet.lp_name = "test"
30
+ expect(packet.lp_class.abs_offset % 4).to eq 0
31
+ end
32
+ end
33
+
34
+ describe '#lp_class' do
35
+ it 'is a PrrpUnicodeString structure' do
36
+ expect(packet.lp_class).to be_a RubySMB::Dcerpc::PrrpUnicodeString
37
+ end
38
+
39
+ it 'has a initial value of 0' do
40
+ expect(packet.lp_class).to eq(0)
41
+ end
42
+ end
43
+
44
+ describe '#pad2' do
45
+ it 'is a string' do
46
+ expect(packet.pad2).to be_a BinData::String
47
+ end
48
+
49
+ it 'should keep #lpft_last_write_time 4-byte aligned' do
50
+ packet.lp_class = "test"
51
+ expect(packet.lpft_last_write_time.abs_offset % 4).to eq 0
52
+ end
53
+ end
54
+
55
+ describe '#lpft_last_write_time' do
56
+ it 'is a NdrLpFileTime structure' do
57
+ expect(packet.lpft_last_write_time).to be_a RubySMB::Dcerpc::Ndr::NdrLpFileTime
58
+ end
59
+ end
60
+
61
+ describe '#error_status' do
62
+ it 'is a 32-bit unsigned integer' do
63
+ expect(packet.error_status).to be_a BinData::Uint32le
64
+ end
65
+ end
66
+
67
+ describe '#initialize_instance' do
68
+ it 'sets #opnum to REG_ENUM_KEY constant' do
69
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Winreg::REG_ENUM_KEY)
70
+ end
71
+ end
72
+
73
+ describe '#pad_length1' do
74
+ it 'returns 0 when #lp_class is already 4-byte aligned' do
75
+ packet.lp_name = 'align'
76
+ expect(packet.pad_length1).to eq 0
77
+ end
78
+
79
+ it 'returns 2 when #lp_class is only 2-byte aligned' do
80
+ packet.lp_name = 'align' + 'A'
81
+ expect(packet.pad_length1).to eq 2
82
+ end
83
+ end
84
+
85
+ describe '#pad_length2' do
86
+ it 'returns 0 when #lpft_last_write_time is already 4-byte aligned' do
87
+ packet.lp_class = 'align'
88
+ expect(packet.pad_length2).to eq 0
89
+ end
90
+
91
+ it 'returns 2 when #lpft_last_write_time is only 2-byte aligned' do
92
+ packet.lp_class = 'align' + 'A'
93
+ expect(packet.pad_length2).to eq 2
94
+ end
95
+ end
96
+ end
97
+
@@ -0,0 +1,94 @@
1
+ RSpec.describe RubySMB::Dcerpc::Winreg::RpcHkey do
2
+ it 'is NdrContextHandle subclass' do
3
+ expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrContextHandle
4
+ end
5
+ end
6
+
7
+ RSpec.describe RubySMB::Dcerpc::Winreg::EnumValueRequest do
8
+ subject(:packet) { described_class.new }
9
+
10
+ it { is_expected.to respond_to :hkey }
11
+ it { is_expected.to respond_to :dw_index }
12
+ it { is_expected.to respond_to :lp_value_name }
13
+ it { is_expected.to respond_to :pad }
14
+ it { is_expected.to respond_to :lp_type }
15
+ it { is_expected.to respond_to :lp_data }
16
+ it { is_expected.to respond_to :lpcb_data }
17
+ it { is_expected.to respond_to :lpcb_len }
18
+ it { is_expected.to respond_to :opnum }
19
+
20
+ it 'is little endian' do
21
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
22
+ end
23
+
24
+ describe '#hkey' do
25
+ it 'is a RpcHkey structure' do
26
+ expect(packet.hkey).to be_a RubySMB::Dcerpc::Winreg::RpcHkey
27
+ end
28
+ end
29
+
30
+ describe '#dw_index' do
31
+ it 'is a 32-bit unsigned integer' do
32
+ expect(packet.dw_index).to be_a BinData::Uint32le
33
+ end
34
+ end
35
+
36
+ describe '#lp_value_name' do
37
+ it 'is a RrpUnicodeString structure' do
38
+ expect(packet.lp_value_name).to be_a RubySMB::Dcerpc::RrpUnicodeString
39
+ end
40
+ end
41
+
42
+ describe '#pad' do
43
+ it 'is a string' do
44
+ expect(packet.pad).to be_a BinData::String
45
+ end
46
+
47
+ it 'should keep #lp_type 4-byte aligned' do
48
+ packet.lp_value_name = "test"
49
+ expect(packet.lp_type.abs_offset % 4).to eq 0
50
+ end
51
+ end
52
+
53
+ describe '#lp_type' do
54
+ it 'is a NdrLpDword structure' do
55
+ expect(packet.lp_type).to be_a RubySMB::Dcerpc::Ndr::NdrLpDword
56
+ end
57
+ end
58
+
59
+ describe '#lp_data' do
60
+ it 'is a NdrLpByte structure' do
61
+ expect(packet.lp_data).to be_a RubySMB::Dcerpc::Ndr::NdrLpByte
62
+ end
63
+ end
64
+
65
+ describe '#lpcb_data' do
66
+ it 'is a NdrLpDword structure' do
67
+ expect(packet.lpcb_data).to be_a RubySMB::Dcerpc::Ndr::NdrLpDword
68
+ end
69
+ end
70
+
71
+ describe '#lpcb_len' do
72
+ it 'is a NdrLpDword structure' do
73
+ expect(packet.lpcb_len).to be_a RubySMB::Dcerpc::Ndr::NdrLpDword
74
+ end
75
+ end
76
+
77
+ describe '#initialize_instance' do
78
+ it 'sets #opnum to REG_ENUM_VALUE constant' do
79
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Winreg::REG_ENUM_VALUE)
80
+ end
81
+ end
82
+
83
+ describe '#pad_length' do
84
+ it 'returns 0 when #lp_class is already 4-byte aligned' do
85
+ packet.lp_value_name = 'align'
86
+ expect(packet.pad_length).to eq 0
87
+ end
88
+
89
+ it 'returns 2 when #lp_class is only 2-byte aligned' do
90
+ packet.lp_value_name = 'align' + 'A'
91
+ expect(packet.pad_length).to eq 2
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,82 @@
1
+ RSpec.describe RubySMB::Dcerpc::Winreg::EnumValueResponse do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :lp_value_name }
5
+ it { is_expected.to respond_to :pad }
6
+ it { is_expected.to respond_to :lp_type }
7
+ it { is_expected.to respond_to :lp_data }
8
+ it { is_expected.to respond_to :lpcb_data }
9
+ it { is_expected.to respond_to :lpcb_len }
10
+ it { is_expected.to respond_to :error_status }
11
+ it { is_expected.to respond_to :opnum }
12
+
13
+ it 'is little endian' do
14
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
15
+ end
16
+
17
+ describe '#lp_value_name' do
18
+ it 'is a RrpUnicodeString structure' do
19
+ expect(packet.lp_value_name).to be_a RubySMB::Dcerpc::RrpUnicodeString
20
+ end
21
+ end
22
+
23
+ describe '#pad' do
24
+ it 'is a string' do
25
+ expect(packet.pad).to be_a BinData::String
26
+ end
27
+
28
+ it 'should keep #lp_type 4-byte aligned' do
29
+ packet.lp_value_name = "test"
30
+ expect(packet.lp_type.abs_offset % 4).to eq 0
31
+ end
32
+ end
33
+
34
+ describe '#lp_type' do
35
+ it 'is a NdrLpDword structure' do
36
+ expect(packet.lp_type).to be_a RubySMB::Dcerpc::Ndr::NdrLpDword
37
+ end
38
+ end
39
+
40
+ describe '#lp_data' do
41
+ it 'is a NdrLpByte structure' do
42
+ expect(packet.lp_data).to be_a RubySMB::Dcerpc::Ndr::NdrLpByte
43
+ end
44
+ end
45
+
46
+ describe '#lpcb_data' do
47
+ it 'is a NdrLpDword structure' do
48
+ expect(packet.lpcb_data).to be_a RubySMB::Dcerpc::Ndr::NdrLpDword
49
+ end
50
+ end
51
+
52
+ describe '#lpcb_len' do
53
+ it 'is a NdrLpDword structure' do
54
+ expect(packet.lpcb_len).to be_a RubySMB::Dcerpc::Ndr::NdrLpDword
55
+ end
56
+ end
57
+
58
+ describe '#error_status' do
59
+ it 'is a 32-bit unsigned integer' do
60
+ expect(packet.error_status).to be_a BinData::Uint32le
61
+ end
62
+ end
63
+
64
+ describe '#initialize_instance' do
65
+ it 'sets #opnum to REG_ENUM_VALUE constant' do
66
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Winreg::REG_ENUM_VALUE)
67
+ end
68
+ end
69
+
70
+ describe '#pad_length' do
71
+ it 'returns 0 when #lp_class is already 4-byte aligned' do
72
+ packet.lp_value_name = 'align'
73
+ expect(packet.pad_length).to eq 0
74
+ end
75
+
76
+ it 'returns 2 when #lp_class is only 2-byte aligned' do
77
+ packet.lp_value_name = 'align' + 'A'
78
+ expect(packet.pad_length).to eq 2
79
+ end
80
+ end
81
+ end
82
+
@@ -0,0 +1,74 @@
1
+ RSpec.describe RubySMB::Dcerpc::Winreg::RpcHkey do
2
+ it 'is NdrContextHandle subclass' do
3
+ expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrContextHandle
4
+ end
5
+ end
6
+
7
+ RSpec.describe RubySMB::Dcerpc::Winreg::OpenKeyRequest do
8
+ subject(:packet) { described_class.new }
9
+
10
+ it { is_expected.to respond_to :hkey }
11
+ it { is_expected.to respond_to :lp_sub_key }
12
+ it { is_expected.to respond_to :pad }
13
+ it { is_expected.to respond_to :dw_options }
14
+ it { is_expected.to respond_to :sam_desired }
15
+ it { is_expected.to respond_to :opnum }
16
+
17
+ it 'is little endian' do
18
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
19
+ end
20
+
21
+ describe '#hkey' do
22
+ it 'is a RpcHkey structure' do
23
+ expect(packet.hkey).to be_a RubySMB::Dcerpc::Winreg::RpcHkey
24
+ end
25
+ end
26
+
27
+ describe '#lp_sub_key' do
28
+ it 'is a RrpUnicodeString structure' do
29
+ expect(packet.lp_sub_key).to be_a RubySMB::Dcerpc::RrpUnicodeString
30
+ end
31
+ end
32
+
33
+ describe '#pad' do
34
+ it 'is a string' do
35
+ expect(packet.pad).to be_a BinData::String
36
+ end
37
+
38
+ it 'should keep #dw_options 4-byte aligned' do
39
+ packet.lp_sub_key = "test"
40
+ expect(packet.dw_options.abs_offset % 4).to eq 0
41
+ end
42
+ end
43
+
44
+ describe '#dw_options' do
45
+ it 'is a 32-bit unsigned integer' do
46
+ expect(packet.dw_options).to be_a BinData::Uint32le
47
+ end
48
+ end
49
+
50
+ describe '#sam_desired' do
51
+ it 'is a Regsam structure' do
52
+ expect(packet.sam_desired).to be_a RubySMB::Dcerpc::Winreg::Regsam
53
+ end
54
+ end
55
+
56
+ describe '#initialize_instance' do
57
+ it 'sets #opnum to REG_OPEN_KEY constant' do
58
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Winreg::REG_OPEN_KEY)
59
+ end
60
+ end
61
+
62
+ describe '#pad_length' do
63
+ it 'returns 0 when #dw_options is already 4-byte aligned' do
64
+ packet.lp_sub_key = 'align'
65
+ expect(packet.pad_length).to eq 0
66
+ end
67
+
68
+ it 'returns 2 when #dw_options is only 2-byte aligned' do
69
+ packet.lp_sub_key = 'align' + 'A'
70
+ expect(packet.pad_length).to eq 2
71
+ end
72
+ end
73
+ end
74
+
@@ -0,0 +1,35 @@
1
+ RSpec.describe RubySMB::Dcerpc::Winreg::PrpcHkey do
2
+ it 'is NdrContextHandle subclass' do
3
+ expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrContextHandle
4
+ end
5
+ end
6
+
7
+ RSpec.describe RubySMB::Dcerpc::Winreg::OpenKeyResponse do
8
+ subject(:packet) { described_class.new }
9
+
10
+ it { is_expected.to respond_to :phk_result }
11
+ it { is_expected.to respond_to :error_status }
12
+ it { is_expected.to respond_to :opnum }
13
+
14
+ it 'is little endian' do
15
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
16
+ end
17
+
18
+ describe '#phk_result' do
19
+ it 'is a PrpcHkey structure' do
20
+ expect(packet.phk_result).to be_a RubySMB::Dcerpc::Winreg::PrpcHkey
21
+ end
22
+ end
23
+
24
+ describe '#error_status' do
25
+ it 'is a 32-bit unsigned integer' do
26
+ expect(packet.error_status).to be_a BinData::Uint32le
27
+ end
28
+ end
29
+
30
+ describe '#initialize_instance' do
31
+ it 'sets #opnum to REG_OPEN_KEY constant' do
32
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Winreg::REG_OPEN_KEY)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,90 @@
1
+ RSpec.describe RubySMB::Dcerpc::Winreg::PRegistryServerName do
2
+ it 'is NdrTopLevelFullPointer subclass' do
3
+ expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrTopLevelFullPointer
4
+ end
5
+
6
+ subject(:packet) { described_class.new }
7
+
8
+ it { is_expected.to respond_to :referent }
9
+
10
+ it 'is little endian' do
11
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
12
+ end
13
+
14
+ describe '#referent' do
15
+ it 'is a string in UTF-16LE' do
16
+ expect(packet.referent).to be_a RubySMB::Field::String16
17
+ end
18
+
19
+ it 'reads 4-bytes' do
20
+ str = 'spec_test'.encode('utf-16le')
21
+ packet.referent.read(str)
22
+ expect(packet.referent.to_binary_s.bytes).to eq(str.bytes[0,4])
23
+ end
24
+ end
25
+ end
26
+
27
+ RSpec.describe RubySMB::Dcerpc::Winreg::OpenRootKeyRequest do
28
+ subject(:packet) { described_class.new }
29
+
30
+ it { is_expected.to respond_to :p_registry_server_name }
31
+ it { is_expected.to respond_to :sam_desired }
32
+ it { is_expected.to respond_to :opnum }
33
+
34
+ it 'is little endian' do
35
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
36
+ end
37
+
38
+ describe '#p_registry_server_name' do
39
+ it 'is a PRegistryServerName structure' do
40
+ expect(packet.p_registry_server_name).to be_a RubySMB::Dcerpc::Winreg::PRegistryServerName
41
+ end
42
+ end
43
+
44
+ describe '#sam_desired' do
45
+ it 'is a Regsam structure' do
46
+ expect(packet.sam_desired).to be_a RubySMB::Dcerpc::Winreg::Regsam
47
+ end
48
+ end
49
+
50
+ describe '#initialize_instance' do
51
+ context 'when an #opnum parameter is provided' do
52
+ it 'sets #opnum to the parameter\'s value' do
53
+ packet = described_class.new(opnum: RubySMB::Dcerpc::Winreg::OPEN_HKLM)
54
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Winreg::OPEN_HKLM)
55
+ end
56
+ end
57
+
58
+ it 'sets #p_registry_server_name.referent to NULL unicode value' do
59
+ expect(packet.p_registry_server_name.referent).to eq("\0\0".encode('utf-16le'))
60
+ end
61
+
62
+ context 'when #opnum is not OPEN_HKPD, OPEN_HKPT or OPEN_HKPN' do
63
+ it 'sets the #sam_desired.maximum flag' do
64
+ packet = described_class.new(opnum: RubySMB::Dcerpc::Winreg::OPEN_HKCR)
65
+ expect(packet.sam_desired.maximum).to eq(1)
66
+ end
67
+ end
68
+
69
+ context 'when #opnum is OPEN_HKPD' do
70
+ it 'does not set the #sam_desired.maximum flag' do
71
+ packet = described_class.new(opnum: RubySMB::Dcerpc::Winreg::OPEN_HKPD)
72
+ expect(packet.sam_desired.maximum).to eq(0)
73
+ end
74
+ end
75
+
76
+ context 'when #opnum is OPEN_HKPT' do
77
+ it 'does not set the #sam_desired.maximum flag' do
78
+ packet = described_class.new(opnum: RubySMB::Dcerpc::Winreg::OPEN_HKPT)
79
+ expect(packet.sam_desired.maximum).to eq(0)
80
+ end
81
+ end
82
+
83
+ context 'when #opnum is OPEN_HKPN' do
84
+ it 'does not set the #sam_desired.maximum flag' do
85
+ packet = described_class.new(opnum: RubySMB::Dcerpc::Winreg::OPEN_HKPN)
86
+ expect(packet.sam_desired.maximum).to eq(0)
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,38 @@
1
+ RSpec.describe RubySMB::Dcerpc::Winreg::PrpcHkey do
2
+ it 'is NdrContextHandle subclass' do
3
+ expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrContextHandle
4
+ end
5
+ end
6
+
7
+ RSpec.describe RubySMB::Dcerpc::Winreg::OpenRootKeyResponse do
8
+ subject(:packet) { described_class.new }
9
+
10
+ it { is_expected.to respond_to :ph_key}
11
+ it { is_expected.to respond_to :error_status }
12
+ it { is_expected.to respond_to :opnum }
13
+
14
+ it 'is little endian' do
15
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
16
+ end
17
+
18
+ describe '#ph_key' do
19
+ it 'is a PrpcHkey structure' do
20
+ expect(packet.ph_key).to be_a RubySMB::Dcerpc::Winreg::PrpcHkey
21
+ end
22
+ end
23
+
24
+ describe '#error_status' do
25
+ it 'is a 32-bit unsigned integer' do
26
+ expect(packet.error_status).to be_a BinData::Uint32le
27
+ end
28
+ end
29
+
30
+ describe '#initialize_instance' do
31
+ context 'when an #opnum parameter is provided' do
32
+ it 'sets #opnum to the parameter\'s value' do
33
+ packet = described_class.new(opnum: RubySMB::Dcerpc::Winreg::OPEN_HKLM)
34
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Winreg::OPEN_HKLM)
35
+ end
36
+ end
37
+ end
38
+ end