提交 510cefc2 作者: 毛细亚

奇异泡泡龙通过的班版本

上级 f23202a4
1.先在混淆网站上打包 https://www.bejson.com/encrypt/jsobfuscate/
2.打完包然后进行 映射处理
module.exports = { 3.映射处理的打包配置
// 自己的混淆配置 ``` #!/usr/bin/env node
my: { const fs = require('fs')
stringArray: true, // 压缩成一行 删除字符串文字并将它们放在一个特殊的数组中。例如,字符串"Hello World"invar m = "Hello World";将被替换为类似var m = _0x12c456[0x1]; const shell = require('shelljs')
// 僵尸代码 console.log('bi-confusion-cli')
deadCodeInjection: true, const program = require('commander')
deadCodeInjectionThreshold: 0.6,
// controlFlowFlatteningThreshold:0.75,// 此设置对于大型代码特别有用,因为大量的控制流转换会减慢您的代码并增加代码大小。 const STRING_SPLIT_LENGTH = 20
debugProtection: false,// 此选项几乎不可能使用开发者工具的控制台选项卡
debugProtectionInterval: false,// 如果选中,则会在“控制台”选项卡上使用间隔强制调试模式,从而更难使用“开发人员工具”的其他功能。 const sleep = (time) => {
log: true,// 是否允许将信息记录到控制台。 return new Promise((resolve) => setTimeout(resolve, time))
disableConsoleOutput: false,// 通过用空函数替换它们来禁用console.log,console.info,console.error和console.warn。这使得调试器的使用更加困难。
// identifierNamesGenerator: 'mangled-shuffled', //标识符的混淆方式 hexadecimal(十六进制) mangled(短标识符) dictionary 需要与identifiersDictionary同时使用 mangled-shuffled 和 mangled 相同 但是字母会被打乱
// identifiersDictionary:['_zw_,_mxy_,_zwan_,-nzy_'],//dictionary选项设置标识符字典。字典中的每个标识符将用于几个变体,每个字符的大小写不同。因此,字典中标识符的数量应取决于原始源代码中的标识符数量。
identifiersPrefix:'_mxy_',//全局标识符添加特定前缀,在混淆同一页面上加载的多个文件时使用此选项。此选项有助于避免这些文件的全局标识符之间发生冲突。为每个文件使用不同的前缀
// identifierNamesCache:{}, // 此选项的主要目标是能够在混淆多个源/文件期间使用相同的标识符名称。
// inputFileName: 'main.js',
// numbersToExpressions:true,//启用数字到表达式的转换 会将数字转化为表达式的形式 eg:const foo = 1234; output const foo=-0xd93+-0x10b4+0x41*0x67+0x84e*0x3+-0xff8;
renameGlobals: true,// 是否启用全局变量和函数名称的混淆
// renameProperties:true,//启用属性名称的重命名。所有内置 DOM 属性和核心 JavaScript 类中的属性都将被忽略。这个打开会报错
// simplify:true,// 通过简化实现额外的代码混淆。
rotateStringArray: true,// 通过固定和随机(在代码混淆时生成)的位置移动数组。这使得将删除的字符串的顺序与其原始位置相匹配变得更加困难。如果原始源代码不小,建议使用此选项,因为辅助函数可以引起注意
// 编码的所有字符串文字stringArray使用base64或rc4并插入即用其解码回在运行时的特殊代码。true(boolean):stringArray使用编码值base64;false(boolean):不编码stringArray值;'base64'(string):stringArray使用编码值base64;'rc4'(string):stringArray使用编码值rc4。大约慢30-50%base64,但更难获得初始值。建议禁用unicodeEscapeSequence带rc4编码的选项以防止非常大的混淆代码。
// splitStrings:true,//将文字字符串拆分为具有splitStringsChunkLength选项值长度的块。
// splitStringsChunkLength:0.5,//设置splitStrings选项的块长度。
stringArrayEncoding: ['none'],
stringArrayThreshold:0,
stringArrayIndexShift:true,// 为所有字符串数组调用启用额外的索引移位
stringArrayShuffle:true,//随机打乱stringArray数组项。
// stringArrayWrappersCount:1,//设置string array每个根或函数作用域内部的包装器计数。每个范围内的实际包装器数量literal受此范围内节点数的限制。
selfDefending: false,// 混淆后不能时使用代码美化
// 允许启用/禁用字符串转换为unicode转义序列。Unicode转义序列大大增加了代码大小,并且可以轻松地将字符串恢复为原始视图。建议仅对小型源代码启用此选项。
target: 'browser',
// 是否启用混淆对象键
transformObjectKeys: true,
unicodeEscapeSequence: false
},
} }
function strSplit(str, leng = STRING_SPLIT_LENGTH) {
let arr = []
let index = 0
while (index < str.length) {
arr.push(str.slice(index, (index += leng)))
}
return arr
}
function getNums36() {
var nums36 = []
for (var i = 0; i < 36; i++) {
if (i >= 0 && i <= 9) {
nums36.push(i)
} else {
nums36.push(String.fromCharCode(i + 87))
}
}
return nums36
}
//十进制数转成36进制
function scale36(n) {
var arr = []
var nums36 = getNums36()
while (n) {
var res = n % 36
//作为下标,对应的36进制数,转换成
arr.unshift(nums36[res])
//去掉个位
n = parseInt(n / 36)
}
return arr.join('')
}
const strToHexCharCode = (str) => {
if (str === '') return ''
var hexCharCode = []
hexCharCode.push('0x')
for (var i = 0; i < str.length; i++) {
hexCharCode.push(str.charCodeAt(i).toString(16))
}
return hexCharCode.join('')
}
const decode = (str) => {
str = str.replace(/\\x(\w{2,3})/g, function (_, $1) {
return String.fromCharCode(parseInt($1, 16))
})
str = str.replace(/\\u(\w{4})/g, function (_, $1) {
return String.fromCharCode(parseInt($1, 16))
})
return str
}
let log = ''
// fs.writeFileSync('log.txt', log)
const fuckObjeckKey = (content) => {
const result = content.replace(/[{|\,]\'[\u4E00-\u9FA5$_.A-z0-9_/]*?\':/g, (str) => {
// let lastStr = content.substr(index + str.length, 1)
// if (lastStr === ':') {
// return '[' + str + ']'
// }
console.log('str:', str)
let newStr = str.replace(/\'.*?\'/g, (keyStr, index) => {
if (keyStr === "'get'" || keyStr === "'set'") {
return keyStr
}
console.log('keyStr:', keyStr)
let lastStr = str.substr(index + keyStr.length, 1)
if (lastStr === ':') {
return '[' + keyStr + ']'
}
return keyStr
})
return newStr
})
return result
}
program
.version('1.0.0', '-v, --version')
.command('init <fileName> [keyWord]')
.action((fileName, keyWord = 'a') => {
const data = fs.readFileSync(fileName)
const content = data.toString()
// console.log(data.toString())
// const reg = new RegExp(/\[\'(.+?)\'\]/g)
const reg = new RegExp(/\'.*?\'/g)
// console.log(content.match(reg))
const obj = {}
const keyArr = {}
// console.log(content.match(reg))
// return
let i = 0
// console.log('content:',content)
const objectResult = fuckObjeckKey(content)
if (keyWord === 'test') {
console.log(objectResult)
// return false
}
// return
const result = objectResult.replace(reg, (str, index) => {
// console.log('str:', str)
let lastStr1 = objectResult.substr(index + str.length, 1)
let lastStr2 = objectResult.substr(index + str.length, 2)
if (lastStr1 === '(' || lastStr2 === 'in') {
return str
}
if (str === "'use strict'") {
return str
}
if (str === "''" || str === "'get'" || str === "'set'") {
return str
}
// console.log('splitStr:', splitStr)
let arr = []
const splitStr = strSplit(decode(str).replace(/\'/g, ''))
if (keyWord === 'test') {
// console.log('splitStr:',splitStr,decode(str),str)
}
splitStr.map((item, index) => {
i++
const key = keyWord + scale36(i)
obj[key] = item
arr.push(` zwobj.${key}`)
// return `zwobj.${key}`
})
return arr.join(' + ')
})
if (fileName === 'test.js') {
console.log(obj)
}
fs.writeFileSync(fileName.replace(/\.js/g, '') + '-bi.js', result)
fs.writeFileSync(fileName.replace(/\.js/g, '') + '-config.bin', JSON.stringify(obj))
// js += '\n};\n\n'
shell
.echo(`const zwobj=wx.$${keyWord};`)
.cat(fileName.replace(/\.js/g, '') + '-bi.js')
.to(fileName.replace(/\.js/g, '') + '-bi.js')
console.log('success!!!')
// content.match(reg).map(str=>{
// })
})
program.command('ast <fileName> [keyWord]').action((fileName, keyWord = 'a') => {
const babel = require('@babel/core')
//类型判断,生成AST零部件
const t = require('babel-types')
//源代码
const data = fs.readFileSync(fileName)
const content = data.toString()
const code = content
// const code = `console.log('2');console['error']('3')` //目标代码 const sum = function(a,b){ return a + b }
//插件对象,可以对特定类型的节点进行处理
let i = 0
let obj = {}
let visitor = {
//代表处理 ArrowFunctionExpression 节点
MemberExpression(path) {
if(i>250000){
return
}
if (path.node.object.name === 'zwobj') {
return
}
if (t.isIdentifier(path.node.property)) {
path.node.computed = true
i++
const key = keyWord + scale36(i)
obj[key] = path.node.property.name
const member = t.MemberExpression(t.Identifier('zwobj'), t.Identifier(key), false)
path.node.property = member
}
},
// ObjectExpression(path) {
// let arr = []
// path.node.properties.map((item) => {
// item.key.name = `"${item.key.name}"`
// i++
// const key = keyWord + scale36(i)
// obj[key] = path.node.property.name
// })
// path.node.properties = arr
// }
}
//transform方法转换code
//babel先将代码转换成ast,然后进行遍历,最后输出code
let result = babel.transform(code, {
plugins: [
{
visitor
}
]
})
console.log('obj:', obj)
fs.writeFileSync(fileName.replace(/\.js/g, '') + '-bi.js', result.code)
// console.log(result.code)
})
program.parse(process.argv) ```
\ No newline at end of file
module.exports = { module.exports = {
app_id: "wxee161714ebd3dfcd", app_id: "wx5bf92e3883dc5a82",
game_id: "123", game_id: "122",
/**以下参数,请勿随意修改! */ /**以下参数,请勿随意修改! */
gameVersion: "1.16852" gameVersion: "1.16852"
......
...@@ -38,7 +38,7 @@ function checkFile(filePath){ ...@@ -38,7 +38,7 @@ function checkFile(filePath){
} }
}) })
} }
var file1=downConfig({fileName:'mxy_release.bin',variable:'a'}) var file1=downConfig({fileName:'release9.bin',variable:'a'})
......
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
}, },
"compileType": "game", "compileType": "game",
"libVersion": "2.21.0", "libVersion": "2.21.0",
"appid": "wxee161714ebd3dfcd", "appid": "wx5bf92e3883dc5a82",
"projectname": "SQ-ZhangWang", "projectname": "SQ-ZhangWang",
"simulatorType": "wechat", "simulatorType": "wechat",
"simulatorPluginLibVersion": {}, "simulatorPluginLibVersion": {},
......
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论