性格いい人が優勝

Ruby1.9.3を使用しています。

ruby 1.9.3p551 (2014-11-13 revision 48407) [x86_64-linux]

たのしいRuby第4版8章の簡単なRubyをベースに質問します。

http://tanoshiiruby.github.io/4/list/#ch08

ソース(List 8.10 : hello_module.rb)
--
module HelloModule # module文
Version = "1.0" # 定数の定義

def hello(name) # メソッドの定義
puts "Hello, #{name}."
end

module_function :hello # helloをモジュール関数として公開する
end

p HelloModule::Version #=> "1.0"
HelloModule.hello("Alice") #=> Hello, Alice.

include HelloModule # インクルードしてみる
p Version #=> "1.0"
hello("Alice") #=> Hello, Alice.
--

普通に実行すると

[root@host]# ruby hello.rb
"1.0"
Hello, Alice.
"1.0"
Hello, Alice.

と実行できますが、このソースを簡単な難読化ツールで読みづらくして実行すると

http://d.hatena.ne.jp/kurimura/20080824
--
def _(_)
r="''<<"+_.split("").map{|_|
_=_.ord;
return "~-_" if _==0
(["_"]*(_&3)+["__"]*(_>>2&3)+["___"]*(_>>4&3)+["____"]*(_>>6&3))*"+"
}*"<<"
"->{_=-~($$-$$);__=_<<_+_;___=_<<__;____=__<<__;%s}[]"%r
end
puts"->&_{_}[&:\"\#{#{_"method"}}\"][$$,:\"\#{#{_"eval"}}\"][#{_([*$<]*"")}]"
--
→これをconver-kigou.rbで保存する

難読化実行コマンド

cat hello.rb | ruby convert-kigou.rb > hello.nandoku

[root@host ]# ruby hello.nandoku
"1.0"
Hello, Alice.
hello.nandoku:1:in `eval': undefined method `include' for 3081:Fixnum (NoMethodError)
from hello.nandoku:1:in `eval'
from hello.nandoku:1:in `[]'
from hello.nandoku:1:in `<main>'

と二つ目のincludeのところでエラーになります。

include HelloModule # インクルードしてみる

この部分なのは間違いないのですが、なぜできないのかがわかりません。
(じゃあシンプルなRuby実行すればいいじゃん。という話なのですがちょっとこれはクリアしたいんです。すいません)

eval と includeの相性が悪そうな気がしていますが、アドバイスをいただけると大変ありがたいです。

A 回答 (2件)

難読度は下がりますが、


convert-kigou.rbの最終行を以下に変更すれば良いかもしれません。


puts"->&_{_}[&:\"\#{#{_"method"}}\"][Object,:\"\#{#{_"eval"}}\"][#{_([*$<]*"")}]"


休み中の、良い頭の体操になりました。
    • good
    • 0

開発者に聞かないことにはねぇー。



リンク先のページでは、

>手持ちのRuby1.9の処理系だと動いたけどなぜ動くのか自分でもいまいち理解していない。

 ・・・なので、第三者には答えられないだろうと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!