7 / 6 / 6
Регистрация: 20.03.2011
Сообщений: 350

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

23.12.2015, 23:36. Показов 2724. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача такая: консольная программа предлагает ввести строку и сохраняет ее внутри программы. При следующем запуске программы, она вначале выводит сохраненную строку, а потом предлагает сохранить новую строку и т.д.
Проблема в том, что сохранить строку надо внутри екзешника как ресурс. Вот только как этот ресурс изменять каждый раз при запуске программы?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.12.2015, 23:36
Ответы с готовыми решениями:

Можно ли сохранить последний результат работы программы непосредственно в коде программы
Можно ли сохранить последний результат работы программы непосредственно в коде программы, а потом при следующем включения программы...

Введённую с клавиатуры строку А записать в строку В: четные позиции сохранить, нечетные переставить в обратном порядке
Введённую с клавиатуры строку А записать в строку В: четные позиции сохранить, нечетные переставить в обратном порядке. Строку В вывести на...

Сохранить DOC файл внутри устройства
Как сохранить файл внутри устройства. Для создание word документа использовал библиотеку - java2word... void writeFile() { ...

11
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
24.12.2015, 00:57
Без извращений это невозможно, ибо переписывать собственный экзешник запущенной программе никто не даст. Я для подобной задачи(надо было держать в экзешники пароль, и не запускать программу без его введения) использовал такой подход: в ресурсы программы сохранял другую программу, которая при нажатии "сменить" распаковывалась, запускалась и ждала, пока основная программа закроется. После ее закрытия-меняла ресурсы и открывала заново основную программу. Параметры все передавались через аргументы командной строки.
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.12.2015, 02:28
EvilFromHell, насколько я помню, можно запустить экзешник с возможностью его изменения. Решается обычным винапишным флагом при запуске.

А хотя нет, флаг-то ставится, но вот снять его не так просто:
  • Call VirtualProtect() on the code pages you want to modify, with the PAGE_WRITECOPY protection.
  • Modify the code pages.
  • Call VirtualProtect() on the modified code pages, with the PAGE_EXECUTE protection.
  • Call FlushInstructionCache().

Добавлено через 14 минут
Алсо самый простой способ - писать в ресурсник, но просто хранить его в альтернативном ntfs-потоке. Для пользователя будет полная иллюзия, что это один файл.
2
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
24.12.2015, 07:04
Спасибо за идеи. Поигрался немного с теми альтернативными потоками(не знал про них)-действительно довольно удобно-но минус в том, что работает это все только на NTFS, а, допустим, запихать на флешку Fat32 такой файл уже нельзя. Если ТСа они заинтересуют, то полезный код есть вот тут.
1
7 / 6 / 6
Регистрация: 20.03.2011
Сообщений: 350
24.12.2015, 07:48  [ТС]
EvilFromHell,Psilon, окей, а возможно ли решить эту задачу созданием нового экзешника с соответственно измененными ресурсами?
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
24.12.2015, 07:53
Цитата Сообщение от polsok Посмотреть сообщение
EvilFromHell,Psilon, окей, а возможно ли решить эту задачу созданием нового экзешника с соответственно измененными ресурсами?
Ну а толку-то с нового? Старый ведь сам себя не удалит. Да и вообще, больно много лишних действий.
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.12.2015, 09:28
EvilFromHell, ну это маловероятно, винда не позволяет форматировать в фат32 накопители больше 32 гигов Поэтому имхо оптимальное решение. А то, что ntfs поток не будет работать вне ntfs ФС - глупо записывать в недостатки
1
7 / 6 / 6
Регистрация: 20.03.2011
Сообщений: 350
24.12.2015, 11:01  [ТС]
EvilFromHell, ну хотя бы так без удаления старого. Есть идея как создать?
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
24.12.2015, 12:44
Цитата Сообщение от Psilon Посмотреть сообщение
EvilFromHell, ну это маловероятно
Тут не соглашусь-я, к примеру, часто пользуюсь для переноса чего-либо телефоном на андроиде, а там карточки вовсе не в NTFS... да и обычных USB флешек полно в FAT32 отформатированных.
Цитата Сообщение от polsok Посмотреть сообщение
EvilFromHell, ну хотя бы так без удаления старого. Есть идея как создать?
Ну элементарано-откопировать файл и поменять его ресурсы. Копировать свой собственный exe файл ОС не запрещает.
1
7 / 6 / 6
Регистрация: 20.03.2011
Сообщений: 350
24.12.2015, 14:35  [ТС]
EvilFromHell, как копировать файл я нашел, а вот как заменить ресурсы... Если знаешь команду подскажи пожалуйста
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
24.12.2015, 14:43
Вот на счет именно .NETовских ресурсов я подробно не разбирался, делал все на WinApi через обычные ресурсы, вот пример с паролем, хранящимся в ресурсах:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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
110
111
112
113
114
115
116
117
118
119
120
121
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);
        }
    }
}
Правда по уму стоило бы подавать сюда оба параметра уже зашифрованными. Но тот, кто сумеет это использовать, без проблем может и декомпилировать основную прогу и все прочитать
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.12.2015, 18:04
EvilFromHell, в любом случае я не вижу большого смысла всё пихать в один экзешник. Да, заманчиво иметь возможность таскать одну эту штуку и иметь рабочую единицу, но если вдуматься, то это не так уж и важно, экзешник или просто папка.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.12.2015, 18:04
Помогаю со студенческими работами здесь

Как сохранить пременную внутри одного файла?
Суть проблемы в следующем: Написал простейший счетчик скачиваний: require_once(&quot;bd.php&quot;); if($_GET) { $path=$_GET; ...

Как вордовкий документ сохранить внутри экзешника
Добрый день. У меня программа работает с вордовским документом. Как вордовкий документ сохранить внутри экзешника. Программа для...

Ячейки внутри таблицы сжимаются, нужно сохранить размер
Добрый день! Столкнулся с трудностью, мне нужно поместить таблицу в определенного размера div, так чтобы таблица отобразилась в нем со...

Как сохранить картинку из webbrowser, находящуюся внутри элемента с известным атрибутом class?
здравствуйте. возможно я неочень понятно сформулировал вопрос, вобщем суть втом, что делаю что то типа парсера картинок ссайта. есть...

Как сохранить картинку внутри exe файла в Resources(Codeblocks&WxWidgets)
?? программа небольшая, неохота тягать с собой еще и отдельную папку icons с картинками


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru