查看: 4286|回复: 8

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

[复制链接]
梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

发表于 2017-9-28 21:21:03 | 显示全部楼层 |阅读模式

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

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

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

[pre lang="cpp"]#include <windows.h>

using namespace std;
typedef int(*RGSSEval)(const char* pScripts);
static RGSSEval pRGSSEval = NULL;
static HMODULE hRgssCore = NULL;

extern "C" {
        __declspec(dllexport) void run(void);
}


void run() {
        hRgssCore = ::LoadLibraryA("RGSS103J.dll");
        pRGSSEval = (RGSSEval)::GetProcAddress(hRgssCore, "RGSSEval");
    // 这里是执行的代码
        pRGSSEval("p 'hello, rgss!'");
}[/pre]

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 网络脚本 *

老黄鸡

梦石
4
星屑
45692
在线时间
7947 小时
注册时间
2009-7-6
回帖
13335

MZ评测员RM创作大赛01组委会开拓者贵宾

发表于 2017-9-28 23:12:47 | 显示全部楼层
其实你可以直接拿到ruby内部的各类函数的地址……
RGSSEval毕竟在导出表里。

点评

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

使用道具 举报

梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

 楼主| 发表于 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 网络脚本 *
回复

使用道具 举报

梦石
0
星屑
1803
在线时间
133 小时
注册时间
2013-10-6
回帖
181
发表于 2019-4-15 15:27:40 | 显示全部楼层
DLL里面的常量也是明文,所以不加密还是比较难受

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

点评

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

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部