[自动化-脚本]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 != 'xEFxBBxBF':
			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
");
        }
        $this->compile();
        if (empty($this->files))
        {
            printf("error.
ERROR: not found script files in %s
", $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
", $zipFilename);
            }
            foreach ($this->modules as $module)
            {
                $zip->addFromString($module['moduleName'], $module['bytes']);
            }
            $zip->close();
            if (!$this->quiet)
            {
                printf("done.

");
            }
        }

        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
");
        }
        $this->compile();
        if (empty($this->files))
        {
            printf("error.
ERROR: not found script files in %s
", $this->rootdir);
            return;
        }

        $headerFilename = $outputFileBasename . '.h';
        if (!$this->quiet)
        {
            printf("create C header file: %s
", $headerFilename);
        }
        file_put_contents($headerFilename, $this->renderHeaderFile($outputFileBasename));

        $sourceFilename = $outputFileBasename . '.c';
        if (!$this->quiet)
        {
            printf("create C source file: %s
", $sourceFilename);
        }
        file_put_contents($sourceFilename, $this->renderSourceFile($outputFileBasename));

        if (!$this->quiet)
        {
            printf("done.

");
        }

        $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.
");
            }
            else
            {
                if (!$this->quiet)
                {
                    print("ok.
");
                }
                $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("
", $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("
", $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("
", $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 ..inutf8main.py scripts

echo "Handle <<updatescripts>> Begin.."
move /Y scripts/app updatescripts/app
php ..in\__lib__compile_scripts.php -zip -suffix "bin" updatescripts resupdate

pause

以上就是windows上对lua代码进行加密的步骤

 

本站文章为 宝宝巴士 SD.Team 原创,转载务必在明显处注明:(作者官方网站: 宝宝巴士 

转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4988378.html

原文地址:https://www.cnblogs.com/superdo/p/4988378.html