def outputCodeFile(filesDict, mixDir, appDir): cHeader = MixCode.randomClassHeader(1, 48) randDir = MixRandUtils.randomDir(1, 4) claFile = cHeader.className + '.h' fImport = appDir + '/' + randDir + claFile # "include xxx/xxx/xx.h" fParent = mixDir + os.sep + appDir + os.sep + randDir MixFileUtils.tryMkdir(fParent) MixFileUtils.outputText(fParent + claFile, MixCode.buildClassHeader(cHeader)) filesDict[fImport] = cHeader
def makePackFiles(mixParams): ignors = ['.mp3'] dir = mixParams.assetsSrc count = MixRandUtils.randNumber(mixParams.packageFiles) for i in range(count): print "make mix file : %d/%d" % (i, count) fdir = dir + os.sep + MixRandUtils.randomDir(0, 2) word = MixRandUtils.randNumber(mixParams.fileSizeArea) MixFileUtils.tryMkdir(fdir) outputFile(word, fdir, ignors)
def renameSound(soundPath, upsetDirName, mapping): resPos = soundPath.rfind(SOUND_DIR_NAME) if -1 == resPos : return resPath = soundPath[0:resPos] srcSearchPath = soundPath[resPos:] dstSearchPath = randomName(upsetDirName, mapping) dstPath = resPath + dstSearchPath MixFileUtils.tryMkdir(os.path.dirname(dstPath)) shutil.move(soundPath, dstPath) mapping[dstSearchPath] = srcSearchPath
def makeMixCodeFiles(mixDir, mixRange): appDir = 'app' # 清理混淆内容 MixFileUtils.tryRmdir(mixDir + os.sep + appDir + os.sep) # 混淆代码 start filesDict = {} fileAmout = MixRandUtils.randNumber(mixRange) for i in range(fileAmout) : outputCodeFile(filesDict, mixDir, appDir) print 'create mix code:' + str(i) + '/' + str(fileAmout) # 混淆代码 end return filesDict
def main(mixParams, assetsInfo): mapping = None if mixParams.soundMapping : mapping = {} assetsInfo.soundMapping = mapping signName = MixFileUtils.getFileName(mixParams.assetsName) bitchMix(mixParams.assetsRes, signName, mapping)
def makeMixIndex(indexPath, fileDict, assetsInfo): indexInfo = ClassImplInfo() indexInfo.className = MixFileUtils.getFileName(indexPath) # include start indexInfo.includes.append(indexInfo.className + '.h') mixAmount = len(fileDict) if mixAmount > 0: abmanagerPos = random.randint(1, mixAmount - 1) for fpath in fileDict: # 随机位置插入 abmanagerPos -= 1 if 0 == abmanagerPos: indexInfo.includes.append('AssetsBinManager.h') # 导入混淆代码 indexInfo.includes.append(fpath) else: indexInfo.includes.append('AssetsBinManager.h') # include end # init method start initMethod = MethodInfo() initMethod.static = '+' initMethod.methodName = 'startGameApp' initMethod.returnType = 'void' if mixAmount > 0: initMethod.body = makeInitGameContent(assetsInfo, fileDict) else: initMethod.body = makeAssetsConfigs(assetsInfo) indexInfo.methods.append(initMethod) # init method end return buildClassImplement(indexInfo)
def makeShowFiles(mixParams, assetsInfo): ignors = [] # 生成虚拟目录结构 dirlist = getVitruDirs(mixParams.assetsRes, (2, 4), (20, 60)) dirnums = dirlist.__len__() - 1 # 输出混淆文件 count = MixRandUtils.randNumber(mixParams.displayFiles) for i in range(count): print "make mix file : %d/%d" % (i, count) fdir = dirlist[MixRandUtils.randNumber((0, dirnums))] word = MixRandUtils.randNumber(mixParams.fileSizeArea) MixFileUtils.tryMkdir(fdir) outputFile(word, fdir, ignors) # 更换资源包名称 assetsDir = dirlist[MixRandUtils.randNumber((0, dirnums))] assetsPos = assetsDir + mixParams.assetsFile shutil.move(assetsInfo.assetsPath, assetsPos) assetName = assetsPos[assetsPos.find('/res/') + 1:] assetsInfo.assetsName = assetName
def bitchMix(resDir, signName, mapping): # 签名 soundDir = resDir + os.sep + SOUND_DIR_NAME files = [] MixFileUtils.listfiles(soundDir, files) track = 0 for f in files: if '.mp3' != os.path.splitext(f)[1] : continue track += 1 print 'mix sound : %d-%s' % (track, f) setProperty(f, track, signName) # 签名MP3 # 打乱文件 if mapping != None : upsetDir = None while True: upsetDir = MixRandUtils.randomDir(1, 3) if upsetDir.find(SOUND_DIR_NAME) != 0: break for f in files: renameSound(f, upsetDir, mapping) MixFileUtils.tryRmdir(soundDir)
def packAssets(mixParams): # 生成隐藏的混淆文件 MixConfuse.makePackFiles(mixParams) # 构造打包信息 assetsInfo = AssetsInfo() assetsInfo.assetsName = mixParams.assetsName assetsInfo.assetsPath = mixParams.assetsDst + os.sep + mixParams.assetsName assetsInfo.sign = str(MixRandUtils.randNumber((1000000, 9999999))) assetsInfo.version = time.strftime('%Y%m%d%H', time.localtime(time.time())) # 打包资源 os.system('exec %s %s %s %s %s %s' % ( MixFileUtils.getPacker(), assetsInfo.sign, assetsInfo.version, mixParams.assetsSrc, assetsInfo.assetsPath, mixParams.assetsDst )) # 混淆声音文件 MixSound.main(mixParams, assetsInfo) # 生成显示的混淆文件 MixConfuse.makeShowFiles(mixParams, assetsInfo) return assetsInfo
def outputMainFile(indexPath, assetsInfo, fileDict): MixFileUtils.tryMkdir(os.path.dirname(indexPath)) MixFileUtils.outputText(indexPath, MixCode.makeMixIndex(indexPath, fileDict, assetsInfo))