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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user