执行HoneyC时出错-`require':无法加载此类文件

时间:2019-07-16 14:16:40

标签: ruby linux honeypot

我正在尝试执行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用户即可查看全部内容。)活动的Internet连接(服务器和   已建立)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:* LISTEN-tcp 0 0 127.0.0.1:30900 0.0.0.0:* LISTEN-
  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)

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

1 个答案:

答案 0 :(得分:1)

此代码库上的最新提交来自2007年(并且正在将其传输到git,我不确定原始的subversion提交是否更旧)。从那时起,Ruby已经走了很长一段路,而您正在运行的UnitTester依赖于多年来发生的某些元编程行为。它正在尝试查看源代码树中的所有ruby文件,以加载它们以查找测试,但是这样做的方式在现代ruby中不起作用。至少有两件事是错误的:

  1. 从2009年发布的ruby 1.9开始,当前目录(默认情况下)不再位于加载路径中,因此,当您尝试require时在当前目录中定义的模块/类它会失败。他们需要切换到require_relativeWhy does Ruby 1.9.2 remove "." from LOAD_PATH, and what's the alternative?

  2. 代码库在爬网对象树以试图找出已经定义了哪些类/模块(https://github.com/honeynet/honeyc/blob/master/UnitTester.rb#L10)方面做得很奇怪(但也许有必要)。这在现代红宝石中无法正常工作。

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

我认为如果不进行大量工作就可以真正使用此代码库,而这可能不在本文的讨论范围之内。