[自动化-脚本]002.cocos2dx-lua lua代码windows加密批处理
在开发软件的时候,我们都会在项目上线时候对代码进行加密,用来防止被不法分子盗走牟利。不同的语言有不同的加密方式,比较出名的有加壳,代码混淆等。在Lua开发cocos2dx的时候,框架会有提供加密的脚本。下面我说说加密windows的步骤
1.要知道要加密的源码的存放路径,并指定备份路径
2.把代码拷贝到备份路径
3.对所有的脚本进行去bom处理
4.用php命令compile_scripts.php进行加密处理。
根据以上的四点,我们下面贴出UTF8 去bom的代码和加密的整体代码
1.UTF-8
#! /usr/bin/python # -*- coding: utf-8 -*- import os import sys import codecs def convert(dirname, filename): if os.path.splitext(filename)[1] in ['.txt', '.py,', '.lua', '.sh']: path = os.path.join(dirname, filename) print 'converting %s'%(path) f = open(path, 'rb') content = f.read(3) if content != '\xEF\xBB\xBF': print '%s is not utf-8 bom'%(path) return content = f.read() f.close() f = open(path, 'wb') f.write(content) f.close() print 'convert %s finish'%(path) def useage(): if len(sys.argv) == 1: print 'useage: utf8 file or dir...' return True def exist_error(f): if not os.path.exists(f): print 'error: %s is not exist'%(f) return True def main(): if useage(): return for f in sys.argv[1:]: if exist_error(f): break if os.path.isdir(f): for root, dirs, files in os.walk(f): for i in files: convert(root, i) else: convert('', f) if __name__ == '__main__': main()
2.compile_scripts.php
<?php define('DS', DIRECTORY_SEPARATOR); define('LUAJIT', true); class LuaPackager { private $quiet = false; private $packageName = ''; private $rootdir = ''; private $rootdirLength = 0; private $suffixName = 'zip'; private $files = array(); private $modules = array(); private $excludes = array(); function __construct($config) { $this->quiet = $config['quiet']; $this->rootdir = realpath($config['srcdir']); $this->rootdirLength = strlen($this->rootdir) + 1; $this->packageName = trim($config['packageName'], '.'); $this->suffixName = $config['suffixName']; $this->excludes = $config['excludes']; if (!empty($this->packageName)) { $this->packageName = $this->packageName . '.'; } } function dumpZip($outputFileBasename) { $this->files = array(); $this->modules = array(); if (!$this->quiet) { print("compile script files\n"); } $this->compile(); if (empty($this->files)) { printf("error.\nERROR: not found script files in %s\n", $this->rootdir); return; } $zipFilename = $outputFileBasename . '.' . $this->suffixName; $zip = new ZipArchive(); if ($zip->open($zipFilename, ZIPARCHIVE::OVERWRITE | ZIPARCHIVE::CM_STORE)) { if (!$this->quiet) { printf("create ZIP bundle file: %s\n", $zipFilename); } foreach ($this->modules as $module) { $zip->addFromString($module['moduleName'], $module['bytes']); } $zip->close(); if (!$this->quiet) { printf("done.\n\n"); } } if (!$this->quiet) { print <<<EOT ### HOW TO USE ### 1. Add code to your lua script: CCLuaLoadChunksFromZip("${zipFilename}") EOT; } } function dump($outputFileBasename) { $this->files = array(); $this->modules = array(); if (!$this->quiet) { print("compile script files\n"); } $this->compile(); if (empty($this->files)) { printf("error.\nERROR: not found script files in %s\n", $this->rootdir); return; } $headerFilename = $outputFileBasename . '.h'; if (!$this->quiet) { printf("create C header file: %s\n", $headerFilename); } file_put_contents($headerFilename, $this->renderHeaderFile($outputFileBasename)); $sourceFilename = $outputFileBasename . '.c'; if (!$this->quiet) { printf("create C source file: %s\n", $sourceFilename); } file_put_contents($sourceFilename, $this->renderSourceFile($outputFileBasename)); if (!$this->quiet) { printf("done.\n\n"); } $outputFileBasename = basename($outputFileBasename); print <<<EOT ### HOW TO USE ### 1. Add code to AppDelegate.cpp: extern "C" { #include "${outputFileBasename}.h" } 2. Add code to AppDelegate::applicationDidFinishLaunching() CCScriptEngineProtocol* pEngine = CCScriptEngineManager::sharedManager()->getScriptEngine(); luaopen_${outputFileBasename}(pEngine->getLuaState()); pEngine->executeString("require(\"main\")"); EOT; } private function compile() { if (file_exists($this->rootdir) && is_dir($this->rootdir)) { $this->files = $this->getFiles($this->rootdir); } foreach ($this->files as $path) { $filename = substr($path, $this->rootdirLength); $fi = pathinfo($filename); if ($fi['extension'] != 'lua') continue; $basename = ltrim($fi['dirname'] . DS . $fi['filename'], '/\\.'); $moduleName = $this->packageName . str_replace(DS, '.', $basename); $found = false; foreach ($this->excludes as $k => $v) { if (substr($moduleName, 0, strlen($v)) == $v) { $found = true; break; } } if ($found) continue; if (!$this->quiet) { printf(' compile module: %s...', $moduleName); } $bytes = $this->compileFile($path); if ($bytes == false) { print("error.\n"); } else { if (!$this->quiet) { print("ok.\n"); } $bytesName = 'lua_m_' . strtolower(str_replace('.', '_', $moduleName)); $this->modules[] = array( 'moduleName' => $moduleName, 'bytesName' => $bytesName, 'functionName' => 'luaopen_' . $bytesName, 'basename' => $basename, 'bytes' => $bytes, ); } } } private function getFiles($dir) { $files = array(); $dir = rtrim($dir, "/\\") . DS; $dh = opendir($dir); if ($dh == false) { return $files; } while (($file = readdir($dh)) !== false) { if ($file{0} == '.') { continue; } $path = $dir . $file; if (is_dir($path)) { $files = array_merge($files, $this->getFiles($path)); } elseif (is_file($path)) { $files[] = $path; } } closedir($dh); return $files; } private function compileFile($path) { $tmpfile = $path . '.bytes'; if (file_exists($tmpfile)) unlink($tmpfile); if (LUAJIT) { $command = sprintf('luajit -b -s "%s" "%s"', $path, $tmpfile); } else { $command = sprintf('luac -o "%s" "%s"', $tmpfile, $path); } passthru($command); if (!file_exists($tmpfile)) return false; $bytes = file_get_contents($tmpfile); unlink($tmpfile); return $bytes; } private function renderHeaderFile($outputFileBasename) { $headerSign = '__LUA_MODULES_' . strtoupper(md5(time())) . '_H_'; $outputFileBasename = basename($outputFileBasename); $contents = array(); $contents[] = <<<EOT /* ${outputFileBasename}.h */ #ifndef ${headerSign} #define ${headerSign} #if __cplusplus extern "C" { #endif #include "lua.h" void luaopen_${outputFileBasename}(lua_State* L); #if __cplusplus } #endif EOT; $contents[] = '/*'; foreach ($this->modules as $module) { $contents[] = sprintf('int %s(lua_State* L);', $module['functionName']); } $contents[] = '*/'; $contents[] = <<<EOT #endif /* ${headerSign} */ EOT; return implode("\n", $contents); } private function renderSourceFile($outputFileBasename) { $outputFileBasename = basename($outputFileBasename); $contents = array(); $contents[] = <<<EOT /* ${outputFileBasename}.c */ #include "lua.h" #include "lauxlib.h" #include "${outputFileBasename}.h" EOT; foreach ($this->modules as $module) { $contents[] = sprintf('/* %s, %s.lua */', $module['moduleName'], $module['basename']); $contents[] = sprintf('static const unsigned char %s[] = {', $module['bytesName']); // $contents[] = $this->encodeBytes($module['bytes']); $contents[] = $this->encodeBytesFast($module['bytes']); $contents[] = '};'; $contents[] = ''; } $contents[] = ''; foreach ($this->modules as $module) { $functionName = $module['functionName']; $bytesName = $module['bytesName']; $basename = $module['basename']; $contents[] = <<<EOT int ${functionName}(lua_State *L) { int arg = lua_gettop(L); luaL_loadbuffer(L, (const char*)${bytesName}, sizeof(${bytesName}), "${basename}.lua"); lua_insert(L,1); lua_call(L,arg,1); return 1; } EOT; } $contents[] = ''; $contents[] = "static luaL_Reg ${outputFileBasename}_modules[] = {"; foreach ($this->modules as $module) { $contents[] = sprintf(' {"%s", %s},', $module["moduleName"], $module["functionName"]); } $contents[] = <<<EOT {NULL, NULL} }; void luaopen_${outputFileBasename}(lua_State* L) { luaL_Reg* lib = ${outputFileBasename}_modules; for (; lib->func; lib++) { lua_getglobal(L, "package"); lua_getfield(L, -1, "preload"); lua_pushcfunction(L, lib->func); lua_setfield(L, -2, lib->name); lua_pop(L, 2); } } EOT; return implode("\n", $contents); } private function encodeBytes($bytes) { $len = strlen($bytes); $contents = array(); $offset = 0; $buffer = array(); while ($offset < $len) { $buffer[] = ord(substr($bytes, $offset, 1)); if (count($buffer) == 16) { $contents[] = $this->encodeBytesBlock($buffer); $buffer = array(); } $offset++; } if (!empty($buffer)) { $contents[] = $this->encodeBytesBlock($buffer); } return implode("\n", $contents); } private function encodeBytesFast($bytes) { $len = strlen($bytes); $output = array(); for ($i = 0; $i < $len; $i++) { $output[] = sprintf('%d,', ord($bytes{$i})); } return implode('', $output); } private function encodeBytesBlock($buffer) { $output = array(); $len = count($buffer); for ($i = 0; $i < $len; $i++) { $output[] = sprintf('%d,', $buffer[$i]); } return implode('', $output); } } function help() { echo <<<EOT usage: php compile_scripts.php [options] dirname output_filename options: -zip package to zip -suffix package file extension name -p prefix package name -x exclude packages, eg: -x framework.server, framework.tests -q quiet EOT; } if ($argc < 3) { help(); exit(1); } array_shift($argv); $config = array( 'packageName' => '', 'excludes' => array(), 'srcdir' => '', 'outputFileBasename' => '', 'zip' => false, 'suffixName' => 'zip', 'quiet' => false, ); do { if ($argv[0] == '-p') { $config['packageName'] = $argv[1]; array_shift($argv); } else if ($argv[0] == '-x') { $excludes = explode(',', $argv[1]); foreach ($excludes as $k => $v) { $v = trim($v); if (empty($v)) { unset($excludes[$k]); } else { $excludes[$k] = $v; } } $config['excludes'] = $excludes; array_shift($argv); } else if ($argv[0] == '-q') { $config['quiet'] = true; } else if ($argv[0] == '-zip') { $config['zip'] = true; } else if ($argv[0] == '-suffix') { $config['suffixName'] = $argv[1]; array_shift($argv); } else if ($config['srcdir'] == '') { $config['srcdir'] = $argv[0]; } else { $config['outputFileBasename'] = $argv[0]; } array_shift($argv); } while (count($argv) > 0); $packager = new LuaPackager($config); if ($config['zip']) { $packager->dumpZip($config['outputFileBasename']); } else { $packager->dump($config['outputFileBasename']); }
3.加密脚本
@echo on set _P_=bbframework set _T_=script_bak cd .. mkdir %_T_% mkdir %_T_%\scripts mkdir %_P_%\updatescripts echo "Copy Scripts to bak floder" xcopy /E %_P_%\scripts %_T_%\scripts cd %_P_% echo "UTF-8 transition" python ..\bin\utf8\main.py scripts echo "Handle <<updatescripts>> Begin.." move /Y scripts/app updatescripts/app php ..\bin\__lib__\compile_scripts.php -zip -suffix "bin" updatescripts res\update pause
以上就是windows上对lua代码进行加密的步骤
本站文章为 宝宝巴士 SD.Team 原创,转载务必在明显处注明:(作者官方网站: 宝宝巴士 )
转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4988378.html
比大多数人的努力程度之低,根本轮不到拼天赋...
宝宝巴士 SD.Team