Browse Source

fake dns + others sniffer

Shelikhoo 4 years ago
parent
commit
3b4920a1e6
2 changed files with 66 additions and 0 deletions
  1. 61 0
      app/dispatcher/fakednssniffer.go
  2. 5 0
      app/dispatcher/sniffer.go

+ 61 - 0
app/dispatcher/fakednssniffer.go

@@ -34,6 +34,15 @@ func newFakeDNSSniffer(ctx context.Context) (protocolSnifferWithMetadata, error)
 				return &fakeDNSSniffResult{domainName: domainFromFakeDNS}, nil
 				return &fakeDNSSniffResult{domainName: domainFromFakeDNS}, nil
 			}
 			}
 		}
 		}
+
+		if ipAddressInRangeValueI := ctx.Value(ipAddressInRange); ipAddressInRangeValueI != nil {
+			ipAddressInRangeValue := ipAddressInRangeValueI.(*ipAddressInRangeOpt)
+			if fkr0, ok := fakeDNSEngine.(dns.FakeDNSEngineRev0); ok {
+				inPool := fkr0.IsIPInIPPool(Target.Address)
+				ipAddressInRangeValue.addressInRange = &inPool
+			}
+		}
+
 		return nil, common.ErrNoClue
 		return nil, common.ErrNoClue
 	}, metadataSniffer: true}, nil
 	}, metadataSniffer: true}, nil
 }
 }
@@ -49,3 +58,55 @@ func (fakeDNSSniffResult) Protocol() string {
 func (f fakeDNSSniffResult) Domain() string {
 func (f fakeDNSSniffResult) Domain() string {
 	return f.domainName
 	return f.domainName
 }
 }
+
+type fakeDnsExtraOpts int
+
+const ipAddressInRange fakeDnsExtraOpts = 1
+
+type ipAddressInRangeOpt struct {
+	addressInRange *bool
+}
+
+type DNSThenOthersSniffResult struct {
+	domainName string
+}
+
+func (DNSThenOthersSniffResult) Protocol() string {
+	return "fakedns+others"
+}
+
+func (f DNSThenOthersSniffResult) Domain() string {
+	return f.domainName
+}
+
+func newFakeDNSThenOthers(ctx context.Context, fakeDNSSniffer protocolSnifferWithMetadata, others []protocolSnifferWithMetadata) (protocolSnifferWithMetadata, error) {
+	return protocolSnifferWithMetadata{
+		protocolSniffer: func(ctx context.Context, bytes []byte) (SniffResult, error) {
+			ipAddressInRangeValue := &ipAddressInRangeOpt{}
+			ctx = context.WithValue(ctx, ipAddressInRange, ipAddressInRangeValue)
+			result, err := fakeDNSSniffer.protocolSniffer(ctx, bytes)
+			if err == nil {
+				return result, nil
+			}
+			if ipAddressInRangeValue.addressInRange != nil {
+				if *ipAddressInRangeValue.addressInRange == true {
+					for _, v := range others {
+						if v.metadataSniffer || bytes != nil {
+							if result, err := v.protocolSniffer(ctx, bytes); err == nil {
+								return DNSThenOthersSniffResult{result.Domain()}, nil
+							}
+						}
+					}
+					return nil, common.ErrNoClue
+				} else {
+					newError("ip address not in fake dns range, return as is").AtDebug().WriteToLog()
+					return nil, common.ErrNoClue
+				}
+			} else {
+				newError("fake dns sniffer did not set address in range option, assume false.").AtWarning().WriteToLog()
+				return nil, common.ErrNoClue
+			}
+		},
+		metadataSniffer: true,
+	}, nil
+}

+ 5 - 0
app/dispatcher/sniffer.go

@@ -39,7 +39,12 @@ func NewSniffer(ctx context.Context) *Sniffer {
 		},
 		},
 	}
 	}
 	if sniffer, err := newFakeDNSSniffer(ctx); err == nil {
 	if sniffer, err := newFakeDNSSniffer(ctx); err == nil {
+		others := ret.sniffer
 		ret.sniffer = append(ret.sniffer, sniffer)
 		ret.sniffer = append(ret.sniffer, sniffer)
+		fakeDNSThenOthers, err := newFakeDNSThenOthers(ctx, sniffer, others)
+		if err != nil {
+			ret.sniffer = append(ret.sniffer, fakeDNSThenOthers)
+		}
 	}
 	}
 	return ret
 	return ret
 }
 }