From 709a456ecd6201c3f74f76acf9d332ff6b503a2f Mon Sep 17 00:00:00 2001 From: mhsjlw Date: Thu, 16 Jun 2016 08:14:33 -0400 Subject: [PATCH] decrypt our first packet --- package.json | 1 + src/createServer.js | 95 +++++++++++++++++---------------------------- 2 files changed, 37 insertions(+), 59 deletions(-) diff --git a/package.json b/package.json index 8835beb..1c2cd02 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "asn1": "^0.2.3", "bn.js": "^4.11.4", "jwt-simple": "^0.5.0", + "lodash.merge": "^4.4.0", "prismarine-nbt": "^1.0.0", "protodef": "^1.2.0", "raknet": "^1.7.4", diff --git a/src/createServer.js b/src/createServer.js index 845da65..71520c1 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -5,6 +5,7 @@ const ProtoDef = require('protodef').ProtoDef; const jwt = require('jwt-simple'); const crypto = require('crypto'); const Ber = require('asn1').Ber; +const merge=require("lodash.merge"); // const BN = require('bn.js'); const batchProto = new ProtoDef(); @@ -51,7 +52,17 @@ function createServer(options) { server.playerCount = 0; server.on("connection", function(client) { - client.on("mcpe", packet => client.emit(packet.name, packet.params)); + + + //if(encryptionEnabled) { + // client.on('mcpe', packet => { decipher.write(packet); }) + //} else { + client.on("mcpe", packet => { + client.emit(packet.name, packet.params) + }); + //} + + // decipher.on('data', data => console.log(data)) client.on("game_login", packet => { var body = packet.body; @@ -87,16 +98,31 @@ function createServer(options) { ec.generateKeys(); client.sharedSecret = ec.computeSecret(pubKey); - client.secretKeyBytes = crypto.createHash('sha256').update(client.sharedSecret + "SO SECRET VERY SECURE").digest('binary'); - // console.log(client.secretKeyBytes.length); => 32 + client.secretKeyBytes = crypto.createHash('sha256'); + client.secretKeyBytes.update("SO SECRET VERY SECURE"); + client.secretKeyBytes.update(client.sharedSecret) + client.secretKeyBytes = new Buffer(client.secretKeyBytes.digest()) client.writeMCPE('server_to_client_handshake', { publicKey: ec.getPublicKey('base64'), serverToken: "SO SECRET VERY SECURE" // obviously, this is super secure (it's not, change it) }); - + //console.log('secret', new Buffer(client.secretKeyBytes)); + var decipher = crypto.createDecipheriv('aes-256-cfb8', client.secretKeyBytes, client.secretKeyBytes.slice(0,16)); + let customPackets=require("../data/protocol"); + customPackets['types']['encapsulated_packet'][1][1]['type'][1]['fields']['mcpe'] = 'restBuffer'; + client.encapsulatedPacketParser.proto.addTypes(merge(require('raknet').protocol, customPackets).types); encryptionEnabled = true; - customPackets['types']['encapsulated_packet'][1][1]['type'][1]['fields']['mcpe']='restBuffer'; client.encapsulatedPacketParser.proto.addTypes(merge(require('raknet').protocol,customPackets).types); + + client.on("mcpe", packet => { + //console.log('THE CONSOLELOG') + //console.log(packet); + //console.log('---------------') + decipher.write(packet); + }); + decipher.on('data', data => console.log('decrypt', data)) + + //client.on('mcpe', packet => { decipher.write(packet); }) client.emit('login', { displayName: client.displayName, @@ -109,23 +135,13 @@ function createServer(options) { }); client.writeMCPE = (name, packet) => { - if (!encryptionEnabled) { - client.writeEncapsulated("mcpe", { - name: name, - params: packet - }); - } else { - sendCounter += 1; - // sendCounter.add(1); - // client.writeEncapsulated("mcpe", { - // name: name, - // params: packet - // }); - } + client.writeEncapsulated("mcpe", { + name: name, + params: packet + }); }; client.writeBatch = function(packets) { - if (!encryptionEnabled) { const payload = zlib.deflateSync(batchProto.createPacketBuffer("insideBatch", packets.map(packet => client.encapsulatedPacketSerializer.createPacketBuffer(packet).slice(1)))); @@ -133,54 +149,15 @@ function createServer(options) { client.writeMCPE("batch", { payload: payload }); - } else { - sendCounter += 1; - // sendCounter.add(1); - // const payload = zlib.deflateSync(batchProto.createPacketBuffer("insideBatch", - // packets.map(packet => - // client.encapsulatedPacketSerializer.createPacketBuffer(packet).slice(1)))); - // - // client.writeMCPE("batch", { - // payload: payload - // }); - } }; client.on('batch', function(packet) { var buf = zlib.inflateSync(packet.payload); var packets = batchProto.parsePacketBuffer("insideBatch", buf).data; - if (!encryptionEnabled) { - packets.forEach(packet => client.readEncapsulatedPacket(Buffer.concat([new Buffer([0xfe]), packet]))); - } else { - sendCounter += 1; - // sendCounter.add(1); - // packets.forEach(packet => client.readEncapsulatedPacket(Buffer.concat([new Buffer([0xfe]),packet]))); - } + packets.forEach(packet => client.readEncapsulatedPacket(Buffer.concat([new Buffer([0xfe]), packet]))); }); }); return server; } module.exports = createServer; - -// http://stackoverflow.com/questions/19236327/nodejs-sha256-password-encryption -var AES = {}; - -AES.decrypt = function(cryptkey, iv, encryptdata) { - encryptdata = new Buffer(encryptdata, 'base64').toString('binary'); - - var decipher = crypto.createDecipheriv('aes-256-cbc', cryptkey, iv), - decoded = decipher.update(encryptdata, 'binary', 'utf8'); - - decoded += decipher.final('utf8'); - return decoded; -} - -AES.encrypt = function(cryptkey, iv, cleardata) { - var encipher = crypto.createCipheriv('aes-256-cbc', cryptkey, iv), - encryptdata = encipher.update(cleardata, 'utf8', 'binary'); - - encryptdata += encipher.final('binary'); - encode_encryptdata = new Buffer(encryptdata, 'binary').toString('base64'); - return encode_encryptdata; -}