Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
G
gameExamine
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
毛细亚
gameExamine
Commits
510cefc2
提交
510cefc2
authored
12月 06, 2021
作者:
毛细亚
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
奇异泡泡龙通过的班版本
上级
f23202a4
显示空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
228 行增加
和
42 行删除
+228
-42
README.md
README.md
+224
-38
config.js
config/config.js
+2
-2
game.js
game.js
+1
-1
project.config.json
project.config.json
+1
-1
main.min.js
subpackage/main.min.js
+0
-0
奇异泡泡龙通过的配置.png
subpackage/奇异泡泡龙通过的配置.png
+0
-0
没有找到文件。
README.md
浏览文件 @
510cefc2
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 相同 但是字母会被打乱
function strSplit(str, leng = STRING_SPLIT_LENGTH) {
// identifiersDictionary:
[
'_zw_,_mxy_,_zwan_,-nzy_'
]
,//dictionary选项设置标识符字典。字典中的每个标识符将用于几个变体,每个字符的大小写不同。因此,字典中标识符的数量应取决于原始源代码中的标识符数量。
let arr = []
identifiersPrefix:'_mxy_',//全局标识符添加特定前缀,在混淆同一页面上加载的多个文件时使用此选项。此选项有助于避免这些文件的全局标识符之间发生冲突。为每个文件使用不同的前缀
let index = 0
// identifierNamesCache:{}, // 此选项的主要目标是能够在混淆多个源/文件期间使用相同的标识符名称。
while (index < str.length) {
// inputFileName: 'main.js',
arr.push(str.slice(index, (index += leng)))
// numbersToExpressions:true,//启用数字到表达式的转换 会将数字转化为表达式的形式 eg:const foo = 1234; output const foo=-0xd93+-0x10b4+0x41
*0x67+0x84e*
0x3+-0xff8;
}
renameGlobals: true,// 是否启用全局变量和函数名称的混淆
// renameProperties:true,//启用属性名称的重命名。所有内置 DOM 属性和核心 JavaScript 类中的属性都将被忽略。这个打开会报错
return arr
// simplify:true,// 通过简化实现额外的代码混淆。
}
rotateStringArray: true,// 通过固定和随机(在代码混淆时生成)的位置移动数组。这使得将删除的字符串的顺序与其原始位置相匹配变得更加困难。如果原始源代码不小,建议使用此选项,因为辅助函数可以引起注意
function getNums36() {
// 编码的所有字符串文字stringArray使用base64或rc4并插入即用其解码回在运行时的特殊代码。true(boolean):stringArray使用编码值base64;false(boolean):不编码stringArray值;'base64'(string):stringArray使用编码值base64;'rc4'(string):stringArray使用编码值rc4。大约慢30-50%base64,但更难获得初始值。建议禁用unicodeEscapeSequence带rc4编码的选项以防止非常大的混淆代码。
var nums36 = []
// splitStrings:true,//将文字字符串拆分为具有splitStringsChunkLength选项值长度的块。
for (var i = 0; i < 36; i++) {
// splitStringsChunkLength:0.5,//设置splitStrings选项的块长度。
if (i >= 0 && i <= 9) {
stringArrayEncoding:
[
'none'
]
,
nums36.push(i)
stringArrayThreshold:0,
} else {
stringArrayIndexShift:true,// 为所有字符串数组调用启用额外的索引移位
nums36.push(String.fromCharCode(i + 87))
stringArrayShuffle:true,//随机打乱stringArray数组项。
}
// stringArrayWrappersCount:1,//设置string array每个根或函数作用域内部的包装器计数。每个范围内的实际包装器数量literal受此范围内节点数的限制。
}
selfDefending: false,// 混淆后不能时使用代码美化
return nums36
// 允许启用/禁用字符串转换为unicode转义序列。Unicode转义序列大大增加了代码大小,并且可以轻松地将字符串恢复为原始视图。建议仅对小型源代码启用此选项。
target: 'browser',
// 是否启用混淆对象键
transformObjectKeys: true,
unicodeEscapeSequence: false
},
}
}
//十进制数转成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
config/config.js
浏览文件 @
510cefc2
module
.
exports
=
{
module
.
exports
=
{
app_id
:
"wx
ee161714ebd3dfcd
"
,
app_id
:
"wx
5bf92e3883dc5a82
"
,
game_id
:
"12
3
"
,
game_id
:
"12
2
"
,
/**以下参数,请勿随意修改! */
/**以下参数,请勿随意修改! */
gameVersion
:
"1.16852"
gameVersion
:
"1.16852"
...
...
game.js
浏览文件 @
510cefc2
...
@@ -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'
})
...
...
project.config.json
浏览文件 @
510cefc2
...
@@ -39,7 +39,7 @@
...
@@ -39,7 +39,7 @@
},
},
"compileType"
:
"game"
,
"compileType"
:
"game"
,
"libVersion"
:
"2.21.0"
,
"libVersion"
:
"2.21.0"
,
"appid"
:
"wx
ee161714ebd3dfcd
"
,
"appid"
:
"wx
5bf92e3883dc5a82
"
,
"projectname"
:
"SQ-ZhangWang"
,
"projectname"
:
"SQ-ZhangWang"
,
"simulatorType"
:
"wechat"
,
"simulatorType"
:
"wechat"
,
"simulatorPluginLibVersion"
:
{},
"simulatorPluginLibVersion"
:
{},
...
...
subpackage/main.min.js
浏览文件 @
510cefc2
This source diff could not be displayed because it is too large. You can
view the blob
instead.
subpackage/奇异泡泡龙通过的配置.png
0 → 100644
浏览文件 @
510cefc2
415.1 KB
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论