ruby_smb 2.0.2 → 2.0.3
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
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/examples/anonymous_auth.rb +3 -3
- data/examples/append_file.rb +10 -8
- data/examples/authenticate.rb +9 -5
- data/examples/delete_file.rb +8 -6
- data/examples/enum_registry_key.rb +5 -4
- data/examples/enum_registry_values.rb +5 -4
- data/examples/list_directory.rb +8 -6
- data/examples/negotiate_with_netbios_service.rb +9 -5
- data/examples/net_share_enum_all.rb +6 -4
- data/examples/pipes.rb +11 -12
- data/examples/query_service_status.rb +64 -0
- data/examples/read_file.rb +8 -6
- data/examples/read_registry_key_value.rb +6 -5
- data/examples/rename_file.rb +9 -7
- data/examples/tree_connect.rb +7 -5
- data/examples/write_file.rb +9 -7
- data/lib/ruby_smb/client.rb +72 -43
- data/lib/ruby_smb/client/negotiation.rb +1 -0
- data/lib/ruby_smb/dcerpc.rb +2 -0
- data/lib/ruby_smb/dcerpc/error.rb +3 -0
- data/lib/ruby_smb/dcerpc/ndr.rb +209 -44
- data/lib/ruby_smb/dcerpc/request.rb +13 -0
- data/lib/ruby_smb/dcerpc/rpc_security_attributes.rb +34 -0
- data/lib/ruby_smb/dcerpc/rrp_unicode_string.rb +9 -6
- data/lib/ruby_smb/dcerpc/svcctl.rb +479 -0
- data/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_request.rb +48 -0
- data/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_response.rb +26 -0
- data/lib/ruby_smb/dcerpc/svcctl/close_service_handle_request.rb +25 -0
- data/lib/ruby_smb/dcerpc/svcctl/close_service_handle_response.rb +26 -0
- data/lib/ruby_smb/dcerpc/svcctl/control_service_request.rb +26 -0
- data/lib/ruby_smb/dcerpc/svcctl/control_service_response.rb +26 -0
- data/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_request.rb +35 -0
- data/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_response.rb +23 -0
- data/lib/ruby_smb/dcerpc/svcctl/open_service_w_request.rb +31 -0
- data/lib/ruby_smb/dcerpc/svcctl/open_service_w_response.rb +23 -0
- data/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_request.rb +25 -0
- data/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_response.rb +44 -0
- data/lib/ruby_smb/dcerpc/svcctl/query_service_status_request.rb +23 -0
- data/lib/ruby_smb/dcerpc/svcctl/query_service_status_response.rb +27 -0
- data/lib/ruby_smb/dcerpc/svcctl/service_status.rb +25 -0
- data/lib/ruby_smb/dcerpc/svcctl/start_service_w_request.rb +27 -0
- data/lib/ruby_smb/dcerpc/svcctl/start_service_w_response.rb +25 -0
- data/lib/ruby_smb/dcerpc/winreg.rb +98 -17
- data/lib/ruby_smb/dcerpc/winreg/create_key_request.rb +73 -0
- data/lib/ruby_smb/dcerpc/winreg/create_key_response.rb +36 -0
- data/lib/ruby_smb/dcerpc/winreg/enum_key_request.rb +1 -1
- data/lib/ruby_smb/dcerpc/winreg/enum_value_request.rb +1 -1
- data/lib/ruby_smb/dcerpc/winreg/enum_value_response.rb +1 -1
- data/lib/ruby_smb/dcerpc/winreg/open_root_key_request.rb +4 -4
- data/lib/ruby_smb/dcerpc/winreg/query_info_key_request.rb +1 -1
- data/lib/ruby_smb/dcerpc/winreg/query_value_request.rb +7 -6
- data/lib/ruby_smb/dcerpc/winreg/query_value_response.rb +10 -10
- data/lib/ruby_smb/dcerpc/winreg/save_key_request.rb +37 -0
- data/lib/ruby_smb/dcerpc/winreg/save_key_response.rb +23 -0
- data/lib/ruby_smb/dispatcher/base.rb +1 -1
- data/lib/ruby_smb/dispatcher/socket.rb +1 -1
- data/lib/ruby_smb/field/stringz16.rb +17 -1
- data/lib/ruby_smb/nbss/session_header.rb +4 -4
- data/lib/ruby_smb/smb1/file.rb +2 -10
- data/lib/ruby_smb/smb1/pipe.rb +2 -0
- data/lib/ruby_smb/smb2/file.rb +25 -17
- data/lib/ruby_smb/smb2/pipe.rb +3 -0
- data/lib/ruby_smb/smb2/tree.rb +9 -3
- data/lib/ruby_smb/version.rb +1 -1
- data/spec/lib/ruby_smb/client_spec.rb +161 -60
- data/spec/lib/ruby_smb/dcerpc/ndr_spec.rb +1396 -77
- data/spec/lib/ruby_smb/dcerpc/rpc_security_attributes_spec.rb +161 -0
- data/spec/lib/ruby_smb/dcerpc/rrp_unicode_string_spec.rb +49 -12
- data/spec/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_request_spec.rb +191 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_response_spec.rb +38 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/close_service_handle_request_spec.rb +30 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/close_service_handle_response_spec.rb +38 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/control_service_request_spec.rb +39 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/control_service_response_spec.rb +38 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_request_spec.rb +78 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_response_spec.rb +38 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/open_service_w_request_spec.rb +59 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/open_service_w_response_spec.rb +38 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_request_spec.rb +38 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_response_spec.rb +152 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_status_request_spec.rb +30 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_status_response_spec.rb +38 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/service_status_spec.rb +72 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/start_service_w_request_spec.rb +46 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/start_service_w_response_spec.rb +30 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl_spec.rb +512 -0
- data/spec/lib/ruby_smb/dcerpc/winreg/create_key_request_spec.rb +110 -0
- data/spec/lib/ruby_smb/dcerpc/winreg/create_key_response_spec.rb +44 -0
- data/spec/lib/ruby_smb/dcerpc/winreg/enum_key_request_spec.rb +0 -4
- data/spec/lib/ruby_smb/dcerpc/winreg/enum_value_request_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/winreg/enum_value_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/winreg/open_root_key_request_spec.rb +9 -4
- data/spec/lib/ruby_smb/dcerpc/winreg/query_info_key_request_spec.rb +0 -4
- data/spec/lib/ruby_smb/dcerpc/winreg/query_value_request_spec.rb +17 -17
- data/spec/lib/ruby_smb/dcerpc/winreg/query_value_response_spec.rb +11 -23
- data/spec/lib/ruby_smb/dcerpc/winreg/save_key_request_spec.rb +57 -0
- data/spec/lib/ruby_smb/dcerpc/winreg/save_key_response_spec.rb +22 -0
- data/spec/lib/ruby_smb/dcerpc/winreg_spec.rb +215 -41
- data/spec/lib/ruby_smb/dispatcher/socket_spec.rb +10 -10
- data/spec/lib/ruby_smb/field/stringz16_spec.rb +12 -0
- data/spec/lib/ruby_smb/nbss/session_header_spec.rb +4 -11
- data/spec/lib/ruby_smb/smb1/pipe_spec.rb +7 -0
- data/spec/lib/ruby_smb/smb2/file_spec.rb +60 -6
- data/spec/lib/ruby_smb/smb2/pipe_spec.rb +7 -0
- data/spec/lib/ruby_smb/smb2/tree_spec.rb +35 -1
- metadata +72 -2
- metadata.gz.sig +0 -0
@@ -0,0 +1,161 @@
|
|
1
|
+
RSpec.describe RubySMB::Dcerpc::RpcSecurityDescriptor do
|
2
|
+
subject(:packet) { described_class.new }
|
3
|
+
|
4
|
+
it { is_expected.to respond_to :lp_security_descriptor }
|
5
|
+
it { is_expected.to respond_to :cb_in_security_descriptor }
|
6
|
+
it { is_expected.to respond_to :cb_out_security_descriptor }
|
7
|
+
|
8
|
+
it 'is little endian' do
|
9
|
+
expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '#lp_security_descriptor' do
|
13
|
+
it 'should be a NdrLpByteArray structure' do
|
14
|
+
expect(packet.lp_security_descriptor).to be_a RubySMB::Dcerpc::Ndr::NdrLpByteArray
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#cb_in_security_descriptor' do
|
19
|
+
it 'should be a 32-bit unsigned integer' do
|
20
|
+
expect(packet.cb_in_security_descriptor).to be_a BinData::Uint32le
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#cb_out_security_descriptor' do
|
25
|
+
it 'should be a 32-bit unsigned integer' do
|
26
|
+
expect(packet.cb_out_security_descriptor).to be_a BinData::Uint32le
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '#read' do
|
31
|
+
context 'with a null pointer' do
|
32
|
+
it 'reads its own binary representation' do
|
33
|
+
raw = packet.to_binary_s
|
34
|
+
expect(described_class.read(raw)).to eq(packet)
|
35
|
+
expect(described_class.read(raw).to_binary_s).to eq(raw)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'with a normal RpcSecurityAttributes structure' do
|
40
|
+
it 'reads its own binary representation' do
|
41
|
+
packet.lp_security_descriptor = RubySMB::Dcerpc::Ndr::NdrLpByteArray.new([1, 2, 3])
|
42
|
+
packet.cb_in_security_descriptor = 90
|
43
|
+
packet.cb_out_security_descriptor = 33
|
44
|
+
raw = packet.to_binary_s
|
45
|
+
expect(described_class.read(raw)).to eq(packet)
|
46
|
+
expect(described_class.read(raw).to_binary_s).to eq(raw)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
RSpec.describe RubySMB::Dcerpc::RpcSecurityAttributes do
|
53
|
+
subject(:packet) { described_class.new }
|
54
|
+
|
55
|
+
it { is_expected.to respond_to :n_length }
|
56
|
+
it { is_expected.to respond_to :rpc_security_descriptor }
|
57
|
+
it { is_expected.to respond_to :b_inheritHandle }
|
58
|
+
|
59
|
+
it 'is little endian' do
|
60
|
+
expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
|
61
|
+
end
|
62
|
+
|
63
|
+
describe '#n_length' do
|
64
|
+
it 'should be a 32-bit unsigned integer' do
|
65
|
+
expect(packet.n_length).to be_a BinData::Uint32le
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe '#rpc_security_descriptor' do
|
70
|
+
it 'should be a RpcSecurityDescriptor structure' do
|
71
|
+
expect(packet.rpc_security_descriptor).to be_a RubySMB::Dcerpc::RpcSecurityDescriptor
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe '#b_inheritHandle' do
|
76
|
+
it 'should be a 8-bit unsigned integer' do
|
77
|
+
expect(packet.b_inheritHandle).to be_a BinData::Uint8
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe '#read' do
|
82
|
+
context 'with a null pointer' do
|
83
|
+
it 'reads its own binary representation' do
|
84
|
+
raw = packet.to_binary_s
|
85
|
+
expect(described_class.read(raw)).to eq(packet)
|
86
|
+
expect(described_class.read(raw).to_binary_s).to eq(raw)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context 'with a normal RpcSecurityAttributes structure' do
|
91
|
+
it 'reads its own binary representation' do
|
92
|
+
packet.n_length = 3
|
93
|
+
packet.rpc_security_descriptor = RubySMB::Dcerpc::RpcSecurityDescriptor.new
|
94
|
+
packet.rpc_security_descriptor.lp_security_descriptor = [1, 2, 3]
|
95
|
+
packet.rpc_security_descriptor.cb_in_security_descriptor = 33
|
96
|
+
packet.rpc_security_descriptor.cb_out_security_descriptor = 22
|
97
|
+
packet.b_inheritHandle = 90
|
98
|
+
raw = packet.to_binary_s
|
99
|
+
expect(described_class.read(raw)).to eq(packet)
|
100
|
+
expect(described_class.read(raw).to_binary_s).to eq(raw)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
RSpec.describe RubySMB::Dcerpc::PrpcSecurityAttributes do
|
107
|
+
it 'is NdrPointer subclass' do
|
108
|
+
expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrPointer
|
109
|
+
end
|
110
|
+
|
111
|
+
subject(:packet) { described_class.new }
|
112
|
+
|
113
|
+
it { is_expected.to respond_to :referent }
|
114
|
+
|
115
|
+
it 'is little endian' do
|
116
|
+
expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
|
117
|
+
end
|
118
|
+
|
119
|
+
describe '#referent' do
|
120
|
+
it 'should be a RpcSecurityAttributes structure' do
|
121
|
+
expect(packet.referent).to be_a RubySMB::Dcerpc::RpcSecurityAttributes
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'exists if superclass #referent_id is not zero' do
|
125
|
+
packet.referent_id = 0xCCCC
|
126
|
+
expect(packet.referent?).to be true
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'does not exist if superclass #referent_id is zero' do
|
130
|
+
packet.referent_id = 0
|
131
|
+
expect(packet.referent?).to be false
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
describe '#read' do
|
136
|
+
context 'with a null pointer' do
|
137
|
+
it 'reads its own binary representation' do
|
138
|
+
raw = packet.to_binary_s
|
139
|
+
expect(described_class.read(raw)).to eq(packet)
|
140
|
+
expect(described_class.read(raw).to_binary_s).to eq(raw)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
context 'with a normal RpcSecurityAttributes structure' do
|
145
|
+
it 'reads its own binary representation' do
|
146
|
+
struct = RubySMB::Dcerpc::RpcSecurityAttributes.new
|
147
|
+
struct.n_length = 5
|
148
|
+
struct.rpc_security_descriptor = RubySMB::Dcerpc::RpcSecurityDescriptor.new
|
149
|
+
struct.rpc_security_descriptor.lp_security_descriptor = [1, 2, 3]
|
150
|
+
struct.rpc_security_descriptor.cb_in_security_descriptor = 33
|
151
|
+
struct.rpc_security_descriptor.cb_out_security_descriptor = 22
|
152
|
+
struct.b_inheritHandle = 4
|
153
|
+
packet.set(struct)
|
154
|
+
raw = packet.to_binary_s
|
155
|
+
expect(described_class.read(raw)).to eq(packet)
|
156
|
+
expect(described_class.read(raw).to_binary_s).to eq(raw)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
@@ -13,10 +13,6 @@ RSpec.describe RubySMB::Dcerpc::RrpUnicodeString do
|
|
13
13
|
it 'should be a 16-bit unsigned integer' do
|
14
14
|
expect(packet.buffer_length).to be_a BinData::Uint16le
|
15
15
|
end
|
16
|
-
|
17
|
-
it 'is set to 0 when #buffer in empty' do
|
18
|
-
expect(packet.buffer_length).to eq(0)
|
19
|
-
end
|
20
16
|
end
|
21
17
|
|
22
18
|
describe '#maximum_length' do
|
@@ -54,23 +50,44 @@ RSpec.describe RubySMB::Dcerpc::RrpUnicodeString do
|
|
54
50
|
expect(packet.maximum_length).to eq(('spec_test'.size + 1) * 2)
|
55
51
|
end
|
56
52
|
|
57
|
-
context 'when the value is
|
53
|
+
context 'when the value is :null' do
|
58
54
|
it 'sets #buffer_length to 0' do
|
59
|
-
packet.
|
55
|
+
packet.buffer_length = 33
|
56
|
+
packet.set(:null)
|
60
57
|
expect(packet.buffer_length).to eq(0)
|
61
58
|
end
|
62
59
|
|
63
|
-
it '
|
64
|
-
packet.
|
65
|
-
|
60
|
+
it 'does not set #maximum_length if it has already been set' do
|
61
|
+
packet.maximum_length = 33
|
62
|
+
packet.set(:null)
|
63
|
+
expect(packet.maximum_length).to eq(33)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe '#read' do
|
69
|
+
context 'with a null pointer' do
|
70
|
+
it 'reads its own binary representation' do
|
71
|
+
raw = packet.to_binary_s
|
72
|
+
expect(described_class.read(raw)).to eq(packet)
|
73
|
+
expect(described_class.read(raw).to_binary_s).to eq(raw)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context 'with a normal string' do
|
78
|
+
it 'reads its own binary representation' do
|
79
|
+
packet.assign('my_test')
|
80
|
+
raw = packet.to_binary_s
|
81
|
+
expect(described_class.read(raw)).to eq(packet)
|
82
|
+
expect(described_class.read(raw).to_binary_s).to eq(raw)
|
66
83
|
end
|
67
84
|
end
|
68
85
|
end
|
69
86
|
end
|
70
87
|
|
71
88
|
RSpec.describe RubySMB::Dcerpc::PrrpUnicodeString do
|
72
|
-
it 'is
|
73
|
-
expect(described_class).to be < RubySMB::Dcerpc::Ndr::
|
89
|
+
it 'is NdrPointer subclass' do
|
90
|
+
expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrPointer
|
74
91
|
end
|
75
92
|
|
76
93
|
subject(:packet) { described_class.new }
|
@@ -87,12 +104,32 @@ RSpec.describe RubySMB::Dcerpc::PrrpUnicodeString do
|
|
87
104
|
end
|
88
105
|
|
89
106
|
it 'exists if superclass #referent_identifier is not zero' do
|
107
|
+
packet.referent_id = 0xCCCC
|
90
108
|
expect(packet.referent?).to be true
|
91
109
|
end
|
92
110
|
|
93
111
|
it 'does not exist if superclass #referent_identifier is zero' do
|
94
|
-
packet.
|
112
|
+
packet.referent_id = 0
|
95
113
|
expect(packet.referent?).to be false
|
96
114
|
end
|
97
115
|
end
|
116
|
+
|
117
|
+
describe '#read' do
|
118
|
+
context 'with a null pointer' do
|
119
|
+
it 'reads its own binary representation' do
|
120
|
+
raw = packet.to_binary_s
|
121
|
+
expect(described_class.read(raw)).to eq(packet)
|
122
|
+
expect(described_class.read(raw).to_binary_s).to eq(raw)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
context 'with a normal string' do
|
127
|
+
it 'reads its own binary representation' do
|
128
|
+
packet.assign('my_test')
|
129
|
+
raw = packet.to_binary_s
|
130
|
+
expect(described_class.read(raw)).to eq(packet)
|
131
|
+
expect(described_class.read(raw).to_binary_s).to eq(raw)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
98
135
|
end
|
@@ -0,0 +1,191 @@
|
|
1
|
+
RSpec.describe RubySMB::Dcerpc::Svcctl::ChangeServiceConfigWRequest do
|
2
|
+
subject(:packet) { described_class.new }
|
3
|
+
|
4
|
+
it { is_expected.to respond_to :h_service }
|
5
|
+
it { is_expected.to respond_to :dw_service_type }
|
6
|
+
it { is_expected.to respond_to :dw_start_type }
|
7
|
+
it { is_expected.to respond_to :dw_error_control }
|
8
|
+
it { is_expected.to respond_to :lp_binary_path_name }
|
9
|
+
it { is_expected.to respond_to :pad1 }
|
10
|
+
it { is_expected.to respond_to :lp_load_order_group }
|
11
|
+
it { is_expected.to respond_to :pad2 }
|
12
|
+
it { is_expected.to respond_to :dw_tag_id }
|
13
|
+
it { is_expected.to respond_to :lp_dependencies }
|
14
|
+
it { is_expected.to respond_to :pad3 }
|
15
|
+
it { is_expected.to respond_to :dw_depend_size }
|
16
|
+
it { is_expected.to respond_to :lp_service_start_name }
|
17
|
+
it { is_expected.to respond_to :pad4 }
|
18
|
+
it { is_expected.to respond_to :lp_password }
|
19
|
+
it { is_expected.to respond_to :pad5 }
|
20
|
+
it { is_expected.to respond_to :dw_pw_size }
|
21
|
+
it { is_expected.to respond_to :lp_display_name }
|
22
|
+
|
23
|
+
it 'is little endian' do
|
24
|
+
expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#h_service' do
|
28
|
+
it 'is a ScRpcHandle structure' do
|
29
|
+
expect(packet.h_service).to be_a RubySMB::Dcerpc::Svcctl::ScRpcHandle
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#dw_service_type' do
|
34
|
+
it 'is a 32-bit unsigned integer' do
|
35
|
+
expect(packet.dw_service_type).to be_a BinData::Uint32le
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#dw_start_type' do
|
40
|
+
it 'is a 32-bit unsigned integer' do
|
41
|
+
expect(packet.dw_start_type).to be_a BinData::Uint32le
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '#dw_start_type' do
|
46
|
+
it 'is a 32-bit unsigned integer' do
|
47
|
+
expect(packet.dw_start_type).to be_a BinData::Uint32le
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '#lp_binary_path_name' do
|
52
|
+
it 'is a NdrLpStr structure' do
|
53
|
+
expect(packet.lp_binary_path_name).to be_a RubySMB::Dcerpc::Ndr::NdrLpStr
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '#pad1' do
|
58
|
+
it 'is a string' do
|
59
|
+
expect(packet.pad1).to be_a BinData::String
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should keep #lp_load_order_group 4-byte aligned' do
|
63
|
+
packet.lp_binary_path_name = "test"
|
64
|
+
expect(packet.lp_load_order_group.abs_offset % 4).to eq 0
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe '#lp_load_order_group' do
|
69
|
+
it 'is a NdrLpStr structure' do
|
70
|
+
expect(packet.lp_load_order_group).to be_a RubySMB::Dcerpc::Ndr::NdrLpStr
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe '#pad2' do
|
75
|
+
it 'is a string' do
|
76
|
+
expect(packet.pad1).to be_a BinData::String
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'should keep #dw_tag_id 4-byte aligned' do
|
80
|
+
packet.lp_load_order_group = "test"
|
81
|
+
expect(packet.dw_tag_id.abs_offset % 4).to eq 0
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe '#dw_tag_id' do
|
86
|
+
it 'is a NdrLpDword structure' do
|
87
|
+
expect(packet.dw_tag_id).to be_a RubySMB::Dcerpc::Ndr::NdrLpDword
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe '#lp_dependencies' do
|
92
|
+
it 'is a NdrLpByte structure' do
|
93
|
+
expect(packet.lp_dependencies).to be_a RubySMB::Dcerpc::Ndr::NdrLpByte
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe '#pad3' do
|
98
|
+
it 'is a string' do
|
99
|
+
expect(packet.pad1).to be_a BinData::String
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'should keep #dw_depend_size 4-byte aligned' do
|
103
|
+
packet.lp_dependencies = [1, 2, 3, 4]
|
104
|
+
expect(packet.dw_depend_size.abs_offset % 4).to eq 0
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
describe '#dw_depend_size' do
|
109
|
+
it 'is a 32-bit unsigned integer' do
|
110
|
+
expect(packet.dw_depend_size).to be_a BinData::Uint32le
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
describe '#lp_service_start_name' do
|
115
|
+
it 'is a NdrLpStr structure' do
|
116
|
+
expect(packet.lp_service_start_name).to be_a RubySMB::Dcerpc::Ndr::NdrLpStr
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
describe '#pad4' do
|
121
|
+
it 'is a string' do
|
122
|
+
expect(packet.pad1).to be_a BinData::String
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'should keep #lp_password 4-byte aligned' do
|
126
|
+
packet.lp_service_start_name = "test"
|
127
|
+
expect(packet.lp_password.abs_offset % 4).to eq 0
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
describe '#lp_password' do
|
132
|
+
it 'is a NdrLpByte structure' do
|
133
|
+
expect(packet.lp_password).to be_a RubySMB::Dcerpc::Ndr::NdrLpByte
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
describe '#pad5' do
|
138
|
+
it 'is a string' do
|
139
|
+
expect(packet.pad1).to be_a BinData::String
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'should keep #dw_pw_size 4-byte aligned' do
|
143
|
+
packet.lp_password = [1, 2, 3, 4]
|
144
|
+
expect(packet.dw_pw_size.abs_offset % 4).to eq 0
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
describe '#dw_pw_size' do
|
149
|
+
it 'is a 32-bit unsigned integer' do
|
150
|
+
expect(packet.dw_pw_size).to be_a BinData::Uint32le
|
151
|
+
end
|
152
|
+
|
153
|
+
it 'has a value set to #lp_password.max_count' do
|
154
|
+
packet.lp_password.max_count = 33
|
155
|
+
expect(packet.dw_pw_size).to eq(33)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
describe '#lp_display_name' do
|
160
|
+
it 'is a NdrLpStr structure' do
|
161
|
+
expect(packet.lp_display_name).to be_a RubySMB::Dcerpc::Ndr::NdrLpStr
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
describe '#initialize_instance' do
|
166
|
+
it 'sets #opnum to CHANGE_SERVICE_CONFIG_W constant' do
|
167
|
+
expect(packet.opnum).to eq(RubySMB::Dcerpc::Svcctl::CHANGE_SERVICE_CONFIG_W)
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'reads its own binary representation and outputs the same packet' do
|
172
|
+
packet = described_class.new(
|
173
|
+
h_service: {context_handle_attributes: 0, context_handle_uuid: '367abb81-9844-35f1-ad32-98f038001003'},
|
174
|
+
dw_service_type: 33,
|
175
|
+
dw_start_type: 3,
|
176
|
+
dw_error_control: 11,
|
177
|
+
lp_binary_path_name: 'test',
|
178
|
+
lp_load_order_group: 'test2',
|
179
|
+
dw_tag_id: 4,
|
180
|
+
lp_dependencies: [1,2],
|
181
|
+
dw_depend_size: 2,
|
182
|
+
lp_service_start_name: 'test3',
|
183
|
+
lp_password: [1,2,3],
|
184
|
+
dw_pw_size: 3,
|
185
|
+
lp_display_name: 'test4'
|
186
|
+
)
|
187
|
+
binary = packet.to_binary_s
|
188
|
+
expect(described_class.read(binary)).to eq(packet)
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
RSpec.describe RubySMB::Dcerpc::Svcctl::ChangeServiceConfigWResponse do
|
2
|
+
subject(:packet) { described_class.new }
|
3
|
+
|
4
|
+
it { is_expected.to respond_to :dw_tag_id }
|
5
|
+
it { is_expected.to respond_to :error_status }
|
6
|
+
|
7
|
+
it 'is little endian' do
|
8
|
+
expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '#dw_tag_id' do
|
12
|
+
it 'is a NdrLpDword structure' do
|
13
|
+
expect(packet.dw_tag_id).to be_a RubySMB::Dcerpc::Ndr::NdrLpDword
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#error_status' do
|
18
|
+
it 'is a 32-bit unsigned integer' do
|
19
|
+
expect(packet.error_status).to be_a BinData::Uint32le
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#initialize_instance' do
|
24
|
+
it 'sets #opnum to CHANGE_SERVICE_CONFIG_W constant' do
|
25
|
+
expect(packet.opnum).to eq(RubySMB::Dcerpc::Svcctl::CHANGE_SERVICE_CONFIG_W)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'reads its own binary representation and outputs the same packet' do
|
30
|
+
packet = described_class.new(
|
31
|
+
dw_tag_id: 4,
|
32
|
+
error_status: 1
|
33
|
+
)
|
34
|
+
binary = packet.to_binary_s
|
35
|
+
expect(described_class.read(binary)).to eq(packet)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|