Commit 402f4060 authored by Benjamin Chelli's avatar Benjamin Chelli

Refactor the SMB2 Message creation - step 1

parent 6b90ff58
var SMB2Message = require('../message')
var SMB2Message = require('../tools/smb2-message')
, message = require('../tools/message')
;
......
var SMB2Message = require('../message')
var SMB2Message = require('../tools/smb2-message')
, message = require('../tools/message')
;
......
var SMB2Message = require('../message')
var SMB2Message = require('../tools/smb2-message')
, message = require('../tools/message')
;
......
var SMB2Message = require('../message')
var SMB2Message = require('../tools/smb2-message')
, message = require('../tools/message')
;
......
var SMB2Message = require('../message')
var SMB2Message = require('../tools/smb2-message')
, message = require('../tools/message')
;
......
var SMB2Message = require('../message')
var SMB2Message = require('../tools/smb2-message')
, message = require('../tools/message')
;
......
var SMB2Message = require('../message')
var SMB2Message = require('../tools/smb2-message')
, message = require('../tools/message')
;
......
var SMB2Message = require('../message')
var SMB2Message = require('../tools/smb2-message')
, message = require('../tools/message')
;
......
var SMB2Message = require('../message')
var SMB2Message = require('../tools/smb2-message')
, message = require('../tools/message')
, ntlm = require('ntlm')
;
......
var SMB2Message = require('../message')
var SMB2Message = require('../tools/smb2-message')
, message = require('../tools/message')
, ntlm = require('ntlm')
;
......
var SMB2Message = require('../message')
var SMB2Message = require('../tools/smb2-message')
, message = require('../tools/message')
;
......
var SMB2Message = require('../message')
var SMB2Message = require('../tools/smb2-message')
, message = require('../tools/message')
;
......
var SMB2Message = require('../message')
var SMB2Message = require('../tools/smb2-message')
, message = require('../tools/message')
;
......
......@@ -13,7 +13,8 @@ var shareRegExp = /\\\\([^\\]*)\\([^\\]*)\\?/
*/
var net = require('net')
, bigint = require('./tools/bigint')
, SMB2Message = require('./message')
, SMB2Forge = require('./tools/smb2-forge')
, SMB2Request = SMB2Forge.request
, fs = require('fs')
;
......@@ -62,7 +63,7 @@ var SMB = module.exports = function(opt){
});
// attach data events to socket
this.socket.on('data', parseResponse(this));
this.socket.on('data', SMB2Forge.response(this));
var connection = this;
connection.errorHandler = [];
this.socket.on('error', function(err){
......@@ -609,114 +610,3 @@ function removeErrorListener(connection){
}
/*
* MESSAGE MANAGMENT
*/
function SMB2Request(messageName, params, connection, cb){
var msg = require('./messages/'+messageName)
, smbMessage = msg.generate(connection, params)
;
// send
sendNetBiosMessage(
connection
, smbMessage
);
// wait for the response
getResponse(
connection
, smbMessage.getHeaders().MessageId
, msg.parse(connection, cb)
);
}
function sendNetBiosMessage(connection, message) {
var smbRequest = message.getBuffer();
if(connection.debug){
console.log('--request');
console.log(smbRequest.toString('hex'));
}
// create NetBios package
var buffer = new Buffer(smbRequest.length+4);
// write NetBios cmd
buffer.writeUInt8(0x00, 0);
// write message length
buffer.writeUInt8((0xFF0000 & smbRequest.length) >> 16, 1);
buffer.writeUInt16BE(0xFFFF & smbRequest.length, 2);
// write message content
smbRequest.copy(buffer, 4, 0, smbRequest.length);
// Send it !!!
connection.newResponse = false;
connection.socket.write(buffer);
return true;
}
function parseResponse(c){
c.responses = {};
c.responsesCB = {};
c.responseBuffer = new Buffer(0);
return function(response){
// concat new response
c.responseBuffer = Buffer.concat([c.responseBuffer, response]);
// extract complete messages
var extract = true;
while(extract){
extract = false;
// has a message header
if(c.responseBuffer.length >= 4) {
// message is complete
var msgLength = (c.responseBuffer.readUInt8(1) << 16) + c.responseBuffer.readUInt16BE(2);
if(c.responseBuffer.length >= msgLength + 4) {
// set the flags
extract = true;
// parse message
var r = c.responseBuffer.slice(4, msgLength+4)
, message = new SMB2Message()
;
message.parseBuffer(r);
//debug
if(c.debug){
console.log('--response');
console.log(r.toString('hex'));
}
// get the message id
var mId = message.getHeaders().MessageId.toString('hex');
// check if the message can be dispatched
// or store it
if(c.responsesCB[mId]) {
c.responsesCB[mId](message);
delete c.responsesCB[mId];
} else {
c.responses[mId] = message;
}
// remove from response buffer
c.responseBuffer = c.responseBuffer.slice(msgLength+4);
}
}
}
}
}
function getResponse(c, mId, cb) {
var messageId = new Buffer(4);
messageId.writeUInt32LE(mId, 0);
messageId = messageId.toString('hex');
if(c.responses[messageId]) {
cb(c.responses[messageId]);
delete c.responses[messageId];
} else {
c.responsesCB[messageId] = cb;
}
}
/*
* DEPENDENCIES
*/
var SMB2Message = require('./smb2-message');
/*
* SMB2 MESSAGE FORGE
*/
var SMB2Forge = module.exports = {};
/*
* SMB2 MESSAGE FORGE
*/
SMB2Forge.request = function(messageName, params, connection, cb){
var msg = require('../messages/'+messageName)
, smbMessage = msg.generate(connection, params)
;
// send
sendNetBiosMessage(
connection
, smbMessage
);
// wait for the response
getResponse(
connection
, smbMessage.getHeaders().MessageId
, msg.parse(connection, cb)
);
}
/*
* SMB2 RESPONSE MESSAGE PARSER
*/
SMB2Forge.response = function(c){
c.responses = {};
c.responsesCB = {};
c.responseBuffer = new Buffer(0);
return function(response){
// concat new response
c.responseBuffer = Buffer.concat([c.responseBuffer, response]);
// extract complete messages
var extract = true;
while(extract){
extract = false;
// has a message header
if(c.responseBuffer.length >= 4) {
// message is complete
var msgLength = (c.responseBuffer.readUInt8(1) << 16) + c.responseBuffer.readUInt16BE(2);
if(c.responseBuffer.length >= msgLength + 4) {
// set the flags
extract = true;
// parse message
var r = c.responseBuffer.slice(4, msgLength+4)
, message = new SMB2Message()
;
message.parseBuffer(r);
//debug
if(c.debug){
console.log('--response');
console.log(r.toString('hex'));
}
// get the message id
var mId = message.getHeaders().MessageId.toString('hex');
// check if the message can be dispatched
// or store it
if(c.responsesCB[mId]) {
c.responsesCB[mId](message);
delete c.responsesCB[mId];
} else {
c.responses[mId] = message;
}
// remove from response buffer
c.responseBuffer = c.responseBuffer.slice(msgLength+4);
}
}
}
}
}
/*
* HELPERS
*/
function sendNetBiosMessage(connection, message) {
var smbRequest = message.getBuffer();
if(connection.debug){
console.log('--request');
console.log(smbRequest.toString('hex'));
}
// create NetBios package
var buffer = new Buffer(smbRequest.length+4);
// write NetBios cmd
buffer.writeUInt8(0x00, 0);
// write message length
buffer.writeUInt8((0xFF0000 & smbRequest.length) >> 16, 1);
buffer.writeUInt16BE(0xFFFF & smbRequest.length, 2);
// write message content
smbRequest.copy(buffer, 4, 0, smbRequest.length);
// Send it !!!
connection.newResponse = false;
connection.socket.write(buffer);
return true;
}
function getResponse(c, mId, cb) {
var messageId = new Buffer(4);
messageId.writeUInt32LE(mId, 0);
messageId = messageId.toString('hex');
if(c.responses[messageId]) {
cb(c.responses[messageId]);
delete c.responses[messageId];
} else {
c.responsesCB[messageId] = cb;
}
}
......@@ -115,7 +115,7 @@ proto.setHeaders = function(obj){
for(var key in obj){
this.headers[key] = obj[key];
}
this.structure = require('./structures/'+this.headers['Command'].toLowerCase());
this.structure = require('../structures/'+this.headers['Command'].toLowerCase());
}
proto.getHeaders = function(){
......@@ -260,7 +260,7 @@ function readHeaders(message, buffer){
}
offset += length;
}
message.structure = require('./structures/'+message.headers['Command'].toLowerCase());
message.structure = require('../structures/'+message.headers['Command'].toLowerCase());
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment