86 lines
2.7 KiB
C#
86 lines
2.7 KiB
C#
using System;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace ffmpeg_decrypt
|
|
{
|
|
public static class RCrack
|
|
{
|
|
public static async Task<string> GetChecksum(string aaxPath)
|
|
{
|
|
Resources.Extract("ffprobe.exe");
|
|
|
|
var startInfo = new ProcessStartInfo
|
|
{
|
|
FileName = Path.Combine(Resources.resdir, "ffprobe.exe"),
|
|
Arguments = aaxPath.SurroundWithQuotes(),
|
|
CreateNoWindow = true,
|
|
RedirectStandardOutput = true,
|
|
RedirectStandardError = true,
|
|
UseShellExecute = false,
|
|
WorkingDirectory = Directory.GetCurrentDirectory()
|
|
};
|
|
|
|
using var ffp = new Process { StartInfo = startInfo };
|
|
ffp.Start();
|
|
|
|
// checksum is in the debug info. ffprobe's debug info is written to stderr, not stdout
|
|
var ffprobeStderr = ffp.StandardError.ReadToEnd();
|
|
|
|
await ffp.WaitForExitAsync();
|
|
|
|
ffp.Close();
|
|
|
|
// example checksum line:
|
|
// ... [aax] file checksum == 0c527840c4f18517157eb0b4f9d6f9317ce60cd1
|
|
var checksum = ffprobeStderr.ExtractString("file checksum == ", 40);
|
|
|
|
return checksum;
|
|
}
|
|
|
|
/// <summary>use checksum to get activation bytes. activation bytes are unique per audible customer. only have to do this 1x/customer</summary>
|
|
public static async Task<string> GetActivationBytes(string checksum)
|
|
{
|
|
Resources.Extract("rcrack.exe");
|
|
|
|
Resources.Extract("alglib1.dll");
|
|
// RainbowCrack files to recover your own Audible activation data (activation_bytes) in an offline manner
|
|
Resources.Extract("audible_byte#4-4_0_10000x789935_0.rtc");
|
|
Resources.Extract("audible_byte#4-4_1_10000x791425_0.rtc");
|
|
Resources.Extract("audible_byte#4-4_2_10000x790991_0.rtc");
|
|
Resources.Extract("audible_byte#4-4_3_10000x792120_0.rtc");
|
|
Resources.Extract("audible_byte#4-4_4_10000x790743_0.rtc");
|
|
Resources.Extract("audible_byte#4-4_5_10000x790568_0.rtc");
|
|
Resources.Extract("audible_byte#4-4_6_10000x791458_0.rtc");
|
|
Resources.Extract("audible_byte#4-4_7_10000x791707_0.rtc");
|
|
Resources.Extract("audible_byte#4-4_8_10000x790202_0.rtc");
|
|
Resources.Extract("audible_byte#4-4_9_10000x791022_0.rtc");
|
|
|
|
var startInfo = new ProcessStartInfo
|
|
{
|
|
FileName = Path.Combine(Resources.resdir, "rcrack.exe"),
|
|
Arguments = @". -h " + checksum,
|
|
CreateNoWindow = true,
|
|
RedirectStandardOutput = true,
|
|
UseShellExecute = false,
|
|
WorkingDirectory = Directory.GetCurrentDirectory()
|
|
};
|
|
|
|
using var rcr = new Process { StartInfo = startInfo };
|
|
rcr.Start();
|
|
|
|
var rcrackStdout = rcr.StandardOutput.ReadToEnd();
|
|
|
|
await rcr.WaitForExitAsync();
|
|
rcr.Close();
|
|
|
|
// example result
|
|
// 0c527840c4f18517157eb0b4f9d6f9317ce60cd1 \xbd\x89X\x09 hex:bd895809
|
|
var activation_bytes = rcrackStdout.ExtractString("hex:", 8);
|
|
|
|
return activation_bytes;
|
|
}
|
|
}
|
|
}
|