请问ruby读取.rb文件(比如controller,module等)读取、解释、执行的源代码在哪里?

找了半天没有找到,哪位大侠读过ruby的源代码,请指教下
是在c里面,还是在ruby的源码里面啊,具体哪几个文件,谢谢了

你是在Windows上部署么?你安装的Ruby 1.8.7是从哪里获取的?
要只换一个DLL(msvcrt-ruby187.dll)就达到目的的话,你用来构造Ruby 1.8.7的编译器要跟你安装的是兼容的才行。如果你下载的是官网的版本的话,那个应该是VC6编译的,于是你就最好不要用新的VC了……

修改load_file()的话,记得要保证它能正确加载原本正常的Ruby源文件,要在你加密过的文件里打上合适的标记,例如在文件开头的几个字节写入特定序列,不然你原本依赖的库就都用不了了。

楼主用的是什么版本的Ruby?想问的是什么意义上的“读取”
如果想问的是Ruby程序里某个.rb文件在什么地方加载了别的.rb文件,那么像require、load之类的方法都可以。

如果问的是Ruby解释器自身是在哪里读取和执行Ruby程序,那应该先看Ruby解释器的入口在哪里:main.c的main()函数是也。这里会初始化Ruby执行的环境,解析命令行参数,将参数中指定的Ruby脚本送到解析器去解析为抽象语法树,然后开始解释执行。

Ruby 1.8系的话,
require由eval.c里的rb_f_require()函数实现,load由同文件的rb_f_load()函数实现。真正执行load的是在ruby.c里的load_file_internal()函数。
负责将Ruby源码解析为抽象语法树的代码在parse.y中,是一个yacc系的解析器生成器的语法文件。
负责解释执行Ruby程序的代码在eval.c的rb_eval()函数里,通过遍历抽象语法树递归解释执行。

Ruby 1.9系的话,
rb_f_load()、rb_f_require()、rb_load_internal()等相关函数都在load.c里。
解析器仍然是在parse.y里。
然后compile.c会将该抽象语法树转换为字节码序列。
然后vm_*系列的文件会解释执行字节码序列。其中解释器的主循环位于vm_exec.c的vm_exec_core()函数,各个字节码指令的处理代码位于insns.def文件中。

修改了Ruby解释器自身的源码的话,部署程序的时候就得连这个定制的解释器一同部署了,大小会比单独部署.rb脚本大很多哦?楼主确定是希望这么做么?

要自行构造Ruby的话,

先安装subversion,使用svn从官网的代码仓库里签出Ruby 1.8.7的源码:
svn co http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8_7

然后,要构造Ruby 1.8.7,请到源码中平台对应的目录去查看相关的README文件。
例如说,在Windows上构造Ruby的话,可以查看源码中的win32\README.win32,根据说明一步步做就OK。依赖的工具和库可以从 http://sourceforge.net/projects/mingw/files/http://www.garbagecollect.jp/ruby/mswin32/en/documents/install.html 获取。可以用VC6或更高版本的Visual C++编译器,也可以用MinGW里的GCC来编译。
在Linux构造Ruby的话,直接在源码根目录用
autoconf
./configure
make
基本上就OK了。

这样构造出来的是整个Ruby的可执行文件、动态链接库与标准库。

简单的办法……反正我能想得出来的简单的办法要解起来也很简单,根本就达不到加密的意义。
要想不修改解释器,例如说你可以在你加了密的Ruby脚本里做个标记,然后monkey patch掉require和load,让它们先检查那个标记,有标记的就先解密,然后再交给原本的require和load。然这样做的话你的启动脚本肯定不能是加了密的,于是别人一下就能看到解密的算法了(因为进行monkey patch的那段代码必须是原本的Ruby解释器就能执行的)。
要是修改解释器的话,肯定是整个解释器一起build的,出来的就是静态链接、动态链接文件,还有可执行文件等。没办法单独把“读文件”的那部分功能build出来插入到现成的解释器里。

不得不说的是,本地加密很难防住破解,只要你的软件本身有足够的价值让别人有兴趣去这么做。有心人想去跟踪你的程序找出解密算法和密钥都不是难事,只要解密所需的信息都在本地。关键是破解的成本,你可以通过提高破解的成本来阻挠(而不是阻止)别人破解。
要想简单的话,用类似rubyscript2exe把Ruby解释器、需要的库文件以及你的脚本打包成一个可执行文件,再用MoleBox之类的保护工具再打一次包……之类的做法对稳定性肯定是有影响的,谨慎使用。
试试用混淆器也行,搜Ruby obfuscator看看喜欢用哪个吧。

Ruby 1.8.7读文件的地方确实是在load_file()里,我下午在自己机上看的是Ruby_1_8分支上的,跟Ruby_1_8_7分支的代码不一样orz 抱歉