cocos2d-x 3.6 lua文件加密

前端之家收集整理的这篇文章主要介绍了cocos2d-x 3.6 lua文件加密前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

cocos2d-x 3.6 lua 文件加密

这里没有采用通用的加密方法,使用了类似于图片加密的方法,对文件中的每个字符进行加密,读取的时候,根据加密的key值进行解密。

  1. 找到引擎加载Lua文件的接口cocos2dx_lua_loader
  2. 添加解密代码
  1. if (chunk != NULL&&chunkSize > 0)
  2. {
  3. for (int i = 0; i < chunkSize; i++)
  4. {
  5. chunk[i] = chunk[i] - 99;//99是用来加密的key值
  6. }
  7. }

更改后的源码

  1. #include "Cocos2dxLuaLoader.h"
  2. #include <string>
  3. #include <algorithm>
  4.  
  5. #include "CCLuaStack.h"
  6. #include "CCLuaEngine.h"
  7.  
  8. using namespace cocos2d;
  9.  
  10. extern "C"
  11. {
  12. int cocos2dx_lua_loader(lua_State *L)
  13. {
  14. static const std::string BYTECODE_FILE_EXT = ".luac";
  15. static const std::string NOT_BYTECODE_FILE_EXT = ".lua";
  16.  
  17. std::string filename(luaL_checkstring(L,1));
  18. size_t pos = filename.rfind(BYTECODE_FILE_EXT);
  19. if (pos != std::string::npos)
  20. {
  21. filename = filename.substr(0,pos);
  22. }
  23. else
  24. {
  25. pos = filename.rfind(NOT_BYTECODE_FILE_EXT);
  26. if (pos == filename.length() - NOT_BYTECODE_FILE_EXT.length())
  27. {
  28. filename = filename.substr(0,pos);
  29. }
  30. }
  31.  
  32. pos = filename.find_first_of(".");
  33. while (pos != std::string::npos)
  34. {
  35. filename.replace(pos,1,"/");
  36. pos = filename.find_first_of(".");
  37. }
  38.  
  39. // search file in package.path
  40. unsigned char* chunk = nullptr;
  41. ssize_t chunkSize = 0;
  42. std::string chunkName;
  43. FileUtils* utils = FileUtils::getInstance();
  44.  
  45. lua_getglobal(L,"package");
  46. lua_getfield(L,-1,"path");
  47. std::string searchpath(lua_tostring(L,-1));
  48. lua_pop(L,1);
  49. size_t begin = 0;
  50. size_t next = searchpath.find_first_of(";",0);
  51.  
  52. do
  53. {
  54. if (next == std::string::npos)
  55. next = searchpath.length();
  56. std::string prefix = searchpath.substr(begin,next);
  57. if (prefix[0] == '.' && prefix[1] == '/')
  58. {
  59. prefix = prefix.substr(2);
  60. }
  61.  
  62. pos = prefix.find("?.lua");
  63. chunkName = prefix.substr(0,pos) + filename + BYTECODE_FILE_EXT;
  64. if (utils->isFileExist(chunkName))
  65. {
  66. chunk = utils->getFileData(chunkName.c_str(),"rb",&chunkSize);
  67. if (chunk != NULL&&chunkSize > 0)
  68. {
  69. for (int i = 0; i < chunkSize; i++)
  70. {
  71. chunk[i] = chunk[i] - 99;//99是用来加密的key值
  72. }
  73. }
  74. break;
  75. }
  76. else
  77. {
  78. chunkName = prefix.substr(0,pos) + filename + NOT_BYTECODE_FILE_EXT;
  79. if (utils->isFileExist(chunkName))
  80. {
  81. chunk = utils->getFileData(chunkName.c_str(),&chunkSize);
  82. if (chunk != NULL&&chunkSize > 0)
  83. {
  84. for (int i = 0; i < chunkSize; i++)
  85. {
  86. chunk[i] = chunk[i] - 99;//99是用来加密的key值
  87. }
  88. }
  89. break;
  90. }
  91. }
  92.  
  93. begin = next + 1;
  94. next = searchpath.find_first_of(";",begin);
  95. } while (begin < (int)searchpath.length());
  96.  
  97. if (chunk)
  98. {
  99. LuaStack* stack = LuaEngine::getInstance()->getLuaStack();
  100. stack->luaLoadBuffer(L,(char*)chunk,(int)chunkSize,chunkName.c_str());
  101. free(chunk);
  102. }
  103. else
  104. {
  105. CCLOG("can not get file data of %s",chunkName.c_str());
  106. return 0;
  107. }
  108.  
  109. return 1;
  110. }
  111. }

注:测试ios,android,win32能正常使用。但是,不要对main.lua进行加密哦,他的载入,不是通过这里的代码的,在AppDelegate.cpp中能找到。

总结:

这里只是实现了简单的加密,真正的使用,不应该只是用一个Key,应该有多个key(我用的有将近20个),这样的话被破解的可能性应该会低一些。

猜你在找的Cocos2d-x相关文章