Доброго времени суток! Подскажите, пожалуйста, как защитить свою программу от удаления, или как сделать, чтобы программа сама себя копировала, но немного другой.(чтобы например записывала инфу в другой текстовик и т.д и т.п) Заранее спасибо.
открыть папку где лежит программа скопировать файл с программой открыть другую папку вставить файл с программой либо реализовать закачку программы с сервера в указаную папку
В Windows есть система шифрования EFS ,она реализует шифрование на уровне файлов,файлы становятся помеченными и на другом компьютере какие-либо модификации с этим файлом становятся не доступными,без определенного сертификата. Следующий способ запретить удаление-это написать драйвер ring0. У себя нашел старый код,когда-то чем-то подобным занимался на C#,на работоспособность сейчас проверить не могу,студии под рукой нет,код кривой т.к. писался давно и собирался по частям из сети,надеюсь поможет или хотя бы натолкнет на мысли. using System; Code: using System.IO; using System.Reflection; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; using System.Security; using Microsoft.Win32; namespace FileLicker { /// /// Provides a way of notifying Windows Explorer, which files are currently used by the application. /// public sealed class FileLocker : IDisposable, NativeMethods.IOleObject { #region " Registering and Unregistering " /// /// Registers the FileLocker. Invoke it from the application during the installation process. /// /// <exception cref="T:System.InvalidOperationException">The attempt to register the FileLocker is invalid because the attempt to modify the registry is denied or the process executable has an invalid location.</exception> public static void Register() { try { string guid = GetAssemblyGuid(); string progid = GetAssemblyProgId(); string location = GetAssemblyLocation(); Registry.ClassesRoot.CreateSubKey(@"CLSID\" + guid + @"\ProgID").SetValue(null, progid); Registry.ClassesRoot.CreateSubKey(progid + @"\CLSID").SetValue(null, guid); Registry.ClassesRoot.CreateSubKey(progid + @"\shell\Open\command").SetValue(null, "\"" + location + "\""); } catch (Exception e) { throw new InvalidOperationException("Cannot register FileLocker.", e); } } /// /// Unregisters the FileLocker. Invoke it from the application during the uninstallation process. /// /// <exception cref="T:System.InvalidOperationException">The attempt to unregister the FileLocker is invalid because the attempt to modify the registry is denied or the process executable has an invalid location.</exception> public static void Unregister() { try { string guid = GetAssemblyGuid(); string progid = GetAssemblyProgId(); string location = GetAssemblyLocation(); Registry.ClassesRoot.OpenSubKey(@"CLSID", true).DeleteSubKeyTree(guid); Registry.ClassesRoot.DeleteSubKeyTree(progid); Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\ShellNoRoam\MUICache"*, true).DeleteValue(location, false); } catch (Exception e) { throw new InvalidOperationException("Cannot unregister FileLocker.", e); } } private static string GetAssemblyLocation() { string location = Assembly.GetEntryAssembly().Location; if (!File.Exists(location)) { throw new FileNotFoundException(); } return location; } private static string GetAssemblyGuid() { return "{" + _GetAssemblyGuid() + "}"; } private static string GetAssemblyProgId() { return "LukeSw.IO.FileLocker." + _GetAssemblyGuid(); } private static Guid _GetAssemblyGuid() { object[] attrs = Assembly.GetEntryAssembly().GetCustomAttributes(typeof(GuidAttribute), false); Guid? g = null; foreach (object attr in attrs) { if (attr is GuidAttribute) { g = new Guid((attr as GuidAttribute).Value); } } if (g == null) { throw new InvalidOperationException("Assembly has no GuidAttribute attribute applied to it."); } return g.Value; Code: } #endregion #region " Locking & Unlocking " /// /// Initializes a new instance of the <see cref="FileLocker"/> class and notifies the Windows Explorer that the specified file is currently used by the application. /// /// <param name="fileInfo">The used file's FileInfo.</param> /// <exception cref="T:System.IO.FileNotFoundException"/> /// <exception cref="T:System.InvalidOperationException">Attempt to notify of file usage was unsuccessful.</exception> public FileLocker(FileInfo fileInfo) : this(fileInfo.FullName) { } /// /// Initializes a new instance of the <see cref="FileLocker"/> class and notifies the Windows Explorer that the specified file is currently used by the application. /// /// <param name="path">The path of the used file.</param> /// <exception cref="T:System.IO.FileNotFoundException"/> /// <exception cref="T:System.InvalidOperationException">Attempt to notify of file usage was unsuccessful.</exception> public FileLocker(string path) { try { path = Path.GetFullPath(path); } catch (Exception e) { throw new ArgumentException("The specified path is invalid.", "path", e); } if (!File.Exists(path)) { throw new FileNotFoundException("The specified file does not exist.", path); } IBindCtx ctx; int ret = NativeMethods.CreateBindCtx(0, out ctx); if (ret != 0 || ctx == null) { throw new InvalidOperationException(); } IRunningObjectTable rot; try { ctx.GetRunningObjectTable(out rot); if (rot == null) { throw new InvalidOperationException(); } try { IMoniker mon; ret = NativeMethods.CreateFileMoniker(path, out mon); if (ret != 0 || mon == null) { throw new InvalidOperationException(); } try { try { cookie = rot.Register(NativeMethods.ROTFLAGS_ALLOWANYCLIENT | NativeMethods.ROTFLAGS_REGISTRATIONKEEPSALIVE, this, mon); } catch (COMException) { cookie = rot.Register(NativeMethods.ROTFLAGS_REGISTRATIONKEEPSALIVE, this, mon); } } finally { Marshal.ReleaseComObject(mon); } } finally { Marshal.ReleaseComObject(rot); } } finally { Marshal.ReleaseComObject(ctx); } } ~FileLocker() { Dispose(false); } private int cookie; /// /// Cancels the notification and disposes the object. /// public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } private void Dispose(bool disposing) { try { Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\ShellNoRoam\MUICache"*, true).DeleteValue(GetAssemblyLocation(), false); } catch { } IBindCtx ctx; int ret = NativeMethods.CreateBindCtx(0, out ctx); if (ret != 0 || ctx == null) { return; } IRunningObjectTable rot; try { ctx.GetRunningObjectTable(out rot); Code: if (rot == null) { return; } try { rot.Revoke(cookie); } catch { } finally { try { Marshal.ReleaseComObject(rot); } catch { } } } catch { } finally { try { Marshal.ReleaseComObject(ctx); } catch { } } } #endregion #region " IOleObject Members " int NativeMethods.IOleObject.SetClientSite(object pClientSite) { throw new NotImplementedException(); } object NativeMethods.IOleObject.GetClientSite() { throw new NotImplementedException(); } int NativeMethods.IOleObject.SetHostNames(string szContainerApp, string szContainerObj) { throw new NotImplementedException(); } int NativeMethods.IOleObject.Close(int dwSaveOption) { throw new NotImplementedException(); } int NativeMethods.IOleObject.SetMoniker(int dwWhichMoniker, object pmk) { throw new NotImplementedException(); } int NativeMethods.IOleObject.GetMoniker(int dwAssign, int dwWhichMoniker, out object moniker) { throw new NotImplementedException(); } int NativeMethods.IOleObject.InitFromData(IDataObject pDataObject, int fCreation, int dwReserved) { throw new NotImplementedException(); } int NativeMethods.IOleObject.GetClipboardData(int dwReserved, out IDataObject data) { throw new NotImplementedException(); } int NativeMethods.IOleObject.DoVerb(int iVerb, IntPtr lpmsg, object pActiveSite, int lindex, IntPtr hwndParent, NativeMethods.COMRECT lprcPosRect) { throw new NotImplementedException(); } int NativeMethods.IOleObject.EnumVerbs(out object e) { throw new NotImplementedException(); } int NativeMethods.IOleObject.OleUpdate() { throw new NotImplementedException(); } int NativeMethods.IOleObject.IsUpToDate() { throw new NotImplementedException(); } int NativeMethods.IOleObject.GetUserClassID(ref Guid pClsid) { try { pClsid = _GetAssemblyGuid(); } catch { } return 0; } int NativeMethods.IOleObject.GetUserType(int dwFormOfType, out string userType) { throw new NotImplementedException(); } int NativeMethods.IOleObject.SetExtent(int dwDrawAspect, NativeMethods.SIZE pSizel) { throw new NotImplementedException(); } int NativeMethods.IOleObject.GetExtent(int dwDrawAspect, NativeMethods.SIZE pSizel) { throw new NotImplementedException(); } int NativeMethods.IOleObject.Advise(IAdviseSink pAdvSink, out int cookie) { throw new NotImplementedException(); } int NativeMethods.IOleObject.Unadvise(int dwConnection) { throw new NotImplementedException(); } int NativeMethods.IOleObject.EnumAdvise(out IEnumSTATDATA e) { throw new NotImplementedException(); } int NativeMethods.IOleObject.GetMiscStatus(int dwAspect, out int misc) { throw new NotImplementedException(); Code: } int NativeMethods.IOleObject.SetColorScheme(NativeMethods.tagLOGPALETTE pLogpal) { throw new NotImplementedException(); } #endregion } #region " NativeMethods class " internal static class NativeMethods { public const int ROTFLAGS_REGISTRATIONKEEPSALIVE = 0x1; public const int ROTFLAGS_ALLOWANYCLIENT = 0x2; [DllImport("ole32.dll")] public static extern int CreateFileMoniker([MarshalAs(UnmanagedType.LPWStr)] string lpszPathName, out IMoniker ppmk); [DllImport("ole32.dll")] public static extern int CreateBindCtx(int reserved, out IBindCtx ppbc); [StructLayout(LayoutKind.Sequential)] public class COMRECT { public int left; public int top; public int right; public int bottom; } [StructLayout(LayoutKind.Sequential)] public class SIZE { public int cx; public int cy; } [StructLayout(LayoutKind.Sequential)] public sealed class tagLOGPALETTE { [MarshalAs(UnmanagedType.U2)] public ushort palVersion; [MarshalAs(UnmanagedType.U2)] public ushort palNumEntries; } [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), SecurityCritical(SecurityCriticalScope.Everything), Guid("00000112-0000-0000-C000-000000000046"), SuppressUnmanagedCodeSecurity] public interface IOleObject { [PreserveSig] int SetClientSite([In, MarshalAs(UnmanagedType.Interface)] object pClientSite); object GetClientSite(); [PreserveSig] int SetHostNames([In, MarshalAs(UnmanagedType.LPWStr)] string szContainerApp, [In, MarshalAs(UnmanagedType.LPWStr)] string szContainerObj); [PreserveSig] int Close(int dwSaveOption); [PreserveSig] int SetMoniker([In, MarshalAs(UnmanagedType.U4)] int dwWhichMoniker, [In, MarshalAs(UnmanagedType.Interface)] object pmk); [PreserveSig] int GetMoniker([In, MarshalAs(UnmanagedType.U4)] int dwAssign, [In, MarshalAs(UnmanagedType.U4)] int dwWhichMoniker, [MarshalAs(UnmanagedType.Interface)] out object moniker); [PreserveSig] int InitFromData([In, MarshalAs(UnmanagedType.Interface)] IDataObject pDataObject, int fCreation, [In, MarshalAs(UnmanagedType.U4)] int dwReserved); [PreserveSig] int GetClipboardData([In, MarshalAs(UnmanagedType.U4)] int dwReserved, out IDataObject data); [PreserveSig] int DoVerb(int iVerb, [In] IntPtr lpmsg, [In, MarshalAs(UnmanagedType.Interface)] object pActiveSite, int lindex, IntPtr hwndParent, [In] NativeMethods.COMRECT lprcPosRect); [PreserveSig] int EnumVerbs(out object e); [PreserveSig] int OleUpdate(); [PreserveSig] int IsUpToDate(); [PreserveSig] int GetUserClassID([In, Out] ref Guid pClsid); [PreserveSig] int GetUserType([In, MarshalAs(UnmanagedType.U4)] int dwFormOfType, [MarshalAs(UnmanagedType.LPWStr)] out string userType); [PreserveSig] int SetExtent([In, MarshalAs(UnmanagedType.U4)] int dwDrawAspect, [In] NativeMethods.SIZE pSizel); [PreserveSig] int GetExtent([In, MarshalAs(UnmanagedType.U4)] int dwDrawAspect, [Out] NativeMethods.SIZE pSizel); [PreserveSig] int Advise(IAdviseSink pAdvSink, out int cookie); [PreserveSig] int Unadvise([In, MarshalAs(UnmanagedType.U4)] int dwConnection); [PreserveSig] int EnumAdvise(out IEnumSTATDATA e); [PreserveSig] int GetMiscStatus([In, MarshalAs(UnmanagedType.U4)] int dwAspect, out int misc); [PreserveSig] int SetColorScheme([In] NativeMethods.tagLOGPALETTE pLogpal); } } #endregion }
Доброго времени и Вам! если прогу запустил юзер, значит есть права чтения и записи в регистр. вот и записать в AutoRun свою прогу. умному - этого достаточно для начала. не желать, чтобы скрипт/киддиз скопи/пастили конкретную реализацию идеи Неkто_Я, если ты тот самый n3kt0, поиграемся с кодингом, и безо всяких Си-Шарп. тебе можно доверять?
Добавить в браузер используемый по умолчанию ресурс со своей прогой,и секцию кода ,которая в случае чего будет её восстанавливать в нужном виде.
Я не n3kt0, всем спасибо (проблему решила, просто добавила в автозагрузку, и если не заходить через безопасный, то ее не удалить)
Можно удалить, просто пользователь не в курсе, что прога есть, а название процесса очень схоже с названием другой проги на компе *юзер скорее всего не будет ее завершать*
кста довольно таки просто написать на шарпе функционал для "защиты", "автозагрузки" и прочего) писал когда то обход UAC на шарпе, автозагрузку, реестр и прочее) во весело было)
запиливаешь прогу во все возможные ветки автозапуска в реестре,создаешь несколько копий на диске.делаешь чекер по папкам если файла нету-скачиваешь в нете,короче много всего придумать можно,в плоть до блокирования файла на диске.
на 7 могут быть (и скорее всего будут) траблы с копированием, записью и т.д. файла на диск системы. это чуть геморно но обходится) прокопировал файл в так шутк 10 сис директорий и проставил автозапуск с чеканием на наличие уже запущеной копии как не станно но довольно таки неплохой "ехе-шник" получилоьс навалять в свое время на шарпе) но потом забил