diff --git a/README.md b/README.md index 5bd4330..515aea7 100644 --- a/README.md +++ b/README.md @@ -16,14 +16,9 @@ бирж, где его можно скачать. Свободно не распространяется, так как для установки требует именную лицензию и учет распространения, а также ключи. * Из этого ПО для взаимодействия требуется только библиотека **wbotho.dll**. -* Установленный **PowerShell** минимальной версии **2.0**, поскольку он -для **Windows XP** годится и является штатным компонентом для систем выше. -Хотя, и без него тоже можно - см. папку [cmd](samples/cmd). -* Установленный **.NET** минимальной версии **3.5**, поскольку он является -штатным компонентом всех систем Windows и потому все еще поддерживается -производителем. Именно на языке *C#* версии 3.5 написан код *Verba.cs*. -Но можно использовать и дополнительно устанавливаемый .NET версии 4.0 -(последний для Windows XP) или любой другой выше. +* **.NET** штатной версии **3.5** или выше. +* **PowerShell** штатной версии **2.0** или выше - опционально. +Потому что можно и просто на [cmd](samples/cmd). ## Что не требуется @@ -73,7 +68,9 @@ PowerShell скриптовый код на языке C#, так и скомп * возврат кода 0 (успешно) или 1+ (были ошибки); * очистка всех слотов в драйвере разом (команда ```r``` без параметров); -Это готовый wrapper для запуска функций DLL из любого языка .NET. +Это готовый wrapper для запуска функций DLL из любого языка .NET или просто +из командной строки [cmd](samples/cmd) - этот вариант сейчас развивается +больше всего. ## Благодарности diff --git a/samples/cmd/README.md b/samples/cmd/README.md index 527f8c9..6df2865 100644 --- a/samples/cmd/README.md +++ b/samples/cmd/README.md @@ -22,14 +22,30 @@ ## Настройки -В постоянные настройки здесь можно вынести, пожалуй, только путь к -общему справочнику (*C:\Pub*). Можно еще и идентификатор своей подписи -(ключ КА), но тогда при его смене надо не забыть перегенерировать -утилиту *sign*. +Постоянные настройки удобно зашить в исходный текст, чтобы не передавать +массу параметров в командной строке или в конфигах. +Например, путь к общему справочнику (*C:\Pub*). +Идентификатор своей подписи (ключ КА), но тогда при его смене надо не забыть +перегенерировать утилиту *sign*. +Можно указать до трех (это число можно расширить) файлов для записи логов, +указав формат даты-времени при подстановке как в именах файлов, так в их +строках. Эти настройки можно указать в начале файла *make.cmd* в переменных *set*, а затем использовать через подстановки в *%%* далее по тексту. + set out=bin + set pub=c:\pub + set ka=206194104001 + + set log1=logs\{0:yyyyMMdd}.log + set log2=P:\PTK PSD\LOG\test_{0:yyyyMMdd}.log + set log3= + + set msg=\r\n{0:HH:mm:ss} {1} + set err=***FAILED! + + ## Использование encrypt in\[*] out\ XXXXSSSSSS XXXX[SSSSSS] [ext] diff --git a/samples/cmd/make.cmd b/samples/cmd/make.cmd index e963073..7b5901d 100644 --- a/samples/cmd/make.cmd +++ b/samples/cmd/make.cmd @@ -1,17 +1,131 @@ @echo off -set version=1.3.0.17 +set version=1.3.0.18 rem set net=%windir%\Microsoft.NET\Framework\v3.5 set net=%windir%\Microsoft.NET\Framework\v4.0.30319 set out=bin set pub=c:\pub -set ka=206594104002 +set ka=206194104001 + +set log1=logs\{0:yyyyMMdd}.log +set log2=P:\PTK PSD\LOG\test_{0:yyyyMMdd}.log +set log3= + +set msg={0:HH:mm:ss} {1} +set err=***FAILED! rem ------------------------------------------------------------------------- md "%out%" 2>nul rem Escape every ^), ^&, ^<, ^> inside of "echo (...C#...)" below +rem ------------------------------------------------------------------------- +set app=Decrypt + +set make=%make% "%app%" +%1 > "%out%\%app%.cs" ( + +call :_using +echo if (args.Length ^< 4^) { +echo Console.WriteLine(@"Usage: %app% in\[*] out\ XXXX[SSSSSS] XXXXSSSSSS [ext]"^); return; } +call :_args +echo string id = args[2]; if (id.Length ^> 10^) id = id.Substring(0, 10^); +echo string to = args[3]; if (to.Length ^> 10^) to = to.Substring(0, 10^); if (id.Length == 4^) id += to.Substring(4^); +echo bool changeExt = args.Length ^> 4; string ext = changeExt ? "." + args[4] : string.Empty; +call :_cinit +call :_foreach +echo if (changeExt^) fileOut = Path.ChangeExtension(file, ext^); +echo bool ok = DeCryptFileEx(file, fileOut, to, key^) == 0 ^&^& File.Exists(fileOut^); +echo if (ok^) File.Delete(file^); +call :_print +call :_cdone +) + +rem ------------------------------------------------------------------------- +set app=Encrypt + +set make=%make% "%app%" +%1 > "%out%\%app%.cs" ( + +echo using System.Runtime.InteropServices; +call :_using +echo if (args.Length ^< 4^) { +echo Console.WriteLine(@"Usage: %app% in\[*] out\ XXXXSSSSSS XXXX[SSSSSS] [ext]"^); return; } +call :_args +echo string id = args[2]; if (id.Length ^> 10^) id = id.Substring(0, 10^); +echo string to = args[3]; if (to.Length ^> 10^) to = to.Substring(0, 10^); if (to.Length == 4^) to += id.Substring(4^); +echo bool changeExt = args.Length ^> 4; string ext = changeExt ? "." + args[4] : string.Empty; +call :_cinit +echo IntPtr[] ptr = new IntPtr[] { Marshal.AllocHGlobal(304^) }; Marshal.Copy(key, 0, ptr[0], 304^); +call :_foreach +echo if (changeExt^) fileOut = Path.ChangeExtension(file, ext^); +echo bool ok = EnCryptFileEx(file, fileOut, id, ptr, 1, 0^) == 0 ^&^& File.Exists(fileOut^); +echo if (ok^) File.Delete(file^); +call :_print +echo Marshal.FreeHGlobal(ptr[0]^); +call :_cdone +) + +rem ------------------------------------------------------------------------- +set app=Sign + +set make=%make% "%app%" +%1 > "%out%\%app%.cs" ( + +call :_using +echo if (args.Length ^< 2^) { +echo Console.WriteLine(@"Usage: %app% in\[*] out [%ka%]"^); return; } +call :_args +echo string id = args.Length ^> 2 ? args[2] : "%ka%"; +call :_sinit +call :_foreach +echo bool ok = SignFile(file, fileOut, id^) == 0 ^&^& File.Exists(fileOut^); +echo if (ok^) File.Delete(file^); +call :_print +call :_sdone +) + +rem ------------------------------------------------------------------------- +set app=Unsign + +set make=%make% "%app%" +%1 > "%out%\%app%.cs" ( + +call :_using +echo if (args.Length ^< 2^) { +echo Console.WriteLine(@"Usage: %app% in\[*] out\"^); return; } +call :_args +call :_foreach +echo File.Copy(file, fileOut, true^); +echo bool ok = DelSign(fileOut, -1^) == 0; +echo File.Delete(ok ? file : fileOut^); +call :_print +echo }}} +) + +rem ------------------------------------------------------------------------- +set app=Verify + +set make=%make% "%app%" +%1 > "%out%\%app%.cs" ( + +call :_using +echo if (args.Length ^< 2^) { +echo Console.WriteLine(@"Usage: %app% in\[*] out\"^); return; } +call :_args +call :_sinit +call :_foreach +echo File.Copy(file, fileOut, true^); +echo int r; byte count; CheckList list; +echo if ((r = CheckFileSign(fileOut, out count, out list^)^) == 0^) { +echo for (int i = 0; i ^< (int^)count; i++^) if ((r = list.Signs[i].Status^) ^> 0^) break; +echo FreeMemory(list^); } +echo bool ok = r == 0; +echo File.Delete(ok ? file : fileOut^); +call :_print +call :_sdone +) + rem ------------------------------------------------------------------------- %1 > "%out%\AssemblyInfo.lib.cs" ( @@ -98,188 +212,72 @@ echo static extern ushort SignDone(^); }} ) rem ------------------------------------------------------------------------- -set app=Decrypt - -set make=%make% "%app%" -%1 > "%out%\%app%.cs" ( - -echo using System; -echo using System.IO; -echo using System.Reflection; - -echo [assembly: AssemblyTitle("Verba %app%"^)] -echo namespace App { partial class Program { static void Main(string[] args^) { - -echo if (args.Length ^< 4^) { -echo Console.WriteLine(@"Usage: %app% in\[*] out\ XXXX[SSSSSS] XXXXSSSSSS [ext]"^); return; } - -echo string path = Path.GetDirectoryName(args[0]^); -echo string mask = Path.GetFileName(args[0]^); -echo string[] files = Directory.GetFiles(path, mask.Length == 0 ? "*" : mask^); if (files.Length == 0^) return; -echo string pathOut = args[1]; Directory.CreateDirectory(pathOut^); -echo string id = args[2]; if (id.Length ^> 10^) id = id.Substring(0, 10^); -echo string to = args[3]; if (to.Length ^> 10^) to = to.Substring(0, 10^); if (id.Length == 4^) id += to.Substring(4^); -echo bool changeExt = args.Length ^> 4; string ext = changeExt ? "." + args[4] : string.Empty; - -echo string pub = @"%pub%"; CryptoInit(pub, pub^); -echo byte[] key = new byte[304]; if (ExtractKey(pub, id, key^) ^> 0^) return; - -echo foreach (string file in files^) { -echo string fileOut = Path.Combine(pathOut, changeExt ? Path.GetFileNameWithoutExtension(file^) + ext : Path.GetFileName(file^)^); -echo bool ok = DeCryptFileEx(file, fileOut, to, key^) == 0 ^&^& File.Exists(fileOut^); -echo if (ok^) { Console.WriteLine(@"%app% {0} {1}", file, fileOut^); File.Delete(file^); } -echo else { Console.WriteLine(@"%app% {0} FAILED!", file^); }} - -echo CryptoDone(^); }}} -) - -rem ------------------------------------------------------------------------- -set app=Encrypt - -set make=%make% "%app%" -%1 > "%out%\%app%.cs" ( - -echo using System; -echo using System.IO; -echo using System.Reflection; -echo using System.Runtime.InteropServices; - -echo [assembly: AssemblyTitle("Verba %app%"^)] -echo namespace App { partial class Program { static void Main(string[] args^) { - -echo if (args.Length ^< 4^) { -echo Console.WriteLine(@"Usage: %app% in\[*] out\ XXXXSSSSSS XXXX[SSSSSS] [ext]"^); return; } - -echo string path = Path.GetDirectoryName(args[0]^); -echo string mask = Path.GetFileName(args[0]^); -echo string[] files = Directory.GetFiles(path, mask.Length == 0 ? "*" : mask^); if (files.Length == 0^) return; -echo string pathOut = args[1]; Directory.CreateDirectory(pathOut^); -echo string id = args[2]; if (id.Length ^> 10^) id = id.Substring(0, 10^); -echo string to = args[3]; if (to.Length ^> 10^) to = to.Substring(0, 10^); if (to.Length == 4^) to += id.Substring(4^); -echo bool changeExt = args.Length ^> 4; string ext = changeExt ? "." + args[4] : string.Empty; - -echo string pub = @"%pub%"; CryptoInit(pub, pub^); -echo byte[] key = new byte[304]; if (ExtractKey(pub, to, key^) ^> 0^) return; -echo IntPtr[] ptr = new IntPtr[] { Marshal.AllocHGlobal(304^) }; Marshal.Copy(key, 0, ptr[0], 304^); - -echo foreach (string file in files^) { -echo string fileOut = Path.Combine(pathOut, changeExt ? Path.GetFileNameWithoutExtension(file^) + ext : Path.GetFileName(file^)^); -echo bool ok = EnCryptFileEx(file, fileOut, id, ptr, 1, 0^) == 0 ^&^& File.Exists(fileOut^); -echo if (ok^) { Console.WriteLine(@"%app% {0} {1}", file, fileOut^); File.Delete(file^); } -echo else { Console.WriteLine(@"%app% {0} FAILED!", file^); }} +echo Compiling... -echo Marshal.FreeHGlobal(ptr[0]^); CryptoDone(^); }}} +pushd "%out%" +for %%f in (%make%) do ( + echo - %%~f + %net%\csc /nologo /out:"%%~f.exe" "%%~f.cs" *.lib.cs ) +echo. +choice /m "Delete temp *.cs files" +if %errorlevel% equ 1 del /f /q *.cs +popd +goto :eof rem ------------------------------------------------------------------------- -set app=Sign - -set make=%make% "%app%" -%1 > "%out%\%app%.cs" ( - +:_using echo using System; echo using System.IO; echo using System.Reflection; +echo using System.Text; echo [assembly: AssemblyTitle("Verba %app%"^)] echo namespace App { partial class Program { static void Main(string[] args^) { +goto :eof -echo if (args.Length ^< 2^) { -echo Console.WriteLine(@"Usage: %app% in\[*] out [%ka%]"^); return; } - +:_args echo string path = Path.GetDirectoryName(args[0]^); echo string mask = Path.GetFileName(args[0]^); echo string[] files = Directory.GetFiles(path, mask.Length == 0 ? "*" : mask^); if (files.Length == 0^) return; echo string pathOut = args[1]; Directory.CreateDirectory(pathOut^); -echo string id = args.Length ^> 2 ? args[2] : "%ka%"; - -echo string pub = @"%pub%"; SignInit(pub, pub^); SignLogIn(pub^); - -echo foreach (string file in files^) { -echo string fileOut = Path.Combine(pathOut, Path.GetFileName(file^)^); -echo bool ok = SignFile(file, fileOut, id^) == 0 ^&^& File.Exists(fileOut^); -echo if (ok^) { Console.WriteLine(@"%app% {0} {1}", file, fileOut^); File.Delete(file^); } -echo else { Console.WriteLine(@"%app% {0} FAILED!", file^); }} - -echo SignLogOut(^); SignDone(^); }}} -) - -rem ------------------------------------------------------------------------- -set app=Unsign - -set make=%make% "%app%" -%1 > "%out%\%app%.cs" ( - -echo using System; -echo using System.IO; -echo using System.Reflection; - -echo [assembly: AssemblyTitle("Verba %app%"^)] -echo namespace App { partial class Program { static void Main(string[] args^) { -echo if (args.Length ^< 2^) { -echo Console.WriteLine(@"Usage: %app% in\[*] out\"^); return; } - -echo string path = Path.GetDirectoryName(args[0]^); -echo string mask = Path.GetFileName(args[0]^); -echo string[] files = Directory.GetFiles(path, mask.Length == 0 ? "*" : mask^); if (files.Length == 0^) return; -echo string pathOut = args[1]; Directory.CreateDirectory(pathOut^); +echo Encoding enc = Encoding.GetEncoding(1251^); +echo DateTime now = DateTime.Now; +if not "%log1%" == "" echo string log1 = string.Format(@"%log1%", now^); +if not "%log2%" == "" echo string log2 = string.Format(@"%log2%", now^); +if not "%log3%" == "" echo string log3 = string.Format(@"%log3%", now^); +goto :eof +:_foreach echo foreach (string file in files^) { -echo string fileOut = Path.Combine(pathOut, Path.GetFileName(file^)^); File.Copy(file, fileOut, true^); -echo bool ok = DelSign(fileOut, -1^) == 0 ^&^& File.Exists(fileOut^); -echo if (ok^) { Console.WriteLine(@"%app% {0} {1}", file, fileOut^); File.Delete(file^); } -echo else { Console.WriteLine(@"%app% {0} FAILED!", file^); File.Delete(fileOut^); }}}}} -) - -rem ------------------------------------------------------------------------- -set app=Verify - -set make=%make% "%app%" -%1 > "%out%\%app%.cs" ( +echo string fileOut = Path.Combine(pathOut, Path.GetFileName(file^)^); +goto :eof -echo using System; -echo using System.IO; -echo using System.Reflection; +:_print +echo string msg = string.Format(@"%app% {0} {1}", file, ok ? fileOut : "%err%"^); +echo Console.WriteLine(msg^); -echo [assembly: AssemblyTitle("Verba %app%"^)] -echo namespace App { partial class Program { static void Main(string[] args^) { +echo msg = string.Format("%msg%", DateTime.Now, msg^) + Environment.NewLine; +if not "%log1%" == "" echo File.AppendAllText(log1, msg, enc^); +if not "%log2%" == "" echo File.AppendAllText(log2, msg, enc^); +if not "%log3%" == "" echo File.AppendAllText(log3, msg, enc^); +echo } +goto :eof -echo if (args.Length ^< 2^) { -echo Console.WriteLine(@"Usage: %app% in\[*] out\"^); return; } +:_cinit +echo string pub = @"%pub%"; CryptoInit(pub, pub^); +echo byte[] key = new byte[304]; if (ExtractKey(pub, to, key^) ^> 0^) return; +goto :eof -echo string path = Path.GetDirectoryName(args[0]^); -echo string mask = Path.GetFileName(args[0]^); -echo string[] files = Directory.GetFiles(path, mask.Length == 0 ? "*" : mask^); if (files.Length == 0^) return; -echo string pathOut = args[1]; Directory.CreateDirectory(pathOut^); +:_cdone +echo CryptoDone(^); }}} +goto :eof +:_sinit echo string pub = @"%pub%"; SignInit(pub, pub^); SignLogIn(pub^); +goto :eof -echo foreach (string file in files^) { -echo string fileOut = Path.Combine(pathOut, Path.GetFileName(file^)^); File.Copy(file, fileOut, true^); - -echo int r; byte count; CheckList list; -echo if ((r = CheckFileSign(fileOut, out count, out list^)^) == 0^) { -echo for (int i = 0; i ^< (int^)count; i++^) if ((r = list.Signs[i].Status^) ^> 0^) break; -echo FreeMemory(list^); } - -echo bool ok = r == 0 ^&^& File.Exists(fileOut^); -echo if (ok^) { Console.WriteLine(@"%app% {0} {1}", file, fileOut^); File.Delete(file^); } -echo else { Console.WriteLine(@"%app% {0} FAILED!", file^); File.Delete(fileOut^); }} - +:_sdone echo SignLogOut(^); SignDone(^); }}} -) - -rem ------------------------------------------------------------------------- -echo Compiling... - -pushd "%out%" -for %%f in (%make%) do ( - echo - %%~f - %net%\csc /nologo /out:"%%~f.exe" "%%~f.cs" *.lib.cs -) -echo. -choice /m "Delete temp *.cs files" -if %errorlevel% equ 1 del /f /q *.cs -popd goto :eof