Сохранить строку внутри программы - C#

Узнай цену своей работы

Формулировка задачи:

Задача такая: консольная программа предлагает ввести строку и сохраняет ее внутри программы. При следующем запуске программы, она вначале выводит сохраненную строку, а потом предлагает сохранить новую строку и т.д. Проблема в том, что сохранить строку надо внутри екзешника как ресурс. Вот только как этот ресурс изменять каждый раз при запуске программы?

Решение задачи: «Сохранить строку внутри программы»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.IO;
using System.Threading;
using System.Diagnostics;
namespace ConsoleApplication1
{
    class Program
    {
        [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Ansi)]
        static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)]string lpFileName);
        [DllImport("kernel32.dll")]
        static extern IntPtr FindResource(IntPtr hModule, IntPtr lpName, IntPtr lpType);
 
        [DllImport("kernel32.dll")]
        static extern IntPtr FindResource(IntPtr hModule, int lpName, int lpType);
 
        [DllImport("kernel32.dll")]
        static extern IntPtr FindResource(IntPtr hModule, int lpName, string lpType);
 
        [DllImport("kernel32.dll")]
        static extern IntPtr FindResource(IntPtr hModule, string lpName, int lpType);
 
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr FindResource(IntPtr hModule, string lpName, string lpType);
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr LoadResource(IntPtr hModule, IntPtr hResInfo);
        [DllImport("kernel32.dll")]
        static extern IntPtr LockResource(IntPtr hResData);
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr BeginUpdateResource(string pFileName,
       [MarshalAs(UnmanagedType.Bool)]bool bDeleteExistingResources);
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool UpdateResource(IntPtr hUpdate, string lpType, string lpName, ushort wLanguage, IntPtr lpData, uint cbData);
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool EndUpdateResource(IntPtr hUpdate, bool fDiscard);
        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool FreeLibrary(IntPtr hModule);
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern uint SizeofResource(IntPtr hModule, IntPtr hResInfo);
 
 
        static void Main(string[] args)
        {
            string filename = args[0];
            string oldpassword = args[1];
            string newpassword = args[2];
            bool sucess = false;
            int timeoutcounter = 0;
            while (!sucess && timeoutcounter < 30)
            {
                try
                {
                    using (var fs = File.Open(filename, FileMode.Open, FileAccess.ReadWrite))
                    {
                        sucess = true;
                        break;
                    }
                }
                catch { Thread.Sleep(200); timeoutcounter++; }
            }
            if (timeoutcounter == 30) { Process.Start(filename, "fucked_up"); return; }
        try {
                if (ChechIsPasswordCorrect(filename, oldpassword))
                {
                    ChangePassword(newpassword, filename);
                    Process.Start(filename, "all_ok");
                }
            }
            catch { Process.Start(filename, "fucked_up"); }
        }
        static bool ChechIsPasswordCorrect(string filename, string oldpassword)//тут проверяем правильность пароля в ресурсах
        {
            SHA512Cng crypt = new SHA512Cng();
            var hExe = LoadLibrary(filename);
            var hRes = FindResource(hExe, "BRED_ZAKAZCHIKA", "BRED_ZAKAZCHIKA");
            var hResLoad = LoadResource(hExe, hRes);
            var lpResLock = LockResource(hResLoad);
            if (lpResLock == IntPtr.Zero) { throw new Exception(); }
            uint size = SizeofResource(hExe, hRes);
            byte[] managedArray = new byte[size];
            Marshal.Copy(lpResLock, managedArray, 0, (int)size);
            FreeLibrary(hExe);
            byte[] oldpasswordbytes = crypt.ComputeHash(Encoding.UTF8.GetBytes(oldpassword));
            return oldpasswordbytes.SequenceEqual(managedArray);
        }
 
        static void ChangePassword(string newpassword,string filename)//тут меняем его
        {
            SHA512Cng crypt = new SHA512Cng();
            var encodedpassword = crypt.ComputeHash(Encoding.UTF8.GetBytes(newpassword));
            IntPtr unmanagedPointer = Marshal.AllocHGlobal(encodedpassword.Length);
            Marshal.Copy(encodedpassword, 0, unmanagedPointer, encodedpassword.Length);
            var hUpdateResource = BeginUpdateResource(filename, false);
            var result = UpdateResource(hUpdateResource, "BRED_ZAKAZCHIKA", "BRED_ZAKAZCHIKA", MAKELANGID(0x00, 0x03), unmanagedPointer, (uint)encodedpassword.Length);
            var end = EndUpdateResource(hUpdateResource, false);
            Marshal.FreeHGlobal(unmanagedPointer);
        }
       static public ushort MAKELANGID(byte primaryLanguage, byte subLanguage)
        {
            return (ushort)((((ushort)subLanguage) << 10) |
            (ushort)primaryLanguage);
        }
 
       static public byte PRIMARYLANGID(ushort languageId)
        {
            return (byte)(languageId & 0x3ff);
        }
 
       static public byte SUBLANGID(ushort languageId)
        {
            return (byte)(languageId >> 10);
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.867 из 5
Похожие ответы