瀏覽代碼

changed denial of service metric to be based on low interarrival times, added visual indicator

Erinn 7 年之前
父節點
當前提交
0c75ef55d0
共有 12 個文件被更改,包括 70 次插入62 次删除
  1. 二進制
      includes/ui/meter-0.png
  2. 二進制
      includes/ui/meter-1.png
  3. 二進制
      includes/ui/meter-2.png
  4. 二進制
      includes/ui/meter-3.png
  5. 二進制
      includes/ui/meter-4.png
  6. 二進制
      includes/ui/meter-5.png
  7. 二進制
      includes/ui/meter-6.png
  8. 9 0
      js/bindings.js
  9. 2 3
      levels/03 DoS/dos01.json
  10. 3 25
      levels/03 DoS/dos02.json
  11. 3 23
      levels/03 DoS/dos03.json
  12. 53 11
      phaser.inc.php

二進制
includes/ui/meter-0.png


二進制
includes/ui/meter-1.png


二進制
includes/ui/meter-2.png


二進制
includes/ui/meter-3.png


二進制
includes/ui/meter-4.png


二進制
includes/ui/meter-5.png


二進制
includes/ui/meter-6.png


+ 9 - 0
js/bindings.js

@@ -77,13 +77,22 @@ function btnEdit() {
 
 function btnLaunch() {
 	var pkt = playerPackets[this.launcherIndex];
+	if (devices[pkt.from].locked) return;
+	devices[pkt.from].locked = true;
 
 	if (pkt.hasOwnProperty("repeat") && pkt.repeat > 1) {
 		for (var i = 0; i < pkt.repeat; i++) {
 			game.time.events.add( 100 * i, playPacket, pkt );
 		}
+
+		game.time.events.add(100 * (parseInt(pkt.repeat) + 1), launcherUnlock, pkt);
 	} else {
 		doPacketAnimation(pkt.from, getDefaultRecipient(pkt.from), pkt.payload);
+		game.time.events.add(100, launcherUnlock, pkt);
 	}
 }
 
+function launcherUnlock(index) {
+	devices[this.from].locked = false;
+}
+

+ 2 - 3
levels/03 DoS/dos01.json

@@ -14,7 +14,7 @@
 			ports:1,
 			x:0.75,
 			y:0.5,
-			bufferWait:260
+			capacity:1
 		}
 	],
 	links:[
@@ -26,9 +26,8 @@
 	timeline:[],
 	triggers:[
 		{
-			type:"packet",
+			type:"flood",
 			device:"Google",
-			times:50
 		}
 	],
 	nextLevel:9

+ 3 - 25
levels/03 DoS/dos02.json

@@ -37,7 +37,7 @@
 			ports:1,
 			x:0.8,
 			y:0.5,
-			bufferWait:305
+			capacity:3
 		},
 		{
 			id:"Google's Firewall",
@@ -86,30 +86,8 @@
 	],
 	triggers:[
 	    {
-			type:"packet",
-			device:"Google",
-			payload:{
-				network:{srcip:"Zombie 1", dstip:"Google"}
-			}
-	    },
-	    {
-			type:"packet",
-			device:"Google",
-			payload:{
-				network:{srcip:"Zombie 2", dstip:"Google"}
-			}
-	    },
-	    {
-			type:"packet",
-			device:"Google",
-			payload:{
-				network:{srcip:"Zombie 3", dstip:"Google"}
-			}
-	    },
-	    {
-			type:"packet",
-			device:"Google",
-			times:60
+			type:"flood",
+			device:"Google"
 	    }
         ],
 	nextLevel:10

+ 3 - 23
levels/03 DoS/dos03.json

@@ -37,7 +37,7 @@
 			ports:1,
 			x:0.8,
 			y:0.5,
-			bufferWait:170
+			capacity:2
 		},
 		{
 			id:"Router",
@@ -80,28 +80,8 @@
 	timeline:[],
 	triggers:[
 		{
-			type:"packet",
-			device:"Google",
-			payload:{
-				network:{srcip:"Barbara", dstip:"Google"}
-			},
-			times:20
-		},
-		{
-			type:"packet",
-			device:"Google",
-			payload:{
-				network:{srcip:"Carol", dstip:"Google"}
-			},
-			times:20
-		},
-		{
-			type:"packet",
-			device:"Google",
-			payload:{
-				network:{srcip:"Darcy", dstip:"Google"}
-			},
-			times:20
+			type:"flood",
+			device:"Google"
 		}
         ],
 	nextLevel:11

+ 53 - 11
phaser.inc.php

@@ -45,6 +45,8 @@ function preload() {
 	game.load.image('edit', 'includes/ui/tabs.png');
 	game.load.image('launch', 'includes/ui/launch.png');
 	game.load.image('add', 'includes/ui/add.png');
+
+	for (var i = 0; i <= 6; i++) game.load.image('meter-'+i, 'includes/ui/meter-'+i+'.png');
 }
 
 function create() {
@@ -73,8 +75,12 @@ function create() {
 	for (var i = 0; i < level.devices.length; i++) {
 		var devSprite = grpDevices.create(0.7 * game.world.width * level.devices[i].x, game.world.height * level.devices[i].y, level.devices[i].image || 'imac');
 		level.devices[i].sprite = devSprite;
+		if (level.devices[i].hasOwnProperty("capacity")) {
+			level.devices[i].capsprite = grpDevices.create(0.7 * game.world.width * level.devices[i].x + 128,   game.world.height * level.devices[i].y, 'meter-0');
+		}
 		devices[level.devices[i].id] = level.devices[i];
 		devices[level.devices[i].id].ports = [];
+		devices[level.devices[i].id].locked = false;
 		devSprite.inputEnabled = true;
 		devSprite.events.onInputDown.add(onDeviceClick, level.devices[i]);
 	}
@@ -153,6 +159,12 @@ function getRemotePort(src, dst) {
 }
 
 function update() {
+	//todo: separate out the meter-X updates from satisfiesTrigger
+	for (var i = 0; i < level.triggers.length; i++) {
+		if (level.triggers[i].type == "flood") {
+			satisfiesTrigger({dst: level.triggers[i].device}, {type:"flood",device:level.triggers[i].device,noup:true});
+		}
+	}
 }
 
 var levelOver = false;
@@ -188,20 +200,50 @@ function donePacket() {
 
 function satisfiesTrigger(pkt, t) {
 	if (pkt.dst != t.device) return false;
-	if (!t.hasOwnProperty("payload") && !t.hasOwnProperty("times")) return true;
-	if (!pkt.hasOwnProperty("payload")) return false;
+	
+	if (t.type == "packet") {
+		if (!t.hasOwnProperty("payload") && !t.hasOwnProperty("times")) return true;
+		if (!pkt.hasOwnProperty("payload")) return false;
+	
+		var layers = t.hasOwnProperty("payload") ? Object.keys(t.payload) : [];
+		for (var i = 0; i < layers.length; i++) {
+			if (!pkt.payload.hasOwnProperty(layers[i])) return false;
+	
+			var fields = Object.keys(t.payload[ layers[i] ]);
+			for (var j = 0; j < fields.length; j++) {
+				if (!pkt.payload[ layers[i] ].hasOwnProperty(fields[j])) return false;
+				if (pkt.payload[ layers[i] ][ fields[j] ].trim().toLowerCase() != t.payload[ layers[i] ][ fields[j] ].trim().toLowerCase()) return false;
+			}
+		}
 
-	var layers = t.hasOwnProperty("payload") ? Object.keys(t.payload) : [];
-	for (var i = 0; i < layers.length; i++) {
-		if (!pkt.payload.hasOwnProperty(layers[i])) return false;
+		return true;
+	} else if (t.type == "flood") {
+		if (!devices[t.device].hasOwnProperty("floodCounter")) {
+			devices[t.device].floodCounter = 0;
+			devices[t.device].floodLast = 0;
+		}
 
-		var fields = Object.keys(t.payload[ layers[i] ]);
-		for (var j = 0; j < fields.length; j++) {
-			if (!pkt.payload[ layers[i] ].hasOwnProperty(fields[j])) return false;
-			if (pkt.payload[ layers[i] ][ fields[j] ].trim().toLowerCase() != t.payload[ layers[i] ][ fields[j] ].trim().toLowerCase()) return false;
+		var delta = game.time.events.ms - devices[t.device].floodLast;
+		if (t.noup && devices[t.device].floodCounter > 0) {
+			if (delta > 200) {
+				devices[t.device].floodCounter--;
+				devices[t.device].floodLast = game.time.events.ms;
+			}
+		} else if (delta < 120 / devices[t.device].capacity) {
+			devices[t.device].floodCounter++;
+			if (devices[t.device].floodCounter > 30) devices[t.device].floodCounter = 30;
+		} else {
+			devices[t.device].floodCounter -= Math.floor(delta / (120 / devices[t.device].capacity));
+			if (devices[t.device].floodCounter < 0) devices[t.device].floodCounter = 0;
 		}
-	}
 
-	return true;
+		if (!t.noup) devices[t.device].floodLast = game.time.events.ms;
+		devices[t.device].capsprite.loadTexture('meter-'+Math.floor( devices[t.device].floodCounter / 5 ));
+
+		return devices[t.device].floodCounter == 30;
+	} else {
+		console.log("unknown trigger type: "+t.type);
+		return false;
+	}
 }