#!/usr/bin/ruby $:.unshift(File.join(File.dirname(__FILE__), '..', '..')) require 'test/unit' require 'rex/exploitation/opcodedb' require 'rex/socket' class Rex::Exploitation::OpcodeDb::UnitTest < Test::Unit::TestCase Klass = Rex::Exploitation::OpcodeDb::Client SrvPort = 60000 def test_meta_types srv_cli begin proc_req_resp(%q{1foo2dog}) mt = @r.meta_types assert_kind_of(Array, mt) assert_equal(2, mt.length) assert_equal(1, mt[0].id) assert_equal("foo", mt[0].name) assert_equal(2, mt[1].id) assert_equal("dog", mt[1].name) ensure @s.close end end def test_groups srv_cli begin proc_req_resp(%q{47foo2dog}) mt = @r.groups assert_kind_of(Array, mt) assert_equal(2, mt.length) assert_equal(47, mt[0].id) assert_equal("foo", mt[0].name) assert_equal(2, mt[1].id) assert_equal("dog", mt[1].name) ensure @s.close end end def test_platforms srv_cli begin proc_req_resp(%q{12Windows XP SP2Windows Coolness512010}) osv = @r.platforms assert_kind_of(Array, osv) assert_equal(1, osv.length) assert_equal(12, osv[0].id) assert_equal("Windows XP SP2", osv[0].name) assert_equal("Windows Coolness", osv[0].desc) assert_equal(5, osv[0].maj_ver) assert_equal(1, osv[0].min_ver) assert_equal(2, osv[0].maj_patch_level) assert_equal(0, osv[0].min_patch_level) assert_equal(10, osv[0].modules) ensure @s.close end end def test_modules srv_cli begin proc_req_resp(%q{ 1 kernel32.dll 4 English 4 100 2 7 403242822 100000000 40000 text 3228094 4000 true true false FoolFunction 3242344 5 FoolFunctionExport 32423445 51 }) m = @r.modules assert_kind_of(Array, m) assert_equal(1, m[0].id) assert_equal("kernel32.dll", m[0].name) assert_equal(4, m[0].locale.id) assert_equal("English", m[0].locale.name) assert_equal(4, m[0].maj_maj_ver) assert_equal(100, m[0].maj_min_ver) assert_equal(2, m[0].min_maj_ver) assert_equal(7, m[0].min_min_ver) assert_equal(403242822, m[0].timestamp.to_i) assert_equal(100000000, m[0].base_address) assert_equal(40000, m[0].image_size) assert_kind_of(Array, m[0].segments) assert_equal("text", m[0].segments[0].type) assert_equal(3228094, m[0].segments[0].base_address) assert_equal(4000, m[0].segments[0].size) assert_equal(true, m[0].segments[0].writable) assert_equal(true, m[0].segments[0].readable) assert_equal(false, m[0].segments[0].executable) assert_kind_of(Array, m[0].imports) assert_equal("FoolFunction", m[0].imports[0].name) assert_equal(3242344, m[0].imports[0].address) assert_equal(5, m[0].imports[0].ordinal) assert_kind_of(Array, m[0].exports) assert_equal("FoolFunctionExport", m[0].exports[0].name) assert_equal(32423445, m[0].exports[0].address) assert_equal(51, m[0].exports[0].ordinal) ensure @s.close end end def test_locales srv_cli begin proc_req_resp(%q{ 4 English 5 French }) l = @r.locales assert_kind_of(Array, l) assert_equal(2, l.length) assert_equal(4, l[0].id) assert_equal("English", l[0].name) assert_equal(5, l[1].id) assert_equal("French", l[1].name) ensure @s.close end end def test_search srv_cli begin proc_req_resp(%q{ 400 34242324 4 jmp esp 40 reg }) o = @r.search assert_kind_of(Array, o) assert_equal(1, o.length) assert_equal(400, o[0].id) assert_equal(34242324, o[0].address) assert_equal(4, o[0].type.id) assert_equal("jmp esp", o[0].type.name) assert_equal(40, o[0].group.id) assert_equal("reg", o[0].group.name) ensure @s.close end end def test_statistics srv_cli begin proc_req_resp(%q{ 40 50 60 70 80 90 100 110 120 }) s = @r.statistics assert_equal(40, s.modules) assert_equal(50, s.opcodes) assert_equal(60, s.opcode_types) assert_equal(70, s.platforms) assert_equal(80, s.architectures) assert_equal(90, s.module_segments) assert_equal(100, s.module_imports) assert_equal(110, s.module_exports) assert_equal(120, s.last_update.to_i) ensure @s.close end end protected def srv_cli @r = Klass.new('127.0.0.1', SrvPort) @s = Rex::Socket::TcpServer.create( 'LocalHost' => '127.0.0.1', 'LocalPort' => SrvPort) end def proc_req_resp(buf) thr = Thread.new { cli = @s.accept @buffer = cli.get cli.put("HTTP/1.0 200 OK\r\nConnection: close\r\n\r\n#{buf}") cli.close } end end