w32evol_ruby 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +75 -0
- data/examples/example.rb +20 -0
- data/examples/in.bin +1 -0
- data/ext/w32evol.exe +0 -0
- data/lib/w32evol.rb +112 -0
- data/test/test_w32evol.rb +18 -0
- metadata +69 -0
data/README.rdoc
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
= w32evol_wrapper -- w32evol obfuscation engine wrapped in Ruby
|
2
|
+
|
3
|
+
== Table of Contents
|
4
|
+
1. Introduction
|
5
|
+
2. Dependencies
|
6
|
+
3. Installation
|
7
|
+
4. Usage
|
8
|
+
5. Development
|
9
|
+
|
10
|
+
== 1. Introduction
|
11
|
+
<b>Does not contain a virus</b>
|
12
|
+
|
13
|
+
This is a Ruby wrapper for the obfuscation engine
|
14
|
+
{w32evol}[https://bitbucket.org/martinvelez/w32evol].
|
15
|
+
|
16
|
+
The {w32evol}[https://bitbucket.org/martinvelez/w32evol] obfuscation engine
|
17
|
+
has a command line interface. This wrapper allows you to use the obfuscation
|
18
|
+
engine within your Ruby scripts.
|
19
|
+
|
20
|
+
== 2. Dependencies
|
21
|
+
|
22
|
+
* {Ruby 1.9.2}[http://www.ruby-lang.org/en/downloads/] or greater
|
23
|
+
* {wine}[http://www.winehq.org/download] (1.3 or greater, may work with 1.2)
|
24
|
+
* {w32evol}[https://bitbucket.org/martinvelez/w32evol/downloads]
|
25
|
+
(v0.1.0 is include in this gem's ext folder)
|
26
|
+
|
27
|
+
== 3. Installation
|
28
|
+
|
29
|
+
=== Rubygems:
|
30
|
+
You might need to use sudo.
|
31
|
+
gem install w32evol_ruby
|
32
|
+
|
33
|
+
=== Not Rubygems:
|
34
|
+
1. Download w32evol_ruby[http://bitbucket.org/martinvelez/w32evol_ruby/downloads]
|
35
|
+
2. Require the w32evol Ruby class file in your program (lib folder)
|
36
|
+
* The w32evol.exe engine is located in this gems ext folder.
|
37
|
+
|
38
|
+
== 4. Usage
|
39
|
+
|
40
|
+
=== Example 1
|
41
|
+
This example is found in the examples directory.
|
42
|
+
#!/usr/bin/env ruby
|
43
|
+
|
44
|
+
require 'w32evol_ruby'
|
45
|
+
|
46
|
+
ARGF.binmode
|
47
|
+
input = ARGF.read
|
48
|
+
# Assuming engine is installed in this gem's "ext" folder.
|
49
|
+
# Otherwise, you must pass the engine's executable path to the class's
|
50
|
+
# constructor.
|
51
|
+
# For example:
|
52
|
+
# engine = W32Evol.new({:command => "/path/to/engine"})
|
53
|
+
engine = W32Evol.new
|
54
|
+
|
55
|
+
output, errors, status = engine.obfuscate(input)
|
56
|
+
|
57
|
+
puts "INPUT:", input.inspect
|
58
|
+
puts "STATUS:", status
|
59
|
+
puts "ERRORS: ", errors
|
60
|
+
puts "OUTPUT:", output.inspect
|
61
|
+
|
62
|
+
|
63
|
+
== 5. Development
|
64
|
+
|
65
|
+
Author:: {Martin Velez}[http://www.martinvelez.com]
|
66
|
+
Copyright:: Copyright (C) 2012 {Martin Velez}[http://www.martinvelez.com]
|
67
|
+
License:: GPL[http://www.gnu.org/copyleft/gpl.html]
|
68
|
+
|
69
|
+
=== Source
|
70
|
+
Bitbucket[https://bitbucket.org/martinvelez/w32evol_ruby/src] is hosting this code.
|
71
|
+
http://bitbucket.org/martinvelez/w32evol_ruby/src
|
72
|
+
|
73
|
+
=== Issues and Bug Reports
|
74
|
+
Provide feedback, get help, request features, and reports bugs here:
|
75
|
+
https://bitbucket.org/martinvelez/w32evol_ruby/issues?status=new?status=open
|
data/examples/example.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
#require 'w32evol_ruby'
|
4
|
+
require '../lib/w32evol.rb'
|
5
|
+
|
6
|
+
ARGF.binmode
|
7
|
+
input = ARGF.read
|
8
|
+
# Assuming engine is installed in this gem's "ext" folder.
|
9
|
+
# Otherwise, you must pass the engine's executable path to the class's
|
10
|
+
# constructor.
|
11
|
+
# For example:
|
12
|
+
# engine = W32Evol.new({:command => "/path/to/engine"})
|
13
|
+
engine = W32Evol.new
|
14
|
+
|
15
|
+
output, errors, status = engine.obfuscate(input)
|
16
|
+
|
17
|
+
puts "INPUT:", input.inspect
|
18
|
+
puts "STATUS:", status
|
19
|
+
puts "ERRORS: ", errors
|
20
|
+
puts "OUTPUT:", output.inspect
|
data/examples/in.bin
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
��
|
data/ext/w32evol.exe
ADDED
Binary file
|
data/lib/w32evol.rb
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
|
3
|
+
# This class wraps the w32evol obfuscation engine.
|
4
|
+
# {w32evol}[https://github.com/martinvelez/w32evol]
|
5
|
+
class W32Evol
|
6
|
+
|
7
|
+
# By default the engine is distributed in the ext folder of this gem.
|
8
|
+
# This constant allows us to find the path to the engine executable.
|
9
|
+
ENGINE_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
10
|
+
BINARY = true # input is in binary format
|
11
|
+
NOSTDIN = true # does not accept standard input
|
12
|
+
PLATFORM = "windows" # windows program (requires wine in Linux)
|
13
|
+
|
14
|
+
attr_reader :options
|
15
|
+
|
16
|
+
# The user can instantiate this class by passing in a Hash of options
|
17
|
+
#
|
18
|
+
# Default options:
|
19
|
+
#
|
20
|
+
# By default the engine is distributed with this gem in the "ext" folder
|
21
|
+
# :command => File.join(ENGINE_ROOT,"ext","bin","w32evol.exe")
|
22
|
+
#
|
23
|
+
def initialize(options = {})
|
24
|
+
@name = self.class.to_s.downcase
|
25
|
+
@options = default_options.merge(options)
|
26
|
+
@command_options = generate_command_options
|
27
|
+
end
|
28
|
+
|
29
|
+
# this method obfuscates code and provides the obfuscated code, errors
|
30
|
+
# produced by the engine, and the engine's exit status
|
31
|
+
# Binary String or filename: input
|
32
|
+
# Binary String: output
|
33
|
+
# String: errors
|
34
|
+
# Integer: exitstatus
|
35
|
+
# obfuscate(input) => output, errors, exitstatus
|
36
|
+
def obfuscate(input)
|
37
|
+
output, errors, exitstatus = "", "", 0
|
38
|
+
|
39
|
+
# if input string contains the \xnn escape sequence,
|
40
|
+
# then we can assume that it is code
|
41
|
+
# For example, let input = "\x83\xC0\x0A"
|
42
|
+
# Then input.inspect => "\"\\x83\"".
|
43
|
+
# Thus, input.inspect =~ /\\x../ => 1
|
44
|
+
if (input.inspect =~ /\\x.*/) >= 0
|
45
|
+
infile = Tempfile.open(["#{@name}_in",'.bin']) do |f|
|
46
|
+
f.binmode
|
47
|
+
f.syswrite input
|
48
|
+
f.path
|
49
|
+
end
|
50
|
+
else
|
51
|
+
raise("#{input}: File does not exists or is not readable") \
|
52
|
+
unless File.exist?(input) and File.readable?(input)
|
53
|
+
end
|
54
|
+
|
55
|
+
outfile = Tempfile.open(["#{@name}_out",'.bin']) {|f| f.path }
|
56
|
+
return obfuscate_inner(infile, outfile)
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
# This method defines the default options in a Hash
|
61
|
+
#
|
62
|
+
# By default, the engine is expected to be in the "ext" folder.
|
63
|
+
#
|
64
|
+
def default_options
|
65
|
+
{
|
66
|
+
# By default the engine is in the ext folder of this gem
|
67
|
+
# This assumes that the wine command in in your PATH
|
68
|
+
:command => File.join(ENGINE_ROOT,"ext","#{@name}.exe")
|
69
|
+
}
|
70
|
+
end
|
71
|
+
|
72
|
+
# This method converts the options Hash into a string of flags for the
|
73
|
+
# command line call.
|
74
|
+
#
|
75
|
+
# Example output:
|
76
|
+
# "--x cpp --x iso --x motif --x posix2 --x stl --x unix95 --x xpg4"
|
77
|
+
def generate_command_options
|
78
|
+
command_options = ""
|
79
|
+
@options.each do |key, value|
|
80
|
+
if key.to_s != "command"
|
81
|
+
if value.kind_of?(Array)
|
82
|
+
value.each{|val| command_options += "#{key} #{val} "}
|
83
|
+
elsif
|
84
|
+
command_options += "#{key} #{value} "
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
command_options.rstrip
|
89
|
+
end
|
90
|
+
|
91
|
+
# This method obfuscate the code in infile and stores in outfile
|
92
|
+
#
|
93
|
+
# It is used for engines with a command line interface which requires an input
|
94
|
+
# file name, and an output file name.
|
95
|
+
def obfuscate_inner(infile, outfile)
|
96
|
+
# This engine does not output to stderr, it only returns an exit code if it
|
97
|
+
# fails.
|
98
|
+
output, errors, exitstatus = "", "", 0
|
99
|
+
cmd = "#{@options[:command]} #{infile} #{outfile}"
|
100
|
+
cmd.insert(0, "wine ") if (PLATFORM == 'windows' and RUBY_PLATFORM =~ /linux/)
|
101
|
+
system(cmd)
|
102
|
+
exitstatus = $?.exitstatus
|
103
|
+
if exitstatus == 0 # if engine success
|
104
|
+
f = File.new(outfile)
|
105
|
+
output = f.sysread(f.size)
|
106
|
+
f.close
|
107
|
+
end
|
108
|
+
return output, errors, exitstatus
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'w32evol'
|
3
|
+
|
4
|
+
class TestW32Evol < MiniTest::Unit::TestCase
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@engine = W32Evol.new
|
8
|
+
@input = "\x83\xC0\x0A"
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_obfuscate
|
12
|
+
output, errors, status = @engine.obfuscate(@input)
|
13
|
+
assert_equal "\x81\xC0\x0A\x00\x00\x00", output
|
14
|
+
assert_equal "", errors
|
15
|
+
assert_equal 0, status
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
metadata
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: w32evol_ruby
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Martin Velez
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2012-01-31 00:00:00 -08:00
|
18
|
+
default_executable:
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description: Provides a Ruby wrapper for the w32evol obfuscation engine
|
22
|
+
email: mvelez999@gmail.com
|
23
|
+
executables: []
|
24
|
+
|
25
|
+
extensions: []
|
26
|
+
|
27
|
+
extra_rdoc_files: []
|
28
|
+
|
29
|
+
files:
|
30
|
+
- lib/w32evol.rb
|
31
|
+
- ext/w32evol.exe
|
32
|
+
- examples/in.bin
|
33
|
+
- examples/example.rb
|
34
|
+
- test/test_w32evol.rb
|
35
|
+
- README.rdoc
|
36
|
+
has_rdoc: true
|
37
|
+
homepage: http://bitbucket.org/martinvelez/w32evol
|
38
|
+
licenses: []
|
39
|
+
|
40
|
+
post_install_message:
|
41
|
+
rdoc_options: []
|
42
|
+
|
43
|
+
require_paths:
|
44
|
+
- lib
|
45
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
46
|
+
none: false
|
47
|
+
requirements:
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
segments:
|
51
|
+
- 0
|
52
|
+
version: "0"
|
53
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
segments:
|
59
|
+
- 0
|
60
|
+
version: "0"
|
61
|
+
requirements: []
|
62
|
+
|
63
|
+
rubyforge_project:
|
64
|
+
rubygems_version: 1.3.7
|
65
|
+
signing_key:
|
66
|
+
specification_version: 3
|
67
|
+
summary: A Ruby wrapper for the w32evol obfuscation engine
|
68
|
+
test_files: []
|
69
|
+
|