[C#] Защита от удаления

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Неkто_Я, 4 Nov 2011.

  1. Неkто_Я

    Неkто_Я New Member

    Joined:
    1 Nov 2011
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Доброго времени суток!
    Подскажите, пожалуйста, как защитить свою программу от удаления, или как сделать, чтобы программа сама себя копировала, но немного другой.(чтобы например записывала инфу в другой текстовик и т.д и т.п)
    Заранее спасибо.
     
  2. kokoulin

    kokoulin Member

    Joined:
    8 Jan 2011
    Messages:
    65
    Likes Received:
    5
    Reputations:
    5
    открыть папку где лежит программа
    скопировать файл с программой
    открыть другую папку
    вставить файл с программой

    либо реализовать закачку программы с сервера в указаную папку
     
  3. Vermont

    Vermont New Member

    Joined:
    16 Jul 2011
    Messages:
    3
    Likes Received:
    1
    Reputations:
    0
    В 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 
    }
     
    #3 Vermont, 5 Nov 2011
    Last edited by a moderator: 7 Nov 2011
  4. altblitz

    altblitz Elder - Старейшина

    Joined:
    5 Jun 2009
    Messages:
    3,694
    Likes Received:
    3,149
    Reputations:
    236
    Доброго времени и Вам!

    если прогу запустил юзер, значит есть права чтения и записи в регистр.

    вот и записать в AutoRun свою прогу.

    умному - этого достаточно для начала.
    не желать, чтобы скрипт/киддиз скопи/пастили конкретную реализацию идеи

    Неkто_Я, если ты тот самый n3kt0,
    поиграемся с кодингом, и безо всяких Си-Шарп.

    тебе можно доверять?
     
    #4 altblitz, 5 Nov 2011
    Last edited: 5 Nov 2011
  5. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Добавить в браузер используемый по умолчанию ресурс со своей прогой,и секцию кода ,которая в случае чего будет её восстанавливать в нужном виде.
     
  6. Неkто_Я

    Неkто_Я New Member

    Joined:
    1 Nov 2011
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Я не n3kt0, всем спасибо (проблему решила, просто добавила в автозагрузку, и если не заходить через безопасный, то ее не удалить)
     
  7. xafon

    xafon New Member

    Joined:
    2 Dec 2009
    Messages:
    38
    Likes Received:
    4
    Reputations:
    0
    И ее не удалить из автозагрузки, предварительно завершив процесс? =))
     
  8. Неkто_Я

    Неkто_Я New Member

    Joined:
    1 Nov 2011
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Можно удалить, просто пользователь не в курсе, что прога есть, а название процесса очень схоже с названием другой проги на компе *юзер скорее всего не будет ее завершать*
     
  9. BDseller

    BDseller New Member

    Joined:
    25 Aug 2011
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    кста довольно таки просто написать на шарпе функционал для "защиты", "автозагрузки" и прочего)
    писал когда то обход UAC на шарпе, автозагрузку, реестр и прочее) во весело было)
     
  10. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    запиливаешь прогу во все возможные ветки автозапуска в реестре,создаешь несколько копий на диске.делаешь чекер по папкам если файла нету-скачиваешь в нете,короче много всего придумать можно,в плоть до блокирования файла на диске.
     
  11. BDseller

    BDseller New Member

    Joined:
    25 Aug 2011
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    на 7 могут быть (и скорее всего будут) траблы с копированием, записью и т.д. файла на диск системы.
    это чуть геморно но обходится)
    прокопировал файл в так шутк 10 сис директорий и проставил автозапуск с чеканием на наличие уже запущеной копии
    как не станно но довольно таки неплохой "ехе-шник" получилоьс навалять в свое время на шарпе) но потом забил