Project1

标题: 将部分ruby代码隐藏在dll里 [打印本页]

作者: guoxiaomi    时间: 2017-9-28 21:21
标题: 将部分ruby代码隐藏在dll里
阅读了原来论坛上关于第三方 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()
复制代码

作者: fux2    时间: 2017-9-28 23:12
其实你可以直接拿到ruby内部的各类函数的地址……
RGSSEval毕竟在导出表里。
作者: guoxiaomi    时间: 2017-9-29 18:33
本帖最后由 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. ```
复制代码



作者: 不死鸟之翼    时间: 2019-4-15 15:27
DLL里面的常量也是明文,所以不加密还是比较难受

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




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1