WIP unpack question and resource records
This commit is contained in:
parent
2f4807d1b4
commit
633e60d643
120
bin/debug.js
120
bin/debug.js
|
@ -5,7 +5,7 @@ var input = process.argv[2];
|
|||
var fs = require('fs');
|
||||
var nb = fs.readFileSync(input, null);
|
||||
|
||||
var ab = nb.buffer.slice(nb.byteOffset, nb.byteOffset + nb.byteLength)
|
||||
var ab = nb.buffer.slice(nb.byteOffset, nb.byteOffset + nb.byteLength);
|
||||
var dv = new DataView(ab);
|
||||
|
||||
//
|
||||
|
@ -19,36 +19,130 @@ console.log('');
|
|||
|
||||
console.log('id (int)', dv.getUint16(0));
|
||||
|
||||
var i = dv.getUint16(2, false);
|
||||
console.log('header 0x', i.toString(16));
|
||||
var flags = dv.getUint16(2, false);
|
||||
console.log('header 0x', flags.toString(16));
|
||||
var flagsstr = ''
|
||||
+ 'qr ' + ((i & 0x8000) >> 15) + ', '
|
||||
+ 'opcode ' + ((i & 0x7800) >> 11) + ', '
|
||||
+ 'aa ' + ((i & 0x400) >> 10) + ', '
|
||||
+ 'tc ' + ((i & 0x200) >> 9) + ', '
|
||||
+ 'rd ' + ((i & 0x100) >> 8) + ', '
|
||||
+ 'ra ' + ((i & 0x80) >> 7) + ', '
|
||||
+ 'res1 ' + ((i & 0x40) >> 6) + ', '
|
||||
+ 'res2 ' + ((i & 0x20) >> 5) + ', '
|
||||
+ 'res3 ' + ((i & 0x10) >> 4) + ', '
|
||||
+ 'rcode ' + ((i & 0xF));
|
||||
+ 'qr ' + ((flags & 0x8000) >> 15) + ', '
|
||||
+ 'opcode ' + ((flags & 0x7800) >> 11) + ', '
|
||||
+ 'aa ' + ((flags & 0x400) >> 10) + ', '
|
||||
+ 'tc ' + ((flags & 0x200) >> 9) + ', '
|
||||
+ 'rd ' + ((flags & 0x100) >> 8) + ', '
|
||||
+ 'ra ' + ((flags & 0x80) >> 7) + ', '
|
||||
+ 'res1 ' + ((flags & 0x40) >> 6) + ', '
|
||||
+ 'res2 ' + ((flags & 0x20) >> 5) + ', '
|
||||
+ 'res3 ' + ((flags & 0x10) >> 4) + ', '
|
||||
+ 'rcode ' + ((flags & 0xF));
|
||||
console.log('(flags: ' + flagsstr);
|
||||
|
||||
var qdcount = dv.getUint16(4, false); // query count
|
||||
var ancount = dv.getUint16(6, false); // answer count
|
||||
var nscount = dv.getUint16(8, false); // authority count
|
||||
var arcount = dv.getUint16(10, false); // additional count
|
||||
var count;
|
||||
|
||||
console.log('qdcount', qdcount);
|
||||
console.log('ancount', ancount);
|
||||
console.log('nscount', nscount);
|
||||
console.log('arcount', arcount);
|
||||
|
||||
var total = 12;
|
||||
|
||||
function unpackQuestion(dv, total, len) {
|
||||
var qnames = [];
|
||||
var labelLen;
|
||||
while (true) {
|
||||
if (total >= len) {
|
||||
break;
|
||||
}
|
||||
labelLen = dv.getUint8(total, false); // additional count
|
||||
total += 1;
|
||||
if (!labelLen) {
|
||||
break;
|
||||
}
|
||||
if (192 === labelLen) {
|
||||
console.log('ERROR: Compression pointer found');
|
||||
console.log(dv.getUint8(total, false));
|
||||
console.log(dv.getUint8(dv.getUint8(total + 0, false), false));
|
||||
console.log(dv.getUint8(dv.getUint8(total + 1, false), false));
|
||||
console.log(dv.getUint8(dv.getUint8(total + 2, false), false));
|
||||
break;
|
||||
}
|
||||
var i;
|
||||
var label = '';
|
||||
console.log('label len', labelLen);
|
||||
for (i = 0; i < labelLen; i += 1) {
|
||||
label += String.fromCharCode(dv.getUint8(total + i, false));
|
||||
}
|
||||
total += label.length;
|
||||
console.log('label:', label);
|
||||
qnames.push(label);
|
||||
}
|
||||
console.log('QNAME:', qnames.join('.'));
|
||||
console.log('QTYPE:', dv.getUint16(total), false);
|
||||
total += 2;
|
||||
console.log('QCLASS:', dv.getUint16(total), false);
|
||||
total += 2;
|
||||
|
||||
return {
|
||||
total: total
|
||||
, qname: qnames.join('.')
|
||||
};
|
||||
}
|
||||
|
||||
var q = { total: total };
|
||||
function mapChar(ch) { return String.fromCharCode(ch) + '(' + ch + ')'; }
|
||||
|
||||
console.log('');
|
||||
console.log('//////////////////');
|
||||
console.log('// QUESTION //');
|
||||
console.log('//////////////////');
|
||||
console.log('');
|
||||
for (count = 0; count < qdcount; count += 1) {
|
||||
console.log('Question', count + 1, 'of', qdcount);
|
||||
q = unpackQuestion(dv, q.total, ab.byteLength);
|
||||
console.log('');
|
||||
}
|
||||
|
||||
console.log('');
|
||||
console.log('//////////////////');
|
||||
console.log('// ANSWER //');
|
||||
console.log('//////////////////');
|
||||
console.log('');
|
||||
for (count = 0; count < ancount; count += 1) {
|
||||
console.log('Answer', count + 1, 'of', ancount);
|
||||
q = unpackQuestion(dv, q.total, ab.byteLength);
|
||||
console.log('');
|
||||
}
|
||||
|
||||
|
||||
console.log('');
|
||||
console.log('//////////////////');
|
||||
console.log('// AUTHORITY //');
|
||||
console.log('//////////////////');
|
||||
console.log('');
|
||||
for (count = 0; count < nscount; count += 1) {
|
||||
console.log('Authority', count + 1, 'of', nscount);
|
||||
q = unpackQuestion(dv, q.total, ab.byteLength);
|
||||
console.log('ttl:', dv.getUint32(q.total, false));
|
||||
q.total += 4;
|
||||
q.rdlength = dv.getUint16(q.total, false);
|
||||
console.log('rdlen:', q.rdlength);
|
||||
q.total += 2;
|
||||
console.log('rrdata:');
|
||||
console.log([].slice.call(new Uint8Array(ab), q.total, q.total + q.rdlength).map(mapChar));
|
||||
q.total += q.rdlength;
|
||||
}
|
||||
|
||||
console.log('');
|
||||
console.log('//////////////////');
|
||||
console.log('// ADDITIONAL //');
|
||||
console.log('//////////////////');
|
||||
console.log('');
|
||||
for (count = 0; count < arcount; count += 1) {
|
||||
console.log('Additional', count + 1, 'of', arcount);
|
||||
q = unpackQuestion(dv, q.total, ab.byteLength);
|
||||
console.log('');
|
||||
}
|
||||
|
||||
|
||||
}());
|
||||
|
|
Loading…
Reference in New Issue