1

我正在尝试执行 HoneyC,该链接上的代码是:HoneyC Source Code。我已按照“自述”文档说明进行操作,其中说必须首先运行 UnitTest。

它说:“将 HoneyC 分发包解压到一个目录中,cd 进入该目录,然后执行 'ruby UnitTester.rb'。这将启动单元测试,执行一些基本的模块测试。(请注意,您需要有网络连接和直接传出访问端口 80 以使单元测试成功。)”

我正在使用 Ruby 版本 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]

*我以前从未使用过 Ruby 编程。

端口 80 似乎没问题......如果我运行命令 netstat 我得到:

:~$ netstat -tulnap (不是所有的进程都可以被识别,非拥有的进程信息不会显示,你必须是root才能看到它。) 活动的互联网连接(服务器和建立) Proto Recv-Q Send- Q 本地地址 外部地址 状态 PID/程序名称 tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:30800 0.0.0.0:*
LISTEN - tcp 0 0 0.0.0.0:80
0.0。 0.0:* 监听 - tcp 0 0 127.0.0.1:30900 0.0.0.0:* 监听 -
tcp 0 0 127.0.1.1:53 0.0.0.0:*
监听

但是,当我尝试运行 UnitTest 时出现以下错误:

:~/honeypot/honeyc-master$ ruby UnitTester.rb
/usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- HoneyCConfiguration (LoadError)
    from /usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from UnitTester.rb:39:in `block in suite'
    from /usr/lib/ruby/2.3.0/find.rb:49:in `block (2 levels) in find'
    from /usr/lib/ruby/2.3.0/find.rb:48:in `catch'
    from /usr/lib/ruby/2.3.0/find.rb:48:in `block in find'
    from /usr/lib/ruby/2.3.0/find.rb:43:in `each'
    from /usr/lib/ruby/2.3.0/find.rb:43:in `find'
    from UnitTester.rb:29:in `suite'
    from /usr/lib/ruby/vendor_ruby/test/unit/ui/testrunner.rb:12:in `initialize'
    from /usr/lib/ruby/vendor_ruby/test/unit/ui/console/testrunner.rb:38:in `initialize'
    from /usr/lib/ruby/vendor_ruby/test/unit/ui/testrunnerutilities.rb:24:in `new'
    from /usr/lib/ruby/vendor_ruby/test/unit/ui/testrunnerutilities.rb:24:in `run'
    from UnitTester.rb:54:in `<main>'

单元测试的红宝石代码是:

 require 'test/unit/testsuite'
 require 'test/unit/ui/console/testrunner'
 require 'find'

module Kernel
  def get_class_for_name(name, objects = [Object])
    #STDERR.puts name.to_s
    return nil if objects.size == 0
    object = objects.shift
    object.constants.each do |constant_name|
      real_object = object.const_get(constant_name)
      case real_object
      when Class
    return real_object if constant_name == name
      when Module
    objects << real_object
      end
    end
    return get_class_for_name(name, objects)
  end
end

class UnitTester
   def self.suite
    exceptions = ["HoneyC","UnitTester"]
    suite = Test::Unit::TestSuite.new("HoneyC Unit Tests")

    #find all rb files
    Find.find(".") do |full_file_name|
        if /.rb/ =~ full_file_name and !(/.svn/ =~ full_file_name)
            /.*\// =~ full_file_name
            path = $&[2..$&.length]
            classname = full_file_name[$&.length..-4]

            if !exceptions.index(classname)
                #assume test is under classname + "Test"
                #run unit test on them except on the exceptions

                require path + classname
                classname.sub!(/\.tab/,"") #silly replacement for the snortruleparser, since this is an automatically generated class.
                unit_test = get_class_for_name(classname + "Test")
                if(unit_test==nil)
                    STDERR.puts "No unit test defined for class " + classname + "."
                else
                    suite << unit_test.suite    
                end
            end
        end
    end

    return suite
   end
 end
 Test::Unit::UI::Console::TestRunner.run(UnitTester)

我应该怎么做才能让这个蜜罐运行?

4

1 回答 1

1

该代码库的最新提交是从 2007 年开始的(并且正在将其转移到 git,我不确定原始的颠覆提交是否更早)。从那时起,Ruby 已经取得了长足的进步,而您正在运行的 UnitTester 依赖于一些多年来发生变化的元编程行为。它试图查看源树中的所有 ruby​​ 文件以加载它们以查找测试,但它的做法在现代 rubies 中不起作用。至少有两件事是错误的:

  1. 从 2009 年发布的 ruby​​ 1.9 开始,当前目录不再(默认情况下)在加载路径中,因此当您尝试require在当前目录中定义的模块/类时,它会失败。他们需要切换到require_relative为什么 Ruby 1.9.2 从 LOAD_PATH 中删除“。”,还有什么替代方案?

  2. 代码库正在做一些非常奇怪的事情(但可能曾经有必要),它如何爬取对象树以试图找出已定义的类/模块(https://github.com/honeynet/honeyc/blob/master/UnitTester .rb#L10)。这在现代红宝石中无法正常工作。

您可以让 UnitTests 与 ruby​​ 1.8.7 一起运行,但请注意,自 2017 年 4 月 1 日起不再支持该 ruby​​ 版本。单元测试大部分都通过了,除了一些正在查询不再存在的 Web 服务。

我认为如果不进行大量工作升级它,你就不能真正使用这个代码库,这在这里可能是题外话。

于 2019-07-16T20:56:00.170 回答