mirror of
https://github.com/whoeevee/ivinject.git
synced 2026-01-09 00:25:03 +01:00
First commit
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
namespace ivinject.Common;
|
||||
|
||||
internal static class DirectoryExtensions
|
||||
{
|
||||
internal static string TempDirectoryPath()
|
||||
{
|
||||
return Path.Combine(
|
||||
Path.GetTempPath(),
|
||||
Path.ChangeExtension(Path.GetRandomFileName(), null)
|
||||
);
|
||||
}
|
||||
|
||||
internal static string HomeDirectoryPath() =>
|
||||
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
|
||||
|
||||
internal static void CopyDirectory(string sourceDir, string destinationDir, bool recursive)
|
||||
{
|
||||
var dir = new DirectoryInfo(sourceDir);
|
||||
|
||||
if (!dir.Exists)
|
||||
throw new DirectoryNotFoundException($"Source directory not found: {dir.FullName}");
|
||||
|
||||
var dirs = dir.GetDirectories();
|
||||
|
||||
Directory.CreateDirectory(destinationDir);
|
||||
|
||||
foreach (var file in dir.GetFiles())
|
||||
{
|
||||
var targetFilePath = Path.Combine(destinationDir, file.Name);
|
||||
file.CopyTo(targetFilePath);
|
||||
}
|
||||
|
||||
if (!recursive) return;
|
||||
|
||||
foreach (var subDir in dirs)
|
||||
{
|
||||
var newDestinationDir = Path.Combine(destinationDir, subDir.Name);
|
||||
CopyDirectory(subDir.FullName, newDestinationDir, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
namespace ivinject.Common;
|
||||
|
||||
internal static class FileStreamExtensions
|
||||
{
|
||||
internal static uint FileHeader(this FileStream stream)
|
||||
{
|
||||
using var reader = new BinaryReader(stream);
|
||||
var bytes = reader.ReadBytes(4);
|
||||
|
||||
return bytes.Length != 4
|
||||
? uint.MinValue
|
||||
: BitConverter.ToUInt32(bytes);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
namespace ivinject.Common.Models;
|
||||
|
||||
internal class BinaryHeaders
|
||||
{
|
||||
private const uint FatMagic = 0xcafebabe;
|
||||
private const uint FatMagic64 = 0xcafebabf;
|
||||
private const uint FatCigam = 0xbebafeca;
|
||||
private const uint FatCigam64 = 0xbfbafeca;
|
||||
|
||||
private const uint MhMagic = 0xfeedface;
|
||||
private const uint MhMagic64 = 0xfeedfacf;
|
||||
private const uint MhCigam = 0xcefaedfe;
|
||||
private const uint MhCigam64 = 0xcffaedfe;
|
||||
|
||||
internal static readonly uint[] FatHeaders =
|
||||
[
|
||||
FatMagic,
|
||||
FatMagic64,
|
||||
FatCigam,
|
||||
FatCigam64
|
||||
];
|
||||
|
||||
internal static readonly uint[] MhHeaders =
|
||||
[
|
||||
MhMagic,
|
||||
MhMagic64,
|
||||
MhCigam,
|
||||
MhCigam64
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
using System.Diagnostics;
|
||||
using static ivinject.Common.Models.BinaryHeaders;
|
||||
|
||||
namespace ivinject.Common.Models;
|
||||
|
||||
internal class IviMachOBinary(string fileName)
|
||||
{
|
||||
private FileInfo FileInfo { get; } = new(fileName);
|
||||
|
||||
internal string Name => FileInfo.Name;
|
||||
internal string FullName => FileInfo.FullName;
|
||||
|
||||
internal bool IsFatFile
|
||||
{
|
||||
get
|
||||
{
|
||||
var header = File.OpenRead(FullName).FileHeader();
|
||||
return FatHeaders.Contains(header);
|
||||
}
|
||||
}
|
||||
|
||||
internal string FileSize
|
||||
{
|
||||
get
|
||||
{
|
||||
FileInfo.Refresh();
|
||||
var size = FileInfo.Length;
|
||||
|
||||
return size switch
|
||||
{
|
||||
|
||||
< 1024 => $"{size:F0} bytes",
|
||||
_ when size >> 10 < 1024 => $"{size / (float)1024:F1} KB",
|
||||
_ when size >> 20 < 1024 => $"{(size >> 10) / (float)1024:F1} MB",
|
||||
_ => $"{(size >> 30) / (float)1024:F1} GB"
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
internal async Task<bool> IsEncrypted()
|
||||
{
|
||||
using var process = Process.Start(
|
||||
new ProcessStartInfo
|
||||
{
|
||||
FileName = "otool",
|
||||
Arguments = $"-l {FullName}",
|
||||
RedirectStandardOutput = true
|
||||
}
|
||||
);
|
||||
|
||||
var output = await process!.StandardOutput.ReadToEndAsync();
|
||||
return RegularExpressions.OToolEncryptedBinary().IsMatch(output);
|
||||
}
|
||||
|
||||
internal async Task<bool> Thin()
|
||||
{
|
||||
using var process = Process.Start(
|
||||
new ProcessStartInfo
|
||||
{
|
||||
FileName = "lipo",
|
||||
Arguments = $"-thin arm64 {FullName} -output {FullName}"
|
||||
}
|
||||
);
|
||||
|
||||
await process!.WaitForExitAsync();
|
||||
return process.ExitCode == 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace ivinject.Common.Models;
|
||||
|
||||
internal static partial class RegularExpressions
|
||||
{
|
||||
[GeneratedRegex("cryptid 1", RegexOptions.Compiled)]
|
||||
internal static partial Regex OToolEncryptedBinary();
|
||||
|
||||
[GeneratedRegex(@"\.(?:app|\w*ipa)$", RegexOptions.Compiled)]
|
||||
internal static partial Regex ApplicationPackage();
|
||||
}
|
||||
Reference in New Issue
Block a user