设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3499|回复: 8
打印 上一主题 下一主题

[RMXP发布] 将部分ruby代码隐藏在dll里

[复制链接]

Lv5.捕梦者 (版主)

梦石
1
星屑
24004
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

跳转到指定楼层
1
发表于 2017-9-28 21:21:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
阅读了原来论坛上关于第三方 RGSS Player 的内容,终于用我贫瘠的 C++ 知识搞出了这个:

CPP 代码复制
  1. #include <windows.h>
  2.  
  3. using namespace std;
  4. typedef int(*RGSSEval)(const char* pScripts);
  5. static RGSSEval pRGSSEval = NULL;
  6. static HMODULE hRgssCore = NULL;
  7.  
  8. extern "C" {
  9.         __declspec(dllexport) void run(void);
  10. }
  11.  
  12.  
  13. void run() {
  14.         hRgssCore = ::LoadLibraryA("RGSS103J.dll");
  15.         pRGSSEval = (RGSSEval)::GetProcAddress(hRgssCore, "RGSSEval");
  16.     // 这里是执行的代码
  17.         pRGSSEval("p 'hello, rgss!'");
  18. }


g++ 编译通过,可以在脚本里这样调用
  1. # 假设保存成 hello.dll
  2. Hello = Win32API.new('hello.dll', 'run' , ['v'], 'v')
  3. Hello.call()
复制代码

点评

学习了⊙▽⊙  发表于 2017-9-29 12:22
其实这时候已经加载了,可以用GetModuleHandle("RGSS103J")而不是增加一次引用计数  发表于 2017-9-29 09:00
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
42513
在线时间
7608 小时
注册时间
2009-7-6
帖子
13506

开拓者贵宾

2
发表于 2017-9-28 23:12:47 | 只看该作者
其实你可以直接拿到ruby内部的各类函数的地址……
RGSSEval毕竟在导出表里。

点评

讲道理现在懂了……  发表于 2019-12-31 06:34
虽然现在还不懂这段话的意思……暂时还是不求甚解好啦⊙▽⊙  发表于 2017-9-29 01:50
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
24004
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

3
 楼主| 发表于 2017-9-29 18:33:48 | 只看该作者
本帖最后由 guoxiaomi 于 2017-9-29 18:35 编辑

代码高亮被玩坏了。。。
  1. f = File.open('code.cpp', 'w')
  2. f << '#include <windows.h>

  3. using namespace std;
  4. typedef int(*RGSSEval)(const char* pScripts);
  5. static HMODULE hRgssCore = GetModuleHandle("RGSS103J");
  6. static RGSSEval pRGSSEval = (RGSSEval)::GetProcAddress(hRgssCore, "RGSSEval");

  7. extern "C" {
  8. '

  9. DATA.each_line do |l|
  10.         if l =~ /^```(\s*\w+)/
  11.                 fun_name = $1.strip
  12.                 f << "\t__declspec(dllexport) void " << fun_name << "(void);\n"
  13.         end
  14. end

  15. f << "}\n\n"

  16. DATA.rewind

  17. fun_name = nil
  18. DATA.each_line do |l|
  19.         if l =~ /^```(\s*\w+)/
  20.                 fun_name = $1.strip
  21.                 f << "\nvoid " << fun_name << "() {\n" << "\tpRGSSEval(\n"
  22.         elsif l =~ /^```/
  23.                 f << "\t);\n}\n"
  24.                 fun_name = nil
  25.         elsif fun_name
  26.                 ls = l.rstrip
  27.                         .gsub('"', '\\"')
  28.                 f << "\t" << '"' << ls << '    \n"' << "\n"
  29.         end
  30. end

  31. f.close

  32. # exec "g++ -shared -o code.dll code.cpp"

  33. __END__
  34. ``` fun
  35. class A
  36.         attr_accessor :a
  37.         def initialize(a)
  38.                 @a = "a"
  39.         end
  40. end
  41. ```

  42. ``` fun2
  43. a = A.new(10)
  44. p a.a
  45. ```
复制代码


熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1803
在线时间
133 小时
注册时间
2013-10-6
帖子
193
4
发表于 2019-4-15 15:27:40 | 只看该作者
DLL里面的常量也是明文,所以不加密还是比较难受

不过DLL里面不一定全放代码的,有一种DLL叫资源DLL)也可以被多个进程共享加载

点评

已经放弃对加密的研究了……以后全用默认加密(  发表于 2019-4-15 16:36
←你看到一只经常潜水的萌新。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-12-4 02:28

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表