-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDnsLeak.cs
131 lines (124 loc) · 3.75 KB
/
DnsLeak.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
//Usage:
//DnsLeak.Testing((addresses) =>
//{
// foreach (IPAddress address in addresses)
// {
// Console.WriteLine(address);
// }
//}, 5);
//DnsLeak.Testing((address) => Console.WriteLine(address));
namespace DnsToolkit
{
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Net;
using System.Security;
using System.Threading.Tasks;
public static class DnsLeak
{
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private static readonly Random _random = new Random();
[SecurityCritical]
[SecuritySafeCritical]
private static string MakeID()
{
var text = ""; // https://ipleak.net/
var possible = "abcdefghijklmnopqrstuvwxyz0123456789";
for (var i = 0; i < 40; i++)
{
var j = (int)Math.Floor(_random.NextDouble() * possible.Length);
text += possible[j];
}
return text;
}
[SecurityCritical]
[SecuritySafeCritical]
public static void Testing(Action<IPAddress> callback)
{
if (callback == null)
{
throw new InvalidOperationException(nameof(callback));
}
Task.Run(async () =>
{
var leakIP = await Testing();
callback(leakIP);
});
}
[SecurityCritical]
[SecuritySafeCritical]
public static void Testing(Action<IPAddress[]> callback, int count)
{
if (callback == null)
{
throw new InvalidOperationException(nameof(callback));
}
Task.Run(async () =>
{
var addresses = await Testing(count);
callback(addresses);
});
}
public static async Task<IPAddress[]> Testing(int count)
{
if (count < 1)
{
count = 1;
}
Task<IPAddress>[] tasks = new Task<IPAddress>[count];
for (int i = 0; i < count; i++)
{
tasks[i] = Testing();
}
await Task.WhenAll(tasks);
var addresses = new List<IPAddress>();
var set = new HashSet<IPAddress>();
foreach (var task in tasks)
{
var address = task.Result;
if (address == null || !set.Add(address))
{
continue;
}
addresses.Add(address);
}
return addresses.ToArray();
}
public static async Task<IPAddress> Testing()
{
var detectUrl = "https://" + MakeID() + ".ipleak.net/dnsdetect/";
try
{
using (WebClient wc = new WebClient())
{
try
{
var leakIP = await wc.DownloadStringTaskAsync(detectUrl);
if (string.IsNullOrEmpty(leakIP))
{
return null;
}
if (!IPAddress.TryParse(leakIP, out IPAddress leakAddress))
{
return null;
}
if (leakAddress == null)
{
return null;
}
return leakAddress;
}
catch (Exception)
{
return null;
}
}
}
catch (Exception)
{
return null;
}
}
}
}