added the test code that AJ wrote
This commit is contained in:
parent
28cfda23a6
commit
79e976f665
113
README.md
113
README.md
|
@ -132,8 +132,116 @@ the binary output comes out as:
|
|||
00000000
|
||||
```
|
||||
|
||||
In order to figure out where the dnspacket code is going wrong,
|
||||
We will have to write our own test code to see if the dns code
|
||||
is doing what it's supposed to be doing.
|
||||
|
||||
Looking at the code below:
|
||||
|
||||
```javascript
|
||||
// parses through the flags
|
||||
// val can be 1 or 0
|
||||
// (val & 0x8000) >> 15 does the following
|
||||
// val = 0000 0000 0000 0001
|
||||
// & 1001 0000 0000 0000
|
||||
// _______________________
|
||||
// 0000 0000 0000 0000
|
||||
// same if val were 0
|
||||
// but if val were 0x8000
|
||||
// then
|
||||
// (val & 0x8000) >> 15 does the following
|
||||
// val = 1001 0000 0000 0001
|
||||
// & 1001 0000 0000 0000
|
||||
// _______________________
|
||||
// 1001 0000 0000 0000
|
||||
// >>15= 0000 0000 0000 0001
|
||||
|
||||
function parseFlags(val, packet) {
|
||||
packet.header.qr = (val & 0x8000) >> 15;
|
||||
packet.header.opcode = (val & 0x7800) >> 11;
|
||||
packet.header.aa = (val & 0x400) >> 10;
|
||||
packet.header.tc = (val & 0x200) >> 9;
|
||||
packet.header.rd = (val & 0x100) >> 8;
|
||||
packet.header.ra = (val & 0x80) >> 7;
|
||||
packet.header.res1 = (val & 0x40) >> 6;
|
||||
packet.header.res2 = (val & 0x20) >> 5;
|
||||
packet.header.res3 = (val & 0x10) >> 4;
|
||||
packet.header.rcode = (val & 0xF);
|
||||
}
|
||||
```
|
||||
|
||||
One effective way to check is to create a dns packet, pass it to
|
||||
a custom packer and parser function and compare the input and output:
|
||||
|
||||
```javascript
|
||||
'use strict';
|
||||
|
||||
// order one http://www.binarytides.com/dns-query-code-in-c-with-linux-sockets/
|
||||
// order two http://www.zytrax.com/books/dns/ch15/
|
||||
|
||||
function parse(i) {
|
||||
var header = {
|
||||
// first byte appears to be reverse
|
||||
qr: (i & 0x8000) >> 15
|
||||
, opcode: (i & 0x7800) >> 11
|
||||
, aa: (i & 0x400) >> 10
|
||||
, tc: (i & 0x200) >> 9
|
||||
, rd: (i & 0x100) >> 8
|
||||
|
||||
// second byte appears to be second byte, but also in reverse
|
||||
, ra: (i & 0x80) >> 7
|
||||
, res1: (i & 0x40) >> 6 // z
|
||||
, res2: (i & 0x20) >> 5 // ad
|
||||
, res3: (i & 0x10) >> 4 // cd
|
||||
, rcode: (i & 0x1F)
|
||||
};
|
||||
|
||||
return header;
|
||||
}
|
||||
|
||||
function pack(header) {
|
||||
var val = 0;
|
||||
|
||||
val += (header.qr << 15) & 0x8000;
|
||||
val += (header.opcode << 11) & 0x7800;
|
||||
val += (header.aa << 10) & 0x400;
|
||||
val += (header.tc << 9) & 0x200;
|
||||
val += (header.rd << 8) & 0x100;
|
||||
val += (header.ra << 7) & 0x80;
|
||||
val += (header.res1 << 6) & 0x40;
|
||||
val += (header.res2 << 5) & 0x20;
|
||||
val += (header.res3 << 4) & 0x10;
|
||||
val += header.rcode & 0x1F;
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
var start = {
|
||||
qr: 1
|
||||
, opcode: 12
|
||||
, aa: 0
|
||||
, tc: 0
|
||||
, rd: 1
|
||||
, ra: 0
|
||||
, res1: 0
|
||||
, res2: 0
|
||||
, res3: 0
|
||||
, rcode: 0
|
||||
};
|
||||
|
||||
var i = pack(start);
|
||||
|
||||
var obj = parse(i);
|
||||
|
||||
console.log(i);
|
||||
console.log(start);
|
||||
console.log(obj);
|
||||
// does a recursive check to see if start and obj are equal
|
||||
require('assert').deepEqual(start, obj);
|
||||
|
||||
```
|
||||
|
||||
|
||||
What are the possible problems?
|
||||
|
||||
|
||||
How to print out hex values of the DNS message in node.js?
|
||||
|
@ -150,4 +258,5 @@ socket.on('message', function (message, rinfo) {
|
|||
|
||||
|
||||
DNS sec: security
|
||||
puts a signature on a DNS packet and imprints a signature so that the sender of the packet is confirmed
|
||||
puts a signature on a DNS packet and imprints a signature so that the sender of
|
||||
the packet is confirmed
|
||||
|
|
|
@ -4,6 +4,94 @@
|
|||
// This test code is meant to take a binary sample from the crash of listen.js
|
||||
// example and parse through it to spot where the error occurs.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*************** ********** Functions *******************/
|
||||
/**************************************************************/
|
||||
|
||||
|
||||
// Number generator function: this function should be able to generate
|
||||
// and output all the the binary combinations of a 8 bits and returns a buffer.
|
||||
// ex '00000000' - '11111111'
|
||||
|
||||
function cycleThroughHex(){
|
||||
// Fill the array from 0 - 65535, so the 65535 case will
|
||||
// have to be hardcoded
|
||||
var current_val = 0;
|
||||
var end_val = 65536;
|
||||
var i = 0;
|
||||
var array_size = 65536;
|
||||
var arr = new Uint16Array(array_size);
|
||||
// var buf = new Buffer.alloc(array_size);
|
||||
while (current_val <= end_val){
|
||||
|
||||
console.log(arr[i]);
|
||||
arr[i] = current_val;val += header.rcode & 0val += header.rcode & 0xF;xF;
|
||||
current_val++;
|
||||
}
|
||||
var buf = Buffer.from(arr.buffer);
|
||||
// console.log(buf);
|
||||
// console.log(buf.length);
|
||||
// console.log(buf[buf.length]);
|
||||
|
||||
// for (var i = 0; i < buf.length; i++){
|
||||
// console.log(buf[i]);
|
||||
// }
|
||||
|
||||
// return buf;
|
||||
// this is printing out 10,000 for some reason?
|
||||
}
|
||||
|
||||
|
||||
// message packer:
|
||||
|
||||
|
||||
// message parser:
|
||||
function hasError(output, int, flag){
|
||||
var hasError = 0;
|
||||
if (output > 0x0001 || output < 0x0000){
|
||||
console.log("There was an error with" + flag + " at index ", i , ". Output: " + output);
|
||||
hasError = 1;
|
||||
}
|
||||
return hasError;
|
||||
|
||||
}
|
||||
|
||||
|
||||
function main (){
|
||||
|
||||
// var val1 = '00000000';
|
||||
// var val2 = '11111111';
|
||||
// var val3 = '10101010';
|
||||
// var val4 = '01010101';
|
||||
var output = 0;
|
||||
var buf = cycleThroughHex();
|
||||
var val = 0;
|
||||
for (var i = 0; i < buf.length; i++){
|
||||
|
||||
val = buf[i];
|
||||
output = (val & 0x8000) >> 15; // test for qr
|
||||
hasError(output, i, 'qr')
|
||||
output = (val & 0x400) >> 10; // test for aa
|
||||
hasError(output, i, 'aa');
|
||||
output = (val & 0x200) >> 9; // test for tc
|
||||
hasError(output,i, 'tc');
|
||||
output = (val & 0x100) >> 8; // test for rd
|
||||
hasError(output, i , 'rd');
|
||||
output = (val & 0x80) >> 7; // test for ra
|
||||
hasError(output, i, 'ra');
|
||||
|
||||
}
|
||||
|
||||
console.log("test successful");
|
||||
|
||||
}
|
||||
|
||||
|
||||
// ex: pad('11111', 8, '0')
|
||||
function pad(str, len, ch) {
|
||||
|
||||
|
@ -25,21 +113,6 @@ function bin2hex(str){
|
|||
return hex;
|
||||
}
|
||||
|
||||
// ex: hex2ascii('A92F')
|
||||
function hex2ascii(str){
|
||||
|
||||
var hex = str.toString();
|
||||
var ascii = '';
|
||||
for (var n = 0; n < hex.length; n+=2) {
|
||||
ascii += String.fromCharCode(parseInt(hex.substr(n,2), 16));
|
||||
}
|
||||
|
||||
|
||||
return ascii;
|
||||
|
||||
}
|
||||
|
||||
|
||||
function binaryAgent(str) {
|
||||
|
||||
var binString = '';
|
||||
|
@ -50,22 +123,90 @@ str.split(' ').map(function(bin) {
|
|||
return binString;
|
||||
}
|
||||
|
||||
var str = binaryAgent('01000001 01110010 01100101 01101110 00100111 01110100');
|
||||
|
||||
console.log(str);
|
||||
// binary Agent test
|
||||
|
||||
// var str = binaryAgent('01000001 01110010 01100101 01101110 00100111 01110100');
|
||||
|
||||
// console.log(str);
|
||||
|
||||
// cycleThroughHex();
|
||||
// var hex = (0x8000 & 0x8000) >> 15;
|
||||
// console.log(hex.toString(16));
|
||||
|
||||
// main();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
'use strict';
|
||||
|
||||
// order one http://www.binarytides.com/dns-query-code-in-c-with-linux-sockets/
|
||||
// order two http://www.zytrax.com/books/dns/ch15/
|
||||
|
||||
function parse(i) {
|
||||
var header = {
|
||||
// first byte appears to be reverse
|
||||
qr: (i & 0x8000) >> 15
|
||||
, opcode: (i & 0x7800) >> 11
|
||||
, aa: (i & 0x400) >> 10
|
||||
, tc: (i & 0x200) >> 9
|
||||
, rd: (i & 0x100) >> 8
|
||||
|
||||
// second byte appears to be second byte, but also in reverse
|
||||
, ra: (i & 0x80) >> 7
|
||||
, res1: (i & 0x40) >> 6 // z
|
||||
, res2: (i & 0x20) >> 5 // ad
|
||||
, res3: (i & 0x10) >> 4 // cd
|
||||
, rcode: (i & 0x1F)
|
||||
};
|
||||
|
||||
return header;
|
||||
}
|
||||
|
||||
function pack(header) {
|
||||
var val = 0;
|
||||
|
||||
val += (header.qr << 15) & 0x8000;
|
||||
val += (header.opcode << 11) & 0x7800;
|
||||
val += (header.aa << 10) & 0x400;
|
||||
val += (header.tc << 9) & 0x200;
|
||||
val += (header.rd << 8) & 0x100;
|
||||
val += (header.ra << 7) & 0x80;
|
||||
val += (header.res1 << 6) & 0x40;
|
||||
val += (header.res2 << 5) & 0x20;
|
||||
val += (header.res3 << 4) & 0x10;
|
||||
val += header.rcode & 0x1F;
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
var start = {
|
||||
qr: 1
|
||||
, opcode: 12
|
||||
, aa: 0
|
||||
, tc: 0
|
||||
, rd: 1
|
||||
, ra: 0
|
||||
, res1: 0
|
||||
, res2: 0
|
||||
, res3: 0
|
||||
, rcode: 0
|
||||
};
|
||||
|
||||
var i = pack(start);
|
||||
|
||||
var obj = parse(i);
|
||||
|
||||
console.log(i);
|
||||
console.log(start);
|
||||
console.log(obj);
|
||||
// does a recursive check to see if start and obj are equal
|
||||
require('assert').deepEqual(start, obj);
|
||||
|
||||
parse
|
||||
//translates to "Aren't"
|
||||
|
||||
|
||||
// // binary to hex convestion
|
||||
// var bin = '00001111';
|
||||
// var hex = bin2hex(bin);
|
||||
|
||||
// // hex to ascii character converstion
|
||||
// console.log('binary: ' + bin + ' Hex: ' + hex);
|
||||
|
||||
// var hex = '';
|
||||
// var ascii = hex2ascii(hex);
|
||||
|
||||
// console.log('Hex: ' + hex + ' ascii: ' + ascii);
|
||||
|
|
Loading…
Reference in New Issue