Create app.js
This commit is contained in:
@@ -0,0 +1,158 @@
|
||||
const express = require('express');
|
||||
const fs = require('fs');
|
||||
const app = express();
|
||||
const port = 3000;
|
||||
|
||||
app.use((req, res, next) => {
|
||||
res.setHeader('X-Powered-By', 'Made by UltraLion');
|
||||
next();
|
||||
});
|
||||
|
||||
function WinSCP() {
|
||||
var WSCP_CHARS = [];
|
||||
var WSCP_SIMPLE_MAGIC = 0xA3;
|
||||
var WSCP_SIMPLE_STRING = '0123456789ABCDEF';
|
||||
var WSCP_SIMPLE_MAXLEN = 50;
|
||||
var WSCP_SIMPLE_FLAG = 0xFF;
|
||||
var WSCP_SIMPLE_INTERNAL = 0x00;
|
||||
|
||||
function rand(min, max) {
|
||||
return Math.floor(Math.random() * (max - min + 1)) + min;
|
||||
}
|
||||
|
||||
function _simple_encrypt_char(char) {
|
||||
char = ~char ^ WSCP_SIMPLE_MAGIC;
|
||||
|
||||
var a = (char & 0xF0) >> 4;
|
||||
var b = (char & 0x0F) >> 0;
|
||||
|
||||
return [WSCP_SIMPLE_STRING[a], WSCP_SIMPLE_STRING[b]].join('');
|
||||
}
|
||||
|
||||
function _simple_decrypt_next_char() {
|
||||
if (WSCP_CHARS.length == 0) {
|
||||
return WSCP_SIMPLE_INTERNAL;
|
||||
}
|
||||
|
||||
var a = WSCP_SIMPLE_STRING.indexOf(WSCP_CHARS.shift());
|
||||
var b = WSCP_SIMPLE_STRING.indexOf(WSCP_CHARS.shift());
|
||||
|
||||
return WSCP_SIMPLE_FLAG & ~(((a << 4) + b << 0) ^ WSCP_SIMPLE_MAGIC);
|
||||
}
|
||||
|
||||
// Encrypt password
|
||||
this.encrypt = function(username, hostname, password) {
|
||||
var salt = [username, hostname, password].join(''), shift = 0;
|
||||
|
||||
if (salt.length < WSCP_SIMPLE_MAXLEN) {
|
||||
shift = rand(0, WSCP_SIMPLE_MAXLEN - salt.length);
|
||||
}
|
||||
|
||||
result = [];
|
||||
result.push(_simple_encrypt_char(WSCP_SIMPLE_FLAG));
|
||||
result.push(_simple_encrypt_char(WSCP_SIMPLE_INTERNAL));
|
||||
result.push(_simple_encrypt_char(salt.length));
|
||||
result.push(_simple_encrypt_char(shift));
|
||||
|
||||
for (var i = 0; i < shift; i++) {
|
||||
result.push(_simple_encrypt_char(rand(0, 256)));
|
||||
}
|
||||
|
||||
for (var i = 0; i < salt.length; i++) {
|
||||
result.push(_simple_encrypt_char(salt[i].charCodeAt(0)));
|
||||
}
|
||||
|
||||
while (result.length < WSCP_SIMPLE_MAXLEN * 2) {
|
||||
result.push(_simple_encrypt_char(rand(0, 256)));
|
||||
}
|
||||
|
||||
return result.join('');
|
||||
}
|
||||
|
||||
// Descrypt password
|
||||
this.decrypt = function(username, hostname, encrypted) {
|
||||
if (!encrypted.match(/[A-F0-9]+/)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
var result = [], key = [username, hostname].join('');
|
||||
|
||||
WSCP_CHARS = encrypted.split('');
|
||||
|
||||
var flag = _simple_decrypt_next_char(), length;
|
||||
|
||||
if (flag == WSCP_SIMPLE_FLAG) {
|
||||
_simple_decrypt_next_char();
|
||||
length = _simple_decrypt_next_char();
|
||||
} else {
|
||||
length = flag;
|
||||
}
|
||||
|
||||
WSCP_CHARS = WSCP_CHARS.slice(_simple_decrypt_next_char() * 2);
|
||||
|
||||
for (var i = 0; i < length; i++) {
|
||||
result.push(String.fromCharCode(_simple_decrypt_next_char()));
|
||||
}
|
||||
|
||||
if (flag == WSCP_SIMPLE_FLAG) {
|
||||
var valid = result.slice(0, key.length).join('');
|
||||
|
||||
if (valid != key) {
|
||||
result = [];
|
||||
} else {
|
||||
result = result.slice(key.length);
|
||||
}
|
||||
}
|
||||
|
||||
WSCP_CHARS = [];
|
||||
|
||||
return result.join('');
|
||||
}
|
||||
}
|
||||
|
||||
const winSCP = new WinSCP();
|
||||
function decodePassword(username, hostname, encodedPassword) {
|
||||
const decodedPassword = winSCP.decrypt(username, hostname, encodedPassword);
|
||||
return decodedPassword;
|
||||
}
|
||||
|
||||
app.get('/decodeAll', (req, res) => {
|
||||
const filePath = 'WinSCP.ini'; // Replace with the path to your WinSCP.ini file
|
||||
|
||||
fs.readFile(filePath, 'utf8', (err, data) => {
|
||||
if (err) {
|
||||
return res.status(500).send('Error reading file');
|
||||
}
|
||||
|
||||
const sessions = data.split('\n[').filter(session => session.startsWith('Sessions\\'));
|
||||
const decodedSessions = sessions.map(session => {
|
||||
const sessionName = decodeURIComponent(session.split(']')[0].replace('Sessions\\', ''));
|
||||
const usernameLine = session.split('\n').find(line => line.startsWith('UserName='));
|
||||
const hostnameLine = session.split('\n').find(line => line.startsWith('HostName='));
|
||||
const passwordLine = session.split('\n').find(line => line.startsWith('Password='));
|
||||
|
||||
if (usernameLine && hostnameLine && passwordLine) {
|
||||
const username = usernameLine.split('=')[1].trim();
|
||||
const hostname = hostnameLine.split('=')[1].trim();
|
||||
const encodedPassword = passwordLine.split('=')[1].trim();
|
||||
const decodedPassword = decodePassword(username, hostname, encodedPassword);
|
||||
return {
|
||||
session: sessionName,
|
||||
username,
|
||||
hostname,
|
||||
decodedPassword
|
||||
};
|
||||
}
|
||||
return {
|
||||
session: sessionName,
|
||||
decodedPassword: 'Password not found'
|
||||
};
|
||||
});
|
||||
|
||||
res.send(decodedSessions);
|
||||
});
|
||||
});
|
||||
|
||||
app.listen(port, () => {
|
||||
console.log(`Server running on http://localhost:${port}`);
|
||||
});
|
||||
Reference in New Issue
Block a user