added the test code that AJ wrote
This commit is contained in:
		
							父節點
							
								
									28cfda23a6
								
							
						
					
					
						當前提交
						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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user