rcs-common 9.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +49 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +1 -0
- data/Rakefile +27 -0
- data/lib/rcs-common.rb +21 -0
- data/lib/rcs-common/binary.rb +64 -0
- data/lib/rcs-common/cgi.rb +7 -0
- data/lib/rcs-common/component.rb +87 -0
- data/lib/rcs-common/crypt.rb +71 -0
- data/lib/rcs-common/deploy.rb +96 -0
- data/lib/rcs-common/diagnosticable.rb +136 -0
- data/lib/rcs-common/evidence.rb +261 -0
- data/lib/rcs-common/evidence/addressbook.rb +173 -0
- data/lib/rcs-common/evidence/application.rb +59 -0
- data/lib/rcs-common/evidence/calendar.rb +62 -0
- data/lib/rcs-common/evidence/call.rb +185 -0
- data/lib/rcs-common/evidence/camera.rb +25 -0
- data/lib/rcs-common/evidence/chat.rb +272 -0
- data/lib/rcs-common/evidence/clibpoard.rb +58 -0
- data/lib/rcs-common/evidence/command.rb +50 -0
- data/lib/rcs-common/evidence/common.rb +78 -0
- data/lib/rcs-common/evidence/content/camera/001.jpg +0 -0
- data/lib/rcs-common/evidence/content/coin/wallet_bit.dat +0 -0
- data/lib/rcs-common/evidence/content/coin/wallet_lite.dat +0 -0
- data/lib/rcs-common/evidence/content/file/Einstein.docx +0 -0
- data/lib/rcs-common/evidence/content/file/arabic.docx +0 -0
- data/lib/rcs-common/evidence/content/mouse/001.jpg +0 -0
- data/lib/rcs-common/evidence/content/mouse/002.jpg +0 -0
- data/lib/rcs-common/evidence/content/mouse/003.jpg +0 -0
- data/lib/rcs-common/evidence/content/mouse/004.jpg +0 -0
- data/lib/rcs-common/evidence/content/print/001.jpg +0 -0
- data/lib/rcs-common/evidence/content/screenshot/001.jpg +0 -0
- data/lib/rcs-common/evidence/content/screenshot/002.jpg +0 -0
- data/lib/rcs-common/evidence/content/screenshot/003.jpg +0 -0
- data/lib/rcs-common/evidence/content/url/001.jpg +0 -0
- data/lib/rcs-common/evidence/content/url/002.jpg +0 -0
- data/lib/rcs-common/evidence/content/url/003.jpg +0 -0
- data/lib/rcs-common/evidence/device.rb +23 -0
- data/lib/rcs-common/evidence/download.rb +54 -0
- data/lib/rcs-common/evidence/exec.rb +0 -0
- data/lib/rcs-common/evidence/file.rb +129 -0
- data/lib/rcs-common/evidence/filesystem.rb +71 -0
- data/lib/rcs-common/evidence/info.rb +24 -0
- data/lib/rcs-common/evidence/keylog.rb +84 -0
- data/lib/rcs-common/evidence/mail.rb +237 -0
- data/lib/rcs-common/evidence/mic.rb +39 -0
- data/lib/rcs-common/evidence/mms.rb +36 -0
- data/lib/rcs-common/evidence/money.rb +676 -0
- data/lib/rcs-common/evidence/mouse.rb +62 -0
- data/lib/rcs-common/evidence/password.rb +60 -0
- data/lib/rcs-common/evidence/photo.rb +80 -0
- data/lib/rcs-common/evidence/position.rb +303 -0
- data/lib/rcs-common/evidence/print.rb +50 -0
- data/lib/rcs-common/evidence/screenshot.rb +53 -0
- data/lib/rcs-common/evidence/sms.rb +91 -0
- data/lib/rcs-common/evidence/url.rb +133 -0
- data/lib/rcs-common/fixnum.rb +48 -0
- data/lib/rcs-common/gridfs.rb +294 -0
- data/lib/rcs-common/heartbeat.rb +96 -0
- data/lib/rcs-common/keywords.rb +50 -0
- data/lib/rcs-common/mime.rb +65 -0
- data/lib/rcs-common/mongoid.rb +19 -0
- data/lib/rcs-common/pascalize.rb +62 -0
- data/lib/rcs-common/path_utils.rb +67 -0
- data/lib/rcs-common/resolver.rb +40 -0
- data/lib/rcs-common/rest.rb +17 -0
- data/lib/rcs-common/sanitize.rb +42 -0
- data/lib/rcs-common/serializer.rb +404 -0
- data/lib/rcs-common/signature.rb +141 -0
- data/lib/rcs-common/stats.rb +94 -0
- data/lib/rcs-common/symbolize.rb +10 -0
- data/lib/rcs-common/systemstatus.rb +136 -0
- data/lib/rcs-common/temporary.rb +13 -0
- data/lib/rcs-common/time.rb +24 -0
- data/lib/rcs-common/trace.rb +138 -0
- data/lib/rcs-common/trace.yaml +42 -0
- data/lib/rcs-common/updater/client.rb +354 -0
- data/lib/rcs-common/updater/dsl.rb +178 -0
- data/lib/rcs-common/updater/payload.rb +79 -0
- data/lib/rcs-common/updater/server.rb +126 -0
- data/lib/rcs-common/updater/shared_key.rb +55 -0
- data/lib/rcs-common/updater/tmp_dir.rb +13 -0
- data/lib/rcs-common/utf16le.rb +83 -0
- data/lib/rcs-common/version.rb +5 -0
- data/lib/rcs-common/winfirewall.rb +235 -0
- data/rcs-common.gemspec +64 -0
- data/spec/gridfs_spec.rb +637 -0
- data/spec/mongoid.yaml +6 -0
- data/spec/signature_spec.rb +105 -0
- data/spec/spec_helper.rb +22 -0
- data/spec/updater_spec.rb +80 -0
- data/tasks/deploy.rake +21 -0
- data/tasks/protect.rake +90 -0
- data/test/helper.rb +17 -0
- data/test/test_binary.rb +107 -0
- data/test/test_cgi.rb +14 -0
- data/test/test_crypt.rb +125 -0
- data/test/test_evidence.rb +52 -0
- data/test/test_evidence_manager.rb +119 -0
- data/test/test_fixnum.rb +35 -0
- data/test/test_keywords.rb +137 -0
- data/test/test_mime.rb +49 -0
- data/test/test_pascalize.rb +100 -0
- data/test/test_path_utils.rb +24 -0
- data/test/test_rcs-common.rb +7 -0
- data/test/test_sanitize.rb +40 -0
- data/test/test_serialization.rb +20 -0
- data/test/test_stats.rb +90 -0
- data/test/test_symbolize.rb +20 -0
- data/test/test_systemstatus.rb +35 -0
- data/test/test_time.rb +56 -0
- data/test/test_trace.rb +25 -0
- data/test/test_utf16le.rb +71 -0
- data/test/test_winfirewall.rb +68 -0
- metadata +423 -0
data/spec/mongoid.yaml
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rcs-common/signature'
|
3
|
+
|
4
|
+
class TestSignature
|
5
|
+
include Mongoid::Document
|
6
|
+
include RCS::Mongoid::Signature
|
7
|
+
|
8
|
+
field :name, type: String
|
9
|
+
field :surname, type: String
|
10
|
+
field :code, type: Integer
|
11
|
+
field :address, type: String
|
12
|
+
field :complex, type: Hash
|
13
|
+
|
14
|
+
sign_options :include => [:name, :surname, :code, :complex]
|
15
|
+
end
|
16
|
+
|
17
|
+
describe RCS::Mongoid::Signature do
|
18
|
+
|
19
|
+
describe '.included' do
|
20
|
+
|
21
|
+
let(:test) do
|
22
|
+
TestSignature.new
|
23
|
+
end
|
24
|
+
|
25
|
+
let(:fields) do
|
26
|
+
TestSignature.fields
|
27
|
+
end
|
28
|
+
|
29
|
+
before do
|
30
|
+
test.run_callbacks(:create)
|
31
|
+
test.run_callbacks(:save)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "adds signature to the document" do
|
35
|
+
expect(fields["signature"]).to_not be_nil
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
context "when the document is created" do
|
41
|
+
|
42
|
+
let(:test) do
|
43
|
+
TestSignature.create(name: 'a', surname: 'b')
|
44
|
+
end
|
45
|
+
|
46
|
+
it "runs the created callbacks" do
|
47
|
+
expect(test.signature).to_not be_nil
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'validates the signature' do
|
51
|
+
expect(test.check_signature).to be_truthy
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'when the document is updated' do
|
57
|
+
|
58
|
+
let(:test) do
|
59
|
+
TestSignature.create(name: 'a', surname: 'b', code: 123, complex: {a:1, b:2})
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'validates the signature after reload' do
|
63
|
+
test.reload
|
64
|
+
expect(test.check_signature).to be_truthy
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'validates the signature after save' do
|
68
|
+
test.name = 'modified'
|
69
|
+
test.save
|
70
|
+
test.reload
|
71
|
+
expect(test.check_signature).to be_truthy
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'validates the signature after update_attributes' do
|
75
|
+
test.update_attributes({surname: 'modified'})
|
76
|
+
test.reload
|
77
|
+
expect(test.check_signature).to be_truthy
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'when the document is tampered' do
|
83
|
+
|
84
|
+
let(:test) do
|
85
|
+
TestSignature.create(name: 'a', surname: 'b', code: 123, complex: {a:1, b:2})
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'validate the signature when changing not included field' do
|
89
|
+
test.address = 'c'
|
90
|
+
expect(test.check_signature).to be_truthy
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'invalidate the signature when changing a signed field' do
|
94
|
+
test.name = 'mod'
|
95
|
+
expect(test.check_signature).to be_falsey
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'invalidate the signature when changing the signature itself' do
|
99
|
+
test.signature = {}
|
100
|
+
expect(test.check_signature).to be_falsey
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
require 'rspec'
|
3
|
+
require 'pry'
|
4
|
+
|
5
|
+
$LOAD_PATH << File.expand_path('../lib', __FILE__)
|
6
|
+
|
7
|
+
require 'rcs-common'
|
8
|
+
require 'rcs-common/mongoid'
|
9
|
+
|
10
|
+
RSpec.configure do |config|
|
11
|
+
|
12
|
+
config.color = true
|
13
|
+
|
14
|
+
config.before(:all) do
|
15
|
+
ENV['MONGOID_ENV'] = 'spec'
|
16
|
+
Mongoid.load! File.expand_path('../mongoid.yaml', __FILE__), :spec
|
17
|
+
end
|
18
|
+
|
19
|
+
config.before(:each) do
|
20
|
+
Mongoid.purge!
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'stringio'
|
3
|
+
require 'rcs-common/updater/client'
|
4
|
+
require 'rcs-common/updater/server'
|
5
|
+
|
6
|
+
module RCS::Updater
|
7
|
+
|
8
|
+
describe 'client' do
|
9
|
+
before do
|
10
|
+
allow_any_instance_of(Client).to receive(:trace).and_return(nil)
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:signature) { '2433e2d6865e4e9a15ee57f74a196477' }
|
14
|
+
|
15
|
+
let(:signature2) { '2433e2d6865e4e9a15ee57f74a196400' }
|
16
|
+
|
17
|
+
let(:client) { Client.new("localhost") }
|
18
|
+
|
19
|
+
before do
|
20
|
+
@server_process_pid = fork do
|
21
|
+
allow_any_instance_of(SharedKey).to receive(:read_key_from_file).and_return(signature)
|
22
|
+
$stdout = StringIO.new
|
23
|
+
$stderr = $stdout
|
24
|
+
Server.start
|
25
|
+
end
|
26
|
+
|
27
|
+
# Wait for the server to bind
|
28
|
+
sleep(2)
|
29
|
+
|
30
|
+
allow(client).to receive(:localhost?).and_return(false)
|
31
|
+
end
|
32
|
+
|
33
|
+
after do
|
34
|
+
Process.kill(9, @server_process_pid)
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'when shared key is valid' do
|
38
|
+
before do
|
39
|
+
allow_any_instance_of(SharedKey).to receive(:read_key_from_file).and_return(signature)
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'communicates' do
|
43
|
+
expect(client.connected?).to be_truthy
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'when shared key is not valid' do
|
48
|
+
before do
|
49
|
+
allow_any_instance_of(SharedKey).to receive(:read_key_from_file).and_return(signature2)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'does not get a reply' do
|
53
|
+
expect(client.connected?).to be_falsey
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'when requesting to execute an invalid command' do
|
58
|
+
before do
|
59
|
+
allow_any_instance_of(SharedKey).to receive(:read_key_from_file).and_return(signature)
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'raises an error' do
|
63
|
+
client.max_retries = 0
|
64
|
+
expect { client.request("xpas123Mnq1", exec: 1) }.to raise_error
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context 'when requesting to execute the hostname command' do
|
69
|
+
before do
|
70
|
+
allow_any_instance_of(SharedKey).to receive(:read_key_from_file).and_return(signature)
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'gets a valid response' do
|
74
|
+
resp = client.request("hostname", exec: 1)
|
75
|
+
expect(resp[:return_code]).to eq(0)
|
76
|
+
expect(resp[:output]).to eq(`hostname`)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
data/tasks/deploy.rake
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'rcs-common/deploy'
|
2
|
+
|
3
|
+
desc "Deploy this project"
|
4
|
+
task :deploy do
|
5
|
+
user = ENV['DEPLOY_USER'] || 'Administrator'
|
6
|
+
address = ENV['DEPLOY_ADDRESS'] || '192.168.100.100'
|
7
|
+
deploy = RCS::Deploy.new(user: user, address: address)
|
8
|
+
$target = deploy.target
|
9
|
+
$me = deploy.me
|
10
|
+
|
11
|
+
if ENV['SKIP_CONFIRM'] != 'yes' and $me.pending_changes?
|
12
|
+
exit unless $me.ask('You have pending changes, continue?')
|
13
|
+
end
|
14
|
+
|
15
|
+
$me.run('rm -f pkg/*.gem')
|
16
|
+
$me.run('rake build')
|
17
|
+
$target.run("cd ./rcs-common && del *.gem")
|
18
|
+
$target.mirror!("pkg", "./rcs-common")
|
19
|
+
$target.run("cd ./rcs-common; \"C:/RCS/Ruby/bin/gem\" install --conservative rcs*.gem; \"C:/RCS/Ruby/bin/gem\" clean rcs-common")
|
20
|
+
$target.restart_service('RCSWorker')
|
21
|
+
end
|
data/tasks/protect.rake
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
namespace :protect do
|
4
|
+
|
5
|
+
def verbose?
|
6
|
+
Rake.verbose == true
|
7
|
+
end
|
8
|
+
|
9
|
+
def report(message)
|
10
|
+
print message + '...'
|
11
|
+
STDOUT.flush
|
12
|
+
if block_given?
|
13
|
+
yield
|
14
|
+
end
|
15
|
+
puts ' ok'
|
16
|
+
end
|
17
|
+
|
18
|
+
def exec_rubyencoder(cmd)
|
19
|
+
if verbose?
|
20
|
+
system(cmd) || raise("Econding failed.")
|
21
|
+
else
|
22
|
+
raise("Econding failed.") if `#{cmd}` !~ /processed, 0 errors/
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def windows?
|
27
|
+
RbConfig::CONFIG['host_os'] =~ /mingw/
|
28
|
+
end
|
29
|
+
|
30
|
+
if windows?
|
31
|
+
RUBYENCPATH = 'C:/Program Files (x86)/RubyEncoder'
|
32
|
+
RUBYENC = "\"C:\\Program Files (x86)\\RubyEncoder\\rgencoder.exe\""
|
33
|
+
else
|
34
|
+
paths = ['/Applications/Development/RubyEncoder.app/Contents/MacOS', '/Applications/RubyEncoder.app/Contents/MacOS']
|
35
|
+
RUBYENCPATH = File.exists?(paths.first) ? paths.first : paths.last
|
36
|
+
RUBYENC = "#{RUBYENCPATH}/rgencoder"
|
37
|
+
end
|
38
|
+
|
39
|
+
RUBYENC_VERSION = '2.0.0'
|
40
|
+
|
41
|
+
LIB_PATH = File.expand_path('../../lib', __FILE__)
|
42
|
+
|
43
|
+
raise("Invalid lib path") unless File.exists?("#{LIB_PATH}/rcs-common.rb")
|
44
|
+
|
45
|
+
desc "Build an encrypted version of rcs-common gem into the pkg directory"
|
46
|
+
task :build do
|
47
|
+
begin
|
48
|
+
FileUtils.cp_r(LIB_PATH, "#{LIB_PATH}_src")
|
49
|
+
|
50
|
+
# Encoding files
|
51
|
+
report("Encoding scripts (use --trace to see RubyEncoder output)") do
|
52
|
+
exec_rubyencoder("#{RUBYENC} --stop-on-error --encoding UTF-8 -b- -r --ruby #{RUBYENC_VERSION} \"#{LIB_PATH}/*.rb\"")
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
# Copy rgloader to lib folder
|
57
|
+
|
58
|
+
rgpath = "#{LIB_PATH}/rgloader"
|
59
|
+
FileUtils.rm_rf(rgpath)
|
60
|
+
FileUtils.mkdir(rgpath)
|
61
|
+
|
62
|
+
files = Dir["#{RUBYENCPATH}/Loaders/**/**"]
|
63
|
+
# keep only the interesting files (2.0.x windows, macos)
|
64
|
+
files.delete_if {|v| v.match(/bsd/i) or v.match(/linux/i)}
|
65
|
+
files.keep_if {|v| v.match(/#{RUBYENC_VERSION.gsub('.','')[0..1]}/) or v.match(/loader.rb/) }
|
66
|
+
|
67
|
+
files.each { |f| FileUtils.cp(f, rgpath) }
|
68
|
+
|
69
|
+
|
70
|
+
# Building the gem
|
71
|
+
|
72
|
+
export_protected = windows? ? "set PROTECTED=1 &&" : "export PROTECTED=1 ;"
|
73
|
+
system "#{export_protected} rake build"
|
74
|
+
ensure
|
75
|
+
# Restore the lib folder
|
76
|
+
if Dir.exists?("#{LIB_PATH}_src")
|
77
|
+
FileUtils.rm_rf(LIB_PATH) if Dir.exists?(LIB_PATH)
|
78
|
+
FileUtils.mv("#{LIB_PATH}_src", LIB_PATH)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
desc "Build and install an encrypted version of rcs-common into system gems"
|
84
|
+
task :install do
|
85
|
+
FileUtils.rm_rf("#{LIB_PATH}/../pkg")
|
86
|
+
Rake::Task['protect:build'].invoke
|
87
|
+
gemfile = Dir["#{LIB_PATH}/../pkg/*.gem"].first
|
88
|
+
system("gem install --conservative #{gemfile}")
|
89
|
+
end
|
90
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
|
3
|
+
begin
|
4
|
+
Bundler.setup(:default, :development)
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts e.message
|
7
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
9
|
+
end
|
10
|
+
require 'test/unit'
|
11
|
+
|
12
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
13
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
14
|
+
require 'rcs-common'
|
15
|
+
|
16
|
+
class Test::Unit::TestCase
|
17
|
+
end
|
data/test/test_binary.rb
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require 'securerandom'
|
3
|
+
|
4
|
+
class BinaryPatchTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def test_string
|
7
|
+
input = "string to be modified"
|
8
|
+
output = "string modified"
|
9
|
+
|
10
|
+
input.binary_patch "to be ", ""
|
11
|
+
|
12
|
+
assert_equal output, input
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_binary
|
16
|
+
input = SecureRandom.random_bytes(16)
|
17
|
+
search = input.slice(0..3)
|
18
|
+
output = "1234" + input[4..-1]
|
19
|
+
|
20
|
+
input.binary_patch search, "1234"
|
21
|
+
|
22
|
+
assert_equal output, input
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_binary_with_zero
|
26
|
+
input = "this\x00and\x00that"
|
27
|
+
search = "and"
|
28
|
+
replace = ",\x00this\x00,"
|
29
|
+
output = "this\x00,\x00this\x00,\x00that"
|
30
|
+
|
31
|
+
input.binary_patch search, replace
|
32
|
+
|
33
|
+
assert_equal output, input
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_binary_with_regex
|
37
|
+
input = SecureRandom.random_bytes(16)
|
38
|
+
search = input.slice(0..3)
|
39
|
+
output = '\&$1' + input[4..-1]
|
40
|
+
|
41
|
+
input.binary_patch search, '\&$1'
|
42
|
+
|
43
|
+
assert_equal output, input
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_not_found
|
47
|
+
input = "ciao"
|
48
|
+
|
49
|
+
assert_raise MatchNotFound do
|
50
|
+
input.binary_patch "miao", "bau"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_with_offset
|
55
|
+
input = "ciao miao bau"
|
56
|
+
offset = 5
|
57
|
+
string = "test"
|
58
|
+
output = "ciao test bau"
|
59
|
+
|
60
|
+
input.binary_patch_at_offset offset, string
|
61
|
+
|
62
|
+
assert_equal output, input
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_with_offset_out_of_bound
|
66
|
+
input = "ciao bau"
|
67
|
+
offset = 15
|
68
|
+
string = "test"
|
69
|
+
|
70
|
+
assert_raise OutOfBounds do
|
71
|
+
input.binary_patch_at_offset offset, string
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_with_offset_too_long
|
76
|
+
input = "ciao bau"
|
77
|
+
offset = 5
|
78
|
+
string = "test"
|
79
|
+
|
80
|
+
assert_raise OutOfBoundsString do
|
81
|
+
input.binary_patch_at_offset offset, string
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_add_at_offset
|
86
|
+
input = "\x00\x00\x00\x00ciao miao bau"
|
87
|
+
offset = 0
|
88
|
+
value = 16
|
89
|
+
output = "\x10\x00\x00\x00ciao miao bau"
|
90
|
+
|
91
|
+
input.binary_add_at_offset offset, value
|
92
|
+
|
93
|
+
assert_equal output, input
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_add_at_offset_not_zero
|
97
|
+
input = "ciao \x10\x00\x00\x00 miao bau"
|
98
|
+
offset = 5
|
99
|
+
value = 16
|
100
|
+
output = "ciao \x20\x00\x00\x00 miao bau"
|
101
|
+
|
102
|
+
input.binary_add_at_offset offset, value
|
103
|
+
|
104
|
+
assert_equal output, input
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|