129 lines
4.5 KiB
C#
129 lines
4.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using FiddlerCore;
|
|
using Fiddler;
|
|
using System.Security.Cryptography.X509Certificates;
|
|
using System.IO;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace DolceDL
|
|
{
|
|
class Program
|
|
{
|
|
|
|
[DllImport("kernel32.dll", SetLastError = true)]
|
|
private static extern bool SetConsoleCtrlHandler(ConsoleEventDelegate callback, bool add);
|
|
|
|
static ConsoleEventDelegate handler; // Keeps it from getting garbage collected
|
|
private delegate bool ConsoleEventDelegate(int eventType);
|
|
static string UrlFilter;
|
|
static bool ConsoleEventCallback(int eventType)
|
|
{
|
|
if (eventType == 2) // WM_CLOSE
|
|
{
|
|
if(FiddlerApplication.IsStarted())
|
|
{
|
|
Console.WriteLine("Stopping proxy...");
|
|
FiddlerApplication.Shutdown();
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
static void Main(string[] args)
|
|
{
|
|
|
|
handler = new ConsoleEventDelegate(ConsoleEventCallback);
|
|
SetConsoleCtrlHandler(handler, true);
|
|
|
|
if (File.Exists("privkey.key") && File.Exists("privkey.cert"))
|
|
{
|
|
Console.WriteLine("Reading private key...");
|
|
|
|
string privcert = File.ReadAllText("privkey.cert");
|
|
FiddlerApplication.Prefs.SetStringPref("fiddler.certmaker.bc.cert", privcert);
|
|
string privkey = File.ReadAllText("privkey.key");
|
|
FiddlerApplication.Prefs.SetStringPref("fiddler.certmaker.bc.key", privkey);
|
|
|
|
}
|
|
else
|
|
{
|
|
Console.WriteLine("Generating root certificate...");
|
|
if (!CertMaker.createRootCert())
|
|
Console.WriteLine("Failed to create cert..");
|
|
|
|
Console.WriteLine("Installing root certificate...");
|
|
X509Store certStore = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
|
|
certStore.Open(OpenFlags.ReadWrite);
|
|
|
|
try
|
|
{
|
|
certStore.Add(CertMaker.GetRootCertificate());
|
|
}
|
|
catch (Exception)
|
|
{
|
|
Console.WriteLine("Failed to install cert..");
|
|
}
|
|
finally
|
|
{
|
|
certStore.Close();
|
|
}
|
|
|
|
Console.WriteLine("Saving private key...");
|
|
File.WriteAllText("privkey.cert", FiddlerApplication.Prefs.GetStringPref("fiddler.certmaker.bc.cert", null));
|
|
File.WriteAllText("privkey.key", FiddlerApplication.Prefs.GetStringPref("fiddler.certmaker.bc.key", null));
|
|
|
|
}
|
|
|
|
Console.Write("Url must contain: ");
|
|
UrlFilter = Console.ReadLine();
|
|
|
|
Console.WriteLine("Starting proxy...");
|
|
FiddlerCoreStartupSettingsBuilder builder = new FiddlerCoreStartupSettingsBuilder();
|
|
builder.DecryptSSL();
|
|
builder.ListenOnPort(8080);
|
|
builder.RegisterAsSystemProxy();
|
|
FiddlerCoreStartupSettings settings = builder.Build();
|
|
FiddlerApplication.BeforeResponse += FiddlerApplication_BeforeResponse;
|
|
FiddlerApplication.Startup(settings);
|
|
|
|
while (true) { };
|
|
}
|
|
|
|
private static void FiddlerApplication_BeforeResponse(Session oSession)
|
|
{
|
|
|
|
string path = oSession.fullUrl;
|
|
if(path.Contains(UrlFilter))
|
|
{
|
|
if(oSession.PathAndQuery == "/")
|
|
{
|
|
path += "index.html";
|
|
}
|
|
oSession.utilDecodeResponse();
|
|
path = path.Replace("&", "&");
|
|
path = path.Replace(":", "&col;");
|
|
path = path.Replace("\\", "&bksl;");
|
|
path = path.Replace("//", "&fwsl;");
|
|
path = path.Replace("|", "&pipe;");
|
|
path = path.Replace("*", "&str;");
|
|
path = path.Replace("?", "&que;");
|
|
path = path.Replace("<", "<");
|
|
path = path.Replace(">", ">");
|
|
path = path.Replace("\"", "&qt;");
|
|
|
|
while (File.Exists(path))
|
|
path += "_";
|
|
|
|
oSession.SaveResponseBody(path);
|
|
Console.WriteLine(path);
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
}
|