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