mirror of
https://github.com/pysunday/rs-reverse.git
synced 2025-04-19 22:24:54 +08:00
fix: code logging optimization,upload to npm
This commit is contained in:
parent
fda003f6b1
commit
45588d148f
86
README.md
86
README.md
@ -1,4 +1,4 @@
|
|||||||
这个项目是瑞数加密的逆向研究,代码开发基于网站链接:`http://wcjs.sbj.cnipa.gov.cn/sgtmi`
|
这个项目是瑞数加密的逆向研究,代码开发基于网站链接:`https://wcjs.sbj.cnipa.gov.cn/sgtmi`
|
||||||
|
|
||||||
研究包括动态代码生成原理及动态cookie生成原理。
|
研究包括动态代码生成原理及动态cookie生成原理。
|
||||||
|
|
||||||
@ -16,23 +16,28 @@
|
|||||||
|
|
||||||
## 1. 博客文章
|
## 1. 博客文章
|
||||||
|
|
||||||
1. [瑞数vmp-动态代码生成原理](https://howduudu.tech/#/blog/article/1701276778000)
|
1. [瑞数vmp-代码格式化后无法正常运行原因分析](https://howduudu.tech/#/blog/article/1699807978000)
|
||||||
2. [补环境-document.all的c++方案](https://howduudu.tech/#/blog/article/1702313578000)
|
2. [瑞数vmp-动态代码生成原理](https://howduudu.tech/#/blog/article/1701276778000)
|
||||||
|
3. [补环境-document.all的c++方案](https://howduudu.tech/#/blog/article/1702313578000)
|
||||||
|
|
||||||
## 2. 瑞数算法还原
|
## 2. 瑞数算法还原
|
||||||
|
|
||||||
|
**`npx rs-reverse *`与在当前目录下运行`node main.js *`相对应**
|
||||||
|
|
||||||
### 2.1. makecode子命令
|
### 2.1. makecode子命令
|
||||||
|
|
||||||
|
> 体验命令:`npx rs-reverse makecode`
|
||||||
|
|
||||||
执行子命令`makecode`生成动态代码, 可以传入包含`$_ts.nsd`和`$_ts.cd`的文本文件或者直接给url让程序自己去拿。
|
执行子命令`makecode`生成动态代码, 可以传入包含`$_ts.nsd`和`$_ts.cd`的文本文件或者直接给url让程序自己去拿。
|
||||||
|
|
||||||
如运行:`node main.js makecode -u http://wcjs.sbj.cnipa.gov.cn/sgtmi`,后生成三个文件:
|
如运行:`npx rs-reverse makecode -u http://wcjs.sbj.cnipa.gov.cn/sgtmi`,后生成三个文件:
|
||||||
|
|
||||||
1. 动态代码文件`output/dynamic-code.js`
|
1. 动态代码文件`output/dynamic-code.js`
|
||||||
2. `$_ts`文件`output/input_ts.json`和`output/output_ts.json`
|
2. `$_ts`文件`output/input_ts.json`和`output/output_ts.json`
|
||||||
|
|
||||||
```console
|
```console
|
||||||
$ node main.js makecode -h
|
$ npx rs-reverse makecode -h
|
||||||
main.js makecode
|
rs-reverse makecode
|
||||||
|
|
||||||
生成动态代码
|
生成动态代码
|
||||||
|
|
||||||
@ -43,30 +48,35 @@ Options:
|
|||||||
-v, --version 显示版本号 [boolean]
|
-v, --version 显示版本号 [boolean]
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
main.js makecode -f example/codes/1-$_ts.json
|
rs-reverse makecode -f example/codes/1-$_ts.json
|
||||||
main.js makecode -u http://url/path
|
rs-reverse makecode -u http://url/path
|
||||||
```
|
```
|
||||||
|
|
||||||
调用示例:
|
调用示例:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ node main.js makecode -u http://wcjs.sbj.cnipa.gov.cn/sgtmi
|
$ npx rs-reverse makecode
|
||||||
文件写入成功:./rsvmp/output/dynamic-code.js
|
|
||||||
文件写入成功:./rsvmp/output/output_ts.json
|
输入ts:./output/output_ts.js
|
||||||
文件写入成功:./rsvmp/output/input_ts.json
|
输出ts:./output/output_ts.js
|
||||||
|
动态代码:./output/dynamic_code.js/input_ts.json
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2.2. makecookie子命令
|
### 2.2. makecookie子命令
|
||||||
|
|
||||||
执行子命令`makecookie`生成动态代码, 可以传入包含`$_ts.nsd`和`$_ts.cd`的文本文件或者直接给url让程序自己去拿。
|
执行子命令`makecookie`生成动态代码, 可以传入包含`$_ts.nsd`和`$_ts.cd`的文本文件或者直接给url让程序自己去拿, 命令示例:
|
||||||
|
|
||||||
|
1. npx方式:`npx rs-reverse makecookie`
|
||||||
|
2. 文件方式:`node main.js makecookie`
|
||||||
|
|
||||||
该命令首先会执行`makecode`子命令拿到完整的`$_ts`值,再运行makecookie算法生成cookie。
|
该命令首先会执行`makecode`子命令拿到完整的`$_ts`值,再运行makecookie算法生成cookie。
|
||||||
|
|
||||||
`makecookie`命令与`makecode`使用方式类似:
|
`makecookie`命令与`makecode`使用方式类似:
|
||||||
|
|
||||||
```console
|
```console
|
||||||
$ node main.js makecode -h
|
$ npx rs-reverse makecookie -h
|
||||||
main.js makecode
|
rs-reverse makecookie
|
||||||
|
|
||||||
生成动态代码
|
生成动态代码
|
||||||
|
|
||||||
@ -77,17 +87,51 @@ Options:
|
|||||||
-v, --version 显示版本号 [boolean]
|
-v, --version 显示版本号 [boolean]
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
main.js makecode -f example/codes/1-$_ts.json
|
rs-reverse makecookie -f example/codes/1-$_ts.json
|
||||||
main.js makecode -u http://url/path
|
rs-reverse makecookie -u http://url/path
|
||||||
```
|
```
|
||||||
|
|
||||||
调用示例:
|
调用示例:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ node main.js makecookie -f example/codes/1-\$_ts.json
|
$ npx rs-reverse makecookie
|
||||||
生成cookie成功!
|
|
||||||
length: 235
|
Cookie值: 06F5jRMo1hoEoEPOKmB6eAcYaJeWGRuYthzufuuJ4tkmcCMZLbouHGcYIm462aiARAwGlJIvr6M_vbi1K3kaer3n0ZE459rr3eKe8U.xTOaCdVxik6TW2XIle7cmudenUkPfU4UaEGoqOl8nAv38f_Qb_g6kZMpHn51J2qsIdscBqGgjQvcwWPFWk2r9SHbAJbRganpjSeTH1PksisGcKwHCFbHsXqYX1jAW672tcssl
|
||||||
cookie: Ma8ZARIJYUhRLQrrW7Tn51DkRxBo87ofVj83ovbQLwChJdyC8LdJ69FkMO4HO.aUp9i4Qhanlv6MKa6bjuXiEvYZPLR89msKwqOJJtiL.yLk7aqwx_H2fNcMVG2zGif089rVFrdWA8dvO3Rh5iSH3sCcDuw2YHI18DvuiXTCGKrvtGXReJEYPh6pGFiZ9sONokiTCNkyqSjZIk6izfi2cg5Rba2Orfg0JCEuwWMTiBL
|
Cookie长: 236
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.3. exec子命令
|
||||||
|
|
||||||
|
runcode子命令用于开发中或者演示时使用。命令示例:
|
||||||
|
|
||||||
|
1. npx方式:`npx rs-reverse exec -c 'gv.cp2'`
|
||||||
|
2. 文件方式:`node main.js exec -c 'gv.cp2'`
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ npx rs-reverse exec -h
|
||||||
|
rs-reverse exec
|
||||||
|
|
||||||
|
直接运行代码,用于开发及演示时使用
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-h 显示帮助信息 [boolean]
|
||||||
|
-l, --level 日志打印等级,参考log4js,默认为info [string]
|
||||||
|
-c, --code 要运行的代码,如:gv.cp2,即打印cp2的值 [string] [required]
|
||||||
|
-v, --version 显示版本号 [boolean]
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
rs-reverse exec -c 'code string'
|
||||||
|
```
|
||||||
|
|
||||||
|
调用示例:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ npm rs-reverse exec -c '+ascii2string(gv.keys[21])'
|
||||||
|
|
||||||
|
输入:+ascii2string(gv.keys[21])
|
||||||
|
输出:1718026159
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 3. 手动获取动态代码和$_ts的方法
|
## 3. 手动获取动态代码和$_ts的方法
|
||||||
|
152
main.js
Normal file → Executable file
152
main.js
Normal file → Executable file
@ -1,22 +1,72 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
require('module-alias/register');
|
const paths = require('./utils/paths');
|
||||||
|
require('module-alias')(paths.package);
|
||||||
const yargs = require('yargs');
|
const yargs = require('yargs');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const makeCode = require('@src/makeCode');
|
const makeCode = require('@src/makeCode');
|
||||||
const makeCookie = require('@src/makeCookie');
|
const makeCookie = require('@src/makeCookie');
|
||||||
const utils = require('@utils/');
|
const utils = require('@utils/');
|
||||||
const { logger, paths, isValidUrl } = utils;
|
const { logger, isValidUrl } = utils;
|
||||||
const pkg = require(paths.package);
|
const pkg = require(paths.package);
|
||||||
const request = require('request-promise');
|
const request = require('request-promise');
|
||||||
const cheerio = require('cheerio');
|
const cheerio = require('cheerio');
|
||||||
|
const log4js = require('log4js');
|
||||||
|
|
||||||
function debugLog() {
|
function debugLog(level) {
|
||||||
if (pkg.logLevel === 'debug') {
|
if (level) {
|
||||||
logger.log('execPath:', __dirname);
|
if (!log4js.levels.levels.map(it => it.levelStr).includes(level.toUpperCase())) {
|
||||||
logger.log('filePath:', __filename);
|
throw new Error('日志等级输入错误,请检查!');
|
||||||
logger.log('processCwd:', process.cwd());
|
|
||||||
logger.log('paths:\n', JSON.stringify(paths, null, 2));
|
|
||||||
}
|
}
|
||||||
|
logger.level = level;
|
||||||
|
}
|
||||||
|
logger.trace('execPath:', __dirname);
|
||||||
|
logger.trace('filePath:', __filename);
|
||||||
|
logger.trace('processCwd:', process.cwd());
|
||||||
|
logger.trace('paths:\n', JSON.stringify(paths, null, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
const commandBuilder = {
|
||||||
|
f: {
|
||||||
|
alias: 'file',
|
||||||
|
describe: '含有nsd, cd值的json文件',
|
||||||
|
type: 'string',
|
||||||
|
coerce: (input) => {
|
||||||
|
if (['1', '2'].includes(input)) input = paths.exampleResolve(`codes/${input}-\$_ts.json`);
|
||||||
|
if (!fs.existsSync(input)) throw new Error(`输入文件不存在: ${input}`);
|
||||||
|
return JSON.parse(fs.readFileSync(paths.resolve(input), 'utf8'));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
l: {
|
||||||
|
alias: 'level',
|
||||||
|
describe: '日志打印等级,参考log4js,默认为info',
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
u: {
|
||||||
|
alias: 'url',
|
||||||
|
describe: '瑞数返回204状态码的请求地址',
|
||||||
|
type: 'string',
|
||||||
|
coerce: async (input) => {
|
||||||
|
if (!isValidUrl(input)) throw new Error('输入链接不正确');
|
||||||
|
try {
|
||||||
|
const res = await request(input)
|
||||||
|
const $ = cheerio.load(res);
|
||||||
|
const scripts = [...$('script')].map(ele => $(ele).text())
|
||||||
|
.filter(text => text.includes('$_ts.nsd') && text.includes('$_ts.cd'));
|
||||||
|
if (!scripts.length) throw new Error('链接返回结果未找到cd或nsd');
|
||||||
|
return Function('window', scripts[0] + 'return $_ts')({});
|
||||||
|
} catch(err) {
|
||||||
|
throw new Error('输入链接无效');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const commandHandler = (command, argv) => {
|
||||||
|
debugLog(argv.level);
|
||||||
|
const ts = argv.file || argv.url || require(paths.exampleResolve('codes/1-\$_ts.json'));
|
||||||
|
logger.trace(`传入的$_ts.nsd: ${ts.nsd}`);
|
||||||
|
logger.trace(`传入的$_ts.cd: ${ts.cd}`);
|
||||||
|
command(ts);
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = yargs
|
module.exports = yargs
|
||||||
@ -27,76 +77,40 @@ module.exports = yargs
|
|||||||
.command({
|
.command({
|
||||||
command: 'makecode',
|
command: 'makecode',
|
||||||
describe: '生成动态代码',
|
describe: '生成动态代码',
|
||||||
builder: {
|
builder: commandBuilder,
|
||||||
f: {
|
handler: commandHandler.bind(null, makeCode),
|
||||||
alias: 'file',
|
|
||||||
describe: '含有nsd, cd值的json文件',
|
|
||||||
type: 'string',
|
|
||||||
coerce: (input) => {
|
|
||||||
if (!fs.existsSync(input)) throw new Error('输入文件不存在');
|
|
||||||
return JSON.parse(fs.readFileSync(paths.resolve(input), 'utf8'));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
u: {
|
|
||||||
alias: 'url',
|
|
||||||
describe: '瑞数返回204状态码的请求地址',
|
|
||||||
type: 'string',
|
|
||||||
coerce: async (input) => {
|
|
||||||
if (!isValidUrl(input)) throw new Error('输入链接不正确');
|
|
||||||
try {
|
|
||||||
const res = await request(input)
|
|
||||||
const $ = cheerio.load(res);
|
|
||||||
const scripts = [...$('script')].map(ele => $(ele).text())
|
|
||||||
.filter(text => text.includes('$_ts.nsd') && text.includes('$_ts.cd'));
|
|
||||||
if (!scripts.length) throw new Error('链接返回结果未找到cd或nsd');
|
|
||||||
return Function('window', scripts[0] + 'return $_ts')({});
|
|
||||||
} catch(err) {
|
|
||||||
throw new Error('输入链接无效');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
handler: (argv) => {
|
|
||||||
debugLog();
|
|
||||||
makeCode(argv.file || argv.url);
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
.command({
|
.command({
|
||||||
command: 'makecookie',
|
command: 'makecookie',
|
||||||
describe: '生成动态cookie',
|
describe: '生成动态cookie',
|
||||||
|
builder: commandBuilder,
|
||||||
|
handler: commandHandler.bind(null, makeCookie),
|
||||||
|
})
|
||||||
|
.command({
|
||||||
|
command: 'exec',
|
||||||
|
describe: '直接运行代码,用于开发及演示时使用,Math.random方法固定返回值为0.1253744220839037',
|
||||||
builder: {
|
builder: {
|
||||||
f: {
|
l: {
|
||||||
alias: 'file',
|
alias: 'level',
|
||||||
describe: '含有nsd, cd值的json文件',
|
describe: '日志打印等级,参考log4js,默认为info',
|
||||||
type: 'string',
|
type: 'string',
|
||||||
coerce: (input) => {
|
|
||||||
if (!fs.existsSync(input)) throw new Error('输入文件不存在');
|
|
||||||
return JSON.parse(fs.readFileSync(paths.resolve(input), 'utf8'));
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
u: {
|
c: {
|
||||||
alias: 'url',
|
alias: 'code',
|
||||||
describe: '瑞数返回204状态码的请求地址',
|
describe: '要运行的代码,如:gv.cp2,即打印cp2的值',
|
||||||
type: 'string',
|
type: 'string',
|
||||||
coerce: async (input) => {
|
demandOption: true,
|
||||||
if (!isValidUrl(input)) throw new Error('输入链接不正确');
|
|
||||||
try {
|
|
||||||
const res = await request(input)
|
|
||||||
const $ = cheerio.load(res);
|
|
||||||
const scripts = [...$('script')].map(ele => $(ele).text())
|
|
||||||
.filter(text => text.includes('$_ts.nsd') && text.includes('$_ts.cd'));
|
|
||||||
if (!scripts.length) throw new Error('链接返回结果未找到cd或nsd');
|
|
||||||
return Function('window', scripts[0] + 'return $_ts')({});
|
|
||||||
} catch(err) {
|
|
||||||
throw new Error('输入链接无效');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
handler: commandHandler.bind(null, makeCookie),
|
||||||
handler: (argv) => {
|
handler: (argv) => {
|
||||||
debugLog();
|
debugLog(argv.level);
|
||||||
makeCookie(argv.file || argv.url);
|
Math.random = () => 0.1253744220839037;
|
||||||
},
|
const gv = require('@utils/initGv');
|
||||||
|
Object.assign(global, gv.utils);
|
||||||
|
const output = JSON.stringify(eval(argv.code));
|
||||||
|
console.log([`\n 输入:${argv.code}`, `输出:${output}\n`].join('\n '));
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.updateStrings({
|
.updateStrings({
|
||||||
'Show version number': '显示版本号',
|
'Show version number': '显示版本号',
|
||||||
@ -104,6 +118,8 @@ module.exports = yargs
|
|||||||
})
|
})
|
||||||
.example('$0 makecode -f example/codes/1-\$_ts.json')
|
.example('$0 makecode -f example/codes/1-\$_ts.json')
|
||||||
.example('$0 makecode -u http://url/path')
|
.example('$0 makecode -u http://url/path')
|
||||||
|
.example('$0 makecookie -f example/codes/1-\$_ts.json')
|
||||||
|
.example('$0 makecookie -u http://url/path')
|
||||||
.epilog('')
|
.epilog('')
|
||||||
.argv;
|
.argv;
|
||||||
|
|
||||||
|
26
package.json
26
package.json
@ -1,17 +1,33 @@
|
|||||||
{
|
{
|
||||||
"name": "rs-reverse",
|
"name": "rs-reverse",
|
||||||
"version": "1.0.0",
|
"version": "1.1.0",
|
||||||
"description": "瑞数算法逆向,website reverse engineering",
|
"description": "瑞数算法逆向,website reverse engineering",
|
||||||
"main": "main.js",
|
"main": "main.js",
|
||||||
"directories": {
|
"directories": {
|
||||||
"test": "test"
|
"test": "test"
|
||||||
},
|
},
|
||||||
|
"bin": {
|
||||||
|
"rs-reverse": "./main.js"
|
||||||
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "jest ./test/",
|
"test": "jest ./test/",
|
||||||
"test:debug": "node --inspect-brk node_modules/.bin/jest --runInBand ./test/"
|
"test:debug": "node --inspect-brk node_modules/.bin/jest --runInBand ./test/"
|
||||||
},
|
},
|
||||||
"logLevel": "warn",
|
"logLevel": "info",
|
||||||
"author": "rnet",
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/pysunday/rs-reverse"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"rs",
|
||||||
|
"瑞数",
|
||||||
|
"瑞数算法逆向"
|
||||||
|
],
|
||||||
|
"files": ["package.json", "README.md", "utils", "main.js", "test", "src", "example"],
|
||||||
|
"publishConfig": {
|
||||||
|
"registry": "https://registry.npmjs.org/"
|
||||||
|
},
|
||||||
|
"author": "pysunday",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"tsfile": "1-$_ts-full.json",
|
"tsfile": "1-$_ts-full.json",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@ -22,9 +38,7 @@
|
|||||||
"module-alias": "^2.2.3",
|
"module-alias": "^2.2.3",
|
||||||
"request": "^2.88.2",
|
"request": "^2.88.2",
|
||||||
"request-promise": "^4.2.6",
|
"request-promise": "^4.2.6",
|
||||||
"yargs": "^17.7.2",
|
"yargs": "^17.7.2"
|
||||||
"canvas": "^2.11.2",
|
|
||||||
"jsdom": "^22.1.0"
|
|
||||||
},
|
},
|
||||||
"jest": {
|
"jest": {
|
||||||
"moduleNameMapper": {
|
"moduleNameMapper": {
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
require('module-alias/register');
|
|
||||||
Math.random = () => 0.1253744220839037;
|
|
||||||
const gv = require('../utils/initGv');
|
|
||||||
Object.assign(global, gv.utils);
|
|
||||||
process.argv.slice(2).forEach(text => console.log(JSON.stringify(eval(text))));
|
|
@ -1,49 +0,0 @@
|
|||||||
# 有些不方便作为测试用例的命令在这里记录,为啥作为.sh文件是因为有代码高亮
|
|
||||||
|
|
||||||
# [202,210,192,182,230,224,240,96,248,20,196,50,9,34,165,236,188,203,177,111,18,17,72,251,180,153,48,13,248,52,8,158]
|
|
||||||
node script/runcode.js 'gv.keys[gv.cp2[56]]'
|
|
||||||
# [176,246,225,18,58,227,9,73,39,226,58,47,31,68,217,1]
|
|
||||||
node script/runcode.js 'gv.keys[gv.cp2[2]]'
|
|
||||||
# [62,189,79,239,168,99,174,140,1,153,3,3,4,2,6,4]
|
|
||||||
node script/runcode.js 'gv.keys[gv.cp2[24]]'
|
|
||||||
|
|
||||||
# [101,53,210,175,101,140,3,205,0]
|
|
||||||
node script/runcode.js '[...numToNumarr4([1698026159, 1703674829]), 0, ...[string2ascii(gv.cp0[399])]]'
|
|
||||||
|
|
||||||
# [187,66,92,105,131,179,51,206,252,173,159,211,177,222,248,117,75,251,157,125,174,124,246,155,107,141,181,140,117,197,167,115,216,146,214,73,26,16,173,174,110,12,196,85,83,107,110,246,86,247,27,109,182,130,183,128,228,107,141,117,139,184,219,108,59,249,239,248,187,93,251,141,174,215,55,126,187,99,125,181,133,205,158,180,184,215]
|
|
||||||
node script/runcode.js 'numarrEncrypt([3,29,1,0,33,128,136,133,100,46,8,77,97,99,73,110,116,101,108,0,0,2,60,13,0,0,0,1,0,0,0,10,19,1,13,101,53,210,176,125,22,145,235,0,2,1,136,170,238,214,246,4,7,12,1,0,0,0,0,0,0,0,23,12,25,81,0,1,0,6,16,1,0,0,0,0,0,166,66,100,55,95,100,1,0,0,3,2,4,108,181,180,11,9,2,8,0,13,1,0])'
|
|
||||||
|
|
||||||
# [2,9,101,53,210,175,101,140,3,205,0,32,202,210,192,182,230,224,240,96,248,20,196,50,9,34,165,236,188,203,177,111,18,17,72,251,180,153,48,13,248,52,8,158]
|
|
||||||
node script/runcode.js '[gv.r2mka("0>one>32-126").taskarr[73], 9, ...[101,53,210,175,101,140,3,205,0], 32, ...[202,210,192,182,230,224,240,96,248,20,196,50,9,34,165,236,188,203,177,111,18,17,72,251,180,153,48,13,248,52,8,158]]'
|
|
||||||
|
|
||||||
# 86 [113,144,156,223,101,83,195,174,4,185,91,225,184,252,93,153,75,251,157,125,174,124,246,155,107,141,181,140,117,197,167,115,216,146,214,73,26,16,173,174,110,12,196,85,83,107,110,246,86,247,27,109,182,130,183,128,228,107,141,117,139,184,219,108,59,249,239,248,187,93,251,141,174,215,55,126,187,99,125,181,133,205,158,180,184,215]
|
|
||||||
node script/runcode.js 'xor([187,66,92,105,131,179,51,206,252,173,159,211,177,222,248,117,75,251,157,125,174,124,246,155,107,141,181,140,117,197,167,115,216,146,214,73,26,16,173,174,110,12,196,85,83,107,110,246,86,247,27,109,182,130,183,128,228,107,141,117,139,184,219,108,59,249,239,248,187,93,251,141,174,215,55,126,187,99,125,181,133,205,158,180,184,215], [202,210,192,182,230,224,240,96,248,20,196,50,9,34,165,236,188,203,177,111,18,17,72,251,180,153,48,13,248,52,8,158], gv.cp2[2])'
|
|
||||||
|
|
||||||
# [[62,189,79,239,168,99,174,140,1,153,3,3,4,2,6,4],1703674830]
|
|
||||||
node script/runcode.js 'numarrAddTime.reverse([31,156,110,206,137,66,143,173,32,184,34,34,37,35,39,37,68,173,34,239,33])'
|
|
||||||
|
|
||||||
# 96 [49,133,64,158,96,127,5,33,106,136,44,242,183,213,197,62,158,189,89,223,200,226,78,84,74,72,252,254,140,105,252,253,242,39,70,127,15,173,8,222,242,29,97,41,54,247,178,156,23,133,73,165,182,177,107,169,35,235,170,20,230,138,121,171,59,55,195,194,74,5,250,50,240,188,110,172,224,148,29,7,168,196,247,179,20,238,249,171,17,103,6,61,92,211,11,158]
|
|
||||||
node script/runcode.js 'encryptMode1([113,144,156,223,101,83,195,174,4,185,91,225,184,252,93,153,75,251,157,125,174,124,246,155,107,141,181,140,117,197,167,115,216,146,214,73,26,16,173,174,110,12,196,85,83,107,110,246,86,247,27,109,182,130,183,128,228,107,141,117,139,184,219,108,59,249,239,248,187,93,251,141,174,215,55,126,187,99,125,181,133,205,158,180,184,215], [31,156,110,206,137,66,143,173,32,184,34,34,37,35,39,37,68,173,34,239,33], 0)'
|
|
||||||
|
|
||||||
# 145 [96,251,49,122,2,9,101,53,210,175,101,140,3,205,0,32,202,210,192,182,230,224,240,96,248,20,196,50,9,34,165,236,188,203,177,111,18,17,72,251,180,153,48,13,248,52,8,158,96,49,133,64,158,96,127,5,33,106,136,44,242,183,213,197,62,158,189,89,223,200,226,78,84,74,72,252,254,140,105,252,253,242,39,70,127,15,173,8,222,242,29,97,41,54,247,178,156,23,133,73,165,182,177,107,169,35,235,170,20,230,138,121,171,59,55,195,194,74,5,250,50,240,188,110,172,224,148,29,7,168,196,247,179,20,238,249,171,17,103,6,61,92,211,11,158]
|
|
||||||
node script/runcode.js '[...numToNumarr4(1627074938), ...[2,9,101,53,210,175,101,140,3,205,0,32,202,210,192,182,230,224,240,96,248,20,196,50,9,34,165,236,188,203,177,111,18,17,72,251,180,153,48,13,248,52,8,158], 96, ...[49,133,64,158,96,127,5,33,106,136,44,242,183,213,197,62,158,189,89,223,200,226,78,84,74,72,252,254,140,105,252,253,242,39,70,127,15,173,8,222,242,29,97,41,54,247,178,156,23,133,73,165,182,177,107,169,35,235,170,20,230,138,121,171,59,55,195,194,74,5,250,50,240,188,110,172,224,148,29,7,168,196,247,179,20,238,249,171,17,103,6,61,92,211,11,158]]'
|
|
||||||
# [[176,246,225,18,58,227,9,73,39,226,58,47,31,68,217,1],1703674830]
|
|
||||||
node script/runcode.js 'numarrAddTime.reverse([145,215,192,51,27,194,40,104,6,195,27,14,62,101,248,32,68,173,34,239,33])'
|
|
||||||
|
|
||||||
# 176 [32,24,137,194,32,24,137,194,32,24,137,194,32,24,137,194,203,113,84,138,218,62,66,145,42,74,91,15,88,0,157,58,183,233,27,209,182,47,141,237,153,109,152,156,127,54,178,63,227,135,201,140,173,89,102,100,185,179,42,16,219,116,3,245,84,228,2,77,132,114,212,117,236,62,71,161,33,196,48,127,222,114,174,153,124,92,123,19,198,251,113,220,216,55,127,220,23,136,87,124,52,64,6,161,189,28,255,101,176,2,26,109,72,145,59,112,250,239,89,199,237,6,251,61,41,225,99,122,178,71,18,171,10,160,233,29,178,146,253,203,209,114,111,172,107,67,166,119,2,234,158,14,0,239,7,185,164,83,172,26,244,99,135,75,68,87,117,56,233,121,88,219,210,196,143,144]
|
|
||||||
node script/runcode.js 'encryptMode1([96,251,49,122,2,9,101,53,210,175,101,140,3,205,0,32,202,210,192,182,230,224,240,96,248,20,196,50,9,34,165,236,188,203,177,111,18,17,72,251,180,153,48,13,248,52,8,158,96,49,133,64,158,96,127,5,33,106,136,44,242,183,213,197,62,158,189,89,223,200,226,78,84,74,72,252,254,140,105,252,253,242,39,70,127,15,173,8,222,242,29,97,41,54,247,178,156,23,133,73,165,182,177,107,169,35,235,170,20,230,138,121,171,59,55,195,194,74,5,250,50,240,188,110,172,224,148,29,7,168,196,247,179,20,238,249,171,17,103,6,61,92,211,11,158], [145,215,192,51,27,194,40,104,6,195,27,14,62,101,248,32,68,173,34,239,33])'
|
|
||||||
|
|
||||||
# ErPxaPq3PQEGDEvcErPxa7zSYE.FH9tpt9NMkTGqvsj6_pBpzP5J4R2zbxSdJ.EdggIxOtTRRb1y7nLAC6AkeYs9q9ClQzpT4kyoL1olWod8Qj_RImS4lZM4Qwu3J6dQmgfUIkpqrjDeoHe27qEFMVPpi6k_4Tvo4AM4H1vf36jnpSt.cjkNoMt1dQBpQb57F0ibwahjvGgq4a8yNmi7DBpOf0zlY6Vg_U23CehlOxq
|
|
||||||
node ./script/runcode.js 'numarr2string([32,24,137,194,32,24,137,194,32,24,137,194,32,24,137,194,203,113,84,138,218,62,66,145,42,74,91,15,88,0,157,58,183,233,27,209,182,47,141,237,153,109,152,156,127,54,178,63,227,135,201,140,173,89,102,100,185,179,42,16,219,116,3,245,84,228,2,77,132,114,212,117,236,62,71,161,33,196,48,127,222,114,174,153,124,92,123,19,198,251,113,220,216,55,127,220,23,136,87,124,52,64,6,161,189,28,255,101,176,2,26,109,72,145,59,112,250,239,89,199,237,6,251,61,41,225,99,122,178,71,18,171,10,160,233,29,178,146,253,203,209,114,111,172,107,67,166,119,2,234,158,14,0,239,7,185,164,83,172,26,244,99,135,75,68,87,117,56,233,121,88,219,210,196,143,144])'
|
|
||||||
|
|
||||||
# [[176,246,225,18,58,227,9,73,39,226,58,47,31,68,217,1],1703674830]
|
|
||||||
node script/runcode.js 'numarrAddTime.reverse([244,178,165,86,126,167,77,13,99,166,126,107,91,0,157,69,33,200,71,138,68])'
|
|
||||||
|
|
||||||
# [16,114,228,100]
|
|
||||||
node script/runcode.js 'numToNumarr4(275965028)'
|
|
||||||
|
|
||||||
# [[62,189,79,239,168,99,174,140,1,153,3,3,4,2,6,4],1703674830]
|
|
||||||
node script/runcode.js 'numarrAddTime.reverse([125,254,12,172,235,32,237,207,66,218,64,64,71,65,69,71,38,207,64,141,67])'
|
|
||||||
|
|
||||||
# 96 [49,133,64,158,96,127,5,33,106,136,44,242,183,213,197,62,31,170,45,194,194,125,249,87,51,164,108,146,5,146,137,108,70,30,218,188,69,108,141,12,214,140,96,64,182,180,171,131,189,181,34,208,24,101,165,239,166,216,223,53,136,74,173,5,1,158,1,150,67,24,215,238,39,120,209,194,106,135,97,1,144,129,238,138,89,140,251,207,45,18,133,163,40,124,189,158]#
|
|
||||||
node script/runcode.js 'encryptMode1([113,144,156,223,101,83,195,174,4,185,91,225,184,252,93,153,75,251,157,125,174,124,254,219,45,174,54,214,49,215,22,157,207,98,75,89,36,104,66,182,182,135,10,17,85,77,173,187,217,91,220,109,182,218,10,222,3,145,174,53,214,46,227,109,176,239,231,191,226,237,119,238,54,187,92,221,250,237,141,246,214,23,54,122,210,227,92], [125,254,12,172,235,32,237,207,66,218,64,64,71,65,69,71,38,207,64,141,67])'
|
|
@ -61,7 +61,7 @@ module.exports = class {
|
|||||||
gv.cp2[39],
|
gv.cp2[39],
|
||||||
[gtn('0>one>55>one>3-189', 6)],
|
[gtn('0>one>55>one>3-189', 6)],
|
||||||
)
|
)
|
||||||
const cookie = '0' + numarr2string(
|
return '0' + numarr2string(
|
||||||
encryptMode1([
|
encryptMode1([
|
||||||
...numToNumarr4(this.r2mkaTime),
|
...numToNumarr4(this.r2mkaTime),
|
||||||
...numarrJoin(
|
...numarrJoin(
|
||||||
@ -86,7 +86,6 @@ module.exports = class {
|
|||||||
numarrAddTime(gv.keys[gv.cp2[2]], this.runTime)[0]
|
numarrAddTime(gv.keys[gv.cp2[2]], this.runTime)[0]
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
console.log(`生成cookie成功! \nlength: ${cookie.length}\ncookie: ${cookie}`)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getSubOne() {
|
getSubOne() {
|
||||||
|
@ -1,13 +1,16 @@
|
|||||||
const gv = require('../globalVarible');
|
const gv = require('../globalVarible');
|
||||||
const common = require('./common');
|
const common = require('./common');
|
||||||
|
const logger = require('@utils/logger');
|
||||||
|
|
||||||
function init(ts) {
|
function init(ts) {
|
||||||
|
const startTime = new Date().getTime();
|
||||||
gv.setAttr('utils', common);
|
gv.setAttr('utils', common);
|
||||||
gv.setAttr('ts', ts);
|
gv.setAttr('ts', ts);
|
||||||
require('./r2mka').init();
|
require('./r2mka').init();
|
||||||
require('./tscp').init();
|
require('./tscp').init();
|
||||||
require('./tscd').init();
|
require('./tscd').init();
|
||||||
require('./bignum').init();
|
require('./bignum').init();
|
||||||
|
logger.debug(`globalVarible完成初始化!用时:${new Date().getTime() - startTime}ms`);
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
const gv = require('../globalVarible');
|
const gv = require('../globalVarible');
|
||||||
const gt3 = require('@src/immutext/').globalText3;
|
const gt3 = require('@src/immutext/').globalText3;
|
||||||
|
const logger = require('@utils/logger');
|
||||||
|
|
||||||
function gtHandler(str, curr) {
|
function gtHandler(str, curr) {
|
||||||
return {
|
return {
|
||||||
@ -85,4 +86,5 @@ exports.parse = function(str = gt3) {
|
|||||||
|
|
||||||
exports.init = function() {
|
exports.init = function() {
|
||||||
gv.setAttr('r2mka', exports.parse(gt3));
|
gv.setAttr('r2mka', exports.parse(gt3));
|
||||||
|
logger.debug('头r2mka标识字符串完成解析!')
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
// 生成密钥
|
// 生成密钥
|
||||||
const gv = require('../globalVarible');
|
const gv = require('../globalVarible');
|
||||||
const decrypt = require('./common/decrypt');
|
const decrypt = require('./common/decrypt');
|
||||||
|
const logger = require('@utils/logger');
|
||||||
|
|
||||||
exports.init = function() {
|
exports.init = function() {
|
||||||
const cdArr = decrypt(gv.ts.cd);
|
const cdArr = decrypt(gv.ts.cd);
|
||||||
@ -18,4 +19,5 @@ exports.init = function() {
|
|||||||
op += gap;
|
op += gap;
|
||||||
}
|
}
|
||||||
gv.setAttr('keys', keys);
|
gv.setAttr('keys', keys);
|
||||||
|
logger.debug('$_ts.cd完成解析!')
|
||||||
};
|
};
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
// 将加密的字符串解密并切割成数组
|
// 将加密的字符串解密并切割成数组
|
||||||
const gv = require('../globalVarible');
|
const gv = require('../globalVarible');
|
||||||
const parse = require('./common/main');
|
const parse = require('./common/main');
|
||||||
|
const logger = require('@utils/logger');
|
||||||
|
|
||||||
exports.init = function() {
|
exports.init = function() {
|
||||||
gv.setAttr('cp0', parse(gv.ts.cp[0]));
|
gv.setAttr('cp0', parse(gv.ts.cp[0]));
|
||||||
gv.setAttr('cp2', parse(gv.ts.cp[2]).map(Number));
|
gv.setAttr('cp2', parse(gv.ts.cp[2]).map(Number));
|
||||||
gv.setAttr('cp6', parse(gv.ts.cp[6]));
|
gv.setAttr('cp6', parse(gv.ts.cp[6]));
|
||||||
|
logger.debug('$_ts.cp完成解析!')
|
||||||
}
|
}
|
||||||
|
@ -3,18 +3,34 @@ const paths = require('@utils/paths');
|
|||||||
const logger = require('@utils/logger');
|
const logger = require('@utils/logger');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
|
||||||
function writeFile(filepath, text) {
|
|
||||||
fs.writeFileSync(filepath, text);
|
|
||||||
console.info(`文件写入成功:${filepath}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = function (ts) {
|
module.exports = function (ts) {
|
||||||
logger.info(`传入的$_ts.nsd: ${ts.nsd}`);
|
const startTime = new Date().getTime();
|
||||||
logger.info(`传入的$_ts.cd: ${ts.cd}`);
|
|
||||||
const coder = new Coder(ts);
|
const coder = new Coder(ts);
|
||||||
const { code, $_ts } = coder.run();
|
const { code, $_ts } = coder.run();
|
||||||
writeFile(paths.outputResolve('dynamic-code.js'), code);
|
const files = [
|
||||||
writeFile(paths.outputResolve('output_ts.json'), JSON.stringify($_ts));
|
{
|
||||||
writeFile(paths.outputResolve('input_ts.json'), JSON.stringify(ts));
|
name: 'input_ts',
|
||||||
|
desc: '输入ts:',
|
||||||
|
text: JSON.stringify(ts),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'output_ts',
|
||||||
|
desc: '输出ts:',
|
||||||
|
text: JSON.stringify($_ts),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'dynamic_code',
|
||||||
|
desc: '动态代码:',
|
||||||
|
text: code,
|
||||||
|
},
|
||||||
|
].map(it => ({ ...it, filepath: paths.outputResolve(it.name) + '.js' }))
|
||||||
|
if (!fs.existsSync(paths.outputPath)) fs.mkdirSync(paths.outputPath);
|
||||||
|
files.forEach(({ filepath, text }) => fs.writeFileSync(filepath, text))
|
||||||
|
logger.info([
|
||||||
|
`生成动态代码成功!用时:${new Date().getTime() - startTime}ms\n`,
|
||||||
|
`${files[0].desc}${files[1].filepath}`,
|
||||||
|
`${files[1].desc}${files[1].filepath}`,
|
||||||
|
`${files[2].desc}${files[2].filepath}\n`,
|
||||||
|
].join('\n '));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,11 +3,10 @@ const Coder = require('./handler/Coder');
|
|||||||
const Cookie = require('./handler/Cookie');
|
const Cookie = require('./handler/Cookie');
|
||||||
|
|
||||||
module.exports = function (ts) {
|
module.exports = function (ts) {
|
||||||
logger.info(`传入的$_ts.nsd: ${ts.nsd}`);
|
const startTime = new Date().getTime();
|
||||||
logger.info(`传入的$_ts.cd: ${ts.cd}`);
|
|
||||||
const coder = new Coder(ts);
|
const coder = new Coder(ts);
|
||||||
const { code, $_ts } = coder.run();
|
const { code, $_ts } = coder.run();
|
||||||
const cookie = new Cookie($_ts);
|
const cookie = new Cookie($_ts).run();
|
||||||
cookie.run();
|
logger.info([`生成动态cookie成功!用时:${new Date().getTime() - startTime}ms\n`, `Cookie值: ${cookie}`, `Cookie长: ${cookie.length}\n`].join('\n '))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,11 +2,11 @@ const paths = require('@utils/paths');
|
|||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const { init } = require('@src/handler/parser/');
|
const { init } = require('@src/handler/parser/');
|
||||||
const pkg = require(paths.package);
|
const pkg = require(paths.package);
|
||||||
|
const logger = require('./logger');
|
||||||
|
|
||||||
module.exports = (function() {
|
module.exports = (function() {
|
||||||
const filename = pkg.tsfile;
|
const tsFullPath = paths.exampleResolve('codes', pkg.tsfile);
|
||||||
console.log(`初始化GlobalVarible变量,配置文件:${filename}`)
|
logger.debug(`初始化GlobalVarible变量,$_ts配置文件:${tsFullPath}`);
|
||||||
const tsFullPath = paths.exampleResolve('codes', filename);
|
|
||||||
init(JSON.parse(fs.readFileSync(tsFullPath, 'utf8')));
|
init(JSON.parse(fs.readFileSync(tsFullPath, 'utf8')));
|
||||||
return require('@src/handler/globalVarible');
|
return require('@src/handler/globalVarible');
|
||||||
})();
|
})();
|
||||||
|
@ -2,6 +2,6 @@ const paths = require('./paths');
|
|||||||
const pkg = require(paths.package);
|
const pkg = require(paths.package);
|
||||||
|
|
||||||
const logger = require('log4js').getLogger(pkg.name);
|
const logger = require('log4js').getLogger(pkg.name);
|
||||||
logger.level = pkg.logLevel;
|
logger.level = process.env.loglevel || pkg.logLevel;
|
||||||
|
|
||||||
module.exports = logger;
|
module.exports = logger;
|
||||||
|
@ -3,7 +3,7 @@ const fs = require('fs');
|
|||||||
|
|
||||||
const appDirectory = (() => {
|
const appDirectory = (() => {
|
||||||
// 返回项目根目录
|
// 返回项目根目录
|
||||||
const plist = fs.realpathSync(process.cwd()).split('/');
|
const plist = path.resolve(__dirname).split('/');
|
||||||
while (!fs.existsSync(path.resolve(plist.join('/'), 'package.json'))) {
|
while (!fs.existsSync(path.resolve(plist.join('/'), 'package.json'))) {
|
||||||
plist.pop();
|
plist.pop();
|
||||||
if (plist.length === 0) return false;
|
if (plist.length === 0) return false;
|
||||||
@ -14,14 +14,13 @@ const resolveApp = (...relativePath) => path.resolve(appDirectory, ...relativePa
|
|||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
basePath: resolveApp(''),
|
basePath: resolveApp(''),
|
||||||
homePath: __dirname,
|
|
||||||
modulePath: resolveApp('node_modules'),
|
modulePath: resolveApp('node_modules'),
|
||||||
binPath: resolveApp('node_modules/.bin/'),
|
binPath: resolveApp('node_modules/.bin/'),
|
||||||
package: path.resolve('package.json'),
|
package: resolveApp('package.json'),
|
||||||
resolve: resolveApp,
|
resolve: resolveApp,
|
||||||
srcPath: resolveApp('src'),
|
srcPath: resolveApp('src'),
|
||||||
outputPath: resolveApp('output'),
|
outputPath: path.resolve('output'),
|
||||||
outputResolve: (...p) => resolveApp('output', ...p),
|
outputResolve: (...p) => path.resolve('output', ...p),
|
||||||
examplePath: resolveApp('example'),
|
examplePath: resolveApp('example'),
|
||||||
exampleResolve: (...p) => resolveApp('example', ...p),
|
exampleResolve: (...p) => resolveApp('example', ...p),
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user