Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/12: Рейтинг темы: голосов - 12, средняя оценка - 4.75
Qfeed
0 / 0 / 0
Регистрация: 14.03.2013
Сообщений: 56
1

Запуск программы только из другой программы

29.08.2013, 21:17. Просмотров 2138. Ответов 21
Метки нет (Все метки)

Здравствуйте уважаемые программисты, сегодня столкнулся с проблемой, естественно первым делом прогуглил и нечего толкового не нашёл. Вообщем написал я загрузчик на WPF, и написал софтинку на winForms, нужно реализовать так чтобы программу на WinForms можно было запустить только из загрузчика и никак по другому, возможно ли это сделать ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.08.2013, 21:17
Ответы с готовыми решениями:

Запуск сторонней программы из программы
Приветствую! Нужна ваша помощь. Есть две программы, одна собирает всю...

Запуск программы
У меня есть готовая программа, например, текстовый редактор, который сохраняет...

Запуск программы из памяти
Всем привет. Недавно перешел с vb net на c# из-за отсутствия перспективы...

Удаленный запуск программы
Необходимо удаленно запустить программу. Делаю так: sLogin = txtbUser.Text;...

Запуск приложений из программы на С#
Доброго времени суток. Мне нужно запустить приложение из моей программы, я его...

21
makedonsky94
44 / 44 / 4
Регистрация: 14.02.2013
Сообщений: 139
29.08.2013, 21:23 2
первое, что приходит в голову - слепить все в 1 проект и скомпилировать)
0
Qfeed
0 / 0 / 0
Регистрация: 14.03.2013
Сообщений: 56
29.08.2013, 23:46  [ТС] 3
Цитата Сообщение от makedonsky94 Посмотреть сообщение
первое, что приходит в голову - слепить все в 1 проект и скомпилировать)
К сожалению это не подходит, так как загрузчик будет качать программу с сервера, и нельзя что бы ее кто-то смог запустить из вне загрузчика.

Добавлено через 2 часа 7 минут
Готов неплохо заплатить за помощь...
0
makedonsky94
44 / 44 / 4
Регистрация: 14.02.2013
Сообщений: 139
29.08.2013, 23:51 4
попробуй покопать в сторону динамической компиляции - качаешь строку с кодом и компилируешь
1
NickoTin
Почетный модератор
Эксперт .NET
8446 / 3568 / 402
Регистрация: 14.06.2010
Сообщений: 4,512
Записей в блоге: 9
29.08.2013, 23:58 5
Цитата Сообщение от Qfeed Посмотреть сообщение
нельзя что бы ее кто-то смог запустить из вне загрузчика
ну чтобы прям никто не смог достаточно сложная задача, но если примитивно и незаметно для обычного пользователя, то можно создавать глобальный именованный мьютекс в WPF приложении и проверять его существование в WinForms, существует - ок, нет - завершаем выполнение.

Псевдокод:
C#
1
2
3
4
5
6
7
8
9
10
11
        private static Mutex mInstanceWPF;
        // Приложение WPF
        static void Run ( )
        {
            bool createdNew;
            mInstanceWPF = new Mutex( false, "AA848796-7EF0-45C8-BCA4-7BC26FD01571", out createdNew );
            if ( createdNew )
                Process.Start("...");
            else
                ; // что-то не то, Mutex уже существует
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        private static Mutex mInstanceWF;
        // Приложение WinForms
        private static void Main ( string[] args )
        {
            bool createdNew;
            mInstanceWF = new Mutex( true, "AA848796-7EF0-45C8-BCA4-7BC26FD01571", out createdNew );
 
            // Создан новый Mutex, значит запущено не из WPF приложения
            if ( createdNew )
                return;
 
            // ok
            // run form
            // ...
        }
Имя мьютекса случайно сгенерировано...
1
Psilon
Master of Orion
Эксперт .NET
6000 / 4850 / 902
Регистрация: 10.07.2011
Сообщений: 14,460
Записей в блоге: 5
Завершенные тесты: 4
30.08.2013, 01:56 6
Qfeed, пишешь для своей проги расширение .единаяРоссия и все
0
Qfeed
0 / 0 / 0
Регистрация: 14.03.2013
Сообщений: 56
30.08.2013, 02:52  [ТС] 7
NickoTin, А что если файл wf будет зашифрован, а уже в wpf расшифровывать и запускать ? Но если я не ошибаюсь, то можно сдампить. Нужно что бы вообще было не возможно запустить софт без загрузчика...
0
NickoTin
Почетный модератор
Эксперт .NET
8446 / 3568 / 402
Регистрация: 14.06.2010
Сообщений: 4,512
Записей в блоге: 9
30.08.2013, 03:08 8
Цитата Сообщение от Qfeed Посмотреть сообщение
можно сдампить
Можно.
Цитата Сообщение от Qfeed Посмотреть сообщение
Нужно что бы вообще было не возможно
Невозможное возможно, и это постоянно доказывается, нужно лишь время...
На форуме уже десятки раз обсуждались техники защиты приложений и их обхода, поищите.
Один из изощренных вариантов: напишите драйвер-фильтр файловой системы, который будет скрывать нужный софт
http://habrahabr.ru/post/176739/
http://habrahabr.ru/post/138796/
0
natrox
12 / 16 / 5
Регистрация: 13.04.2011
Сообщений: 148
30.08.2013, 05:28 9
а разве при запуске одного процесса из другого, запускающий процесс не будет считаться для запускаемого родительским? запускающийся процесс вроде все от запускаемого наследует, разве нельзя отловить handle родительского процесса? я как-то сталкивался с тем что права доступа наследуются процессу запускаемому из wf приложения. хотя может что путаю.
0
Qfeed
0 / 0 / 0
Регистрация: 14.03.2013
Сообщений: 56
30.08.2013, 06:38  [ТС] 10
Цитата Сообщение от NickoTin Посмотреть сообщение
Можно.

Невозможное возможно, и это постоянно доказывается, нужно лишь время...
На форуме уже десятки раз обсуждались техники защиты приложений и их обхода, поищите.
Один из изощренных вариантов: напишите драйвер-фильтр файловой системы, который будет скрывать нужный софт
http://habrahabr.ru/post/176739/
http://habrahabr.ru/post/138796/
Та мне бы хоть от школохакеров защититься.
0
Psilon
Master of Orion
Эксперт .NET
6000 / 4850 / 902
Регистрация: 10.07.2011
Сообщений: 14,460
Записей в блоге: 5
Завершенные тесты: 4
30.08.2013, 09:26 11
Qfeed, тогда я уже сказал как
0
Qfeed
0 / 0 / 0
Регистрация: 14.03.2013
Сообщений: 56
30.08.2013, 10:58  [ТС] 12
Вот нашёл в инете такую функцию дешифрования, но тут она сохраняет сам файл, как мне его запустить прямо из памяти не сохраняя ?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
            byte[] buff = null;
            using (var sa = algo)
            using (var fsr = File.Open(fileIn, FileMode.Open, FileAccess.Read))
            using (var cs = new CryptoStream(fsr,
                sa.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Read)
                )
            {
                buff = new byte[fsr.Length];
                cs.Read(buff, 0, buff.Length);
                using (var fsw = File.Open("Application.exe", FileMode.Create, FileAccess.Write))
                {
                    int len = (int)BitConverter.ToInt64(buff, 0);
                    fsw.Write(buff, sizeof(long), len);
                    fsw.Flush();
                }
            }
0
NickoTin
Почетный модератор
Эксперт .NET
8446 / 3568 / 402
Регистрация: 14.06.2010
Сообщений: 4,512
Записей в блоге: 9
30.08.2013, 11:23 13
Добавляете WinForm приложение в ресурсы к WPF приложению и запускаете так:
C#
1
2
3
4
5
6
7
        private void ButtonBase_OnClick ( object sender, RoutedEventArgs e )
        {
            var thread = new Thread( 
                ( ) => Assembly.Load( Properties.Resources.WindowsFormsApplication1 )
                               .EntryPoint.Invoke( null, new object[] { new string[0] /* Если у функции Main нет параметров, то null вместо string[0] */ } ));
            thread.Start();
        }
Можно добавить проверку как посоветовал natrox, описывал здесь: Узнать родительский процесс, ну и как Psilon посоветовал, но это совсем просто
1
Qfeed
0 / 0 / 0
Регистрация: 14.03.2013
Сообщений: 56
30.08.2013, 11:31  [ТС] 14
Цитата Сообщение от NickoTin Посмотреть сообщение
Добавляете WinForm приложение в ресурсы к WPF приложению и запускаете так:
C#
1
2
3
4
5
6
7
        private void ButtonBase_OnClick ( object sender, RoutedEventArgs e )
        {
            var thread = new Thread( 
                ( ) => Assembly.Load( Properties.Resources.WindowsFormsApplication1 )
                               .EntryPoint.Invoke( null, new object[] { new string[0] /* Если у функции Main нет параметров, то null вместо string[0] */ } ));
            thread.Start();
        }
Можно добавить проверку как посоветовал natrox, описывал здесь: Узнать родительский процесс, ну и как Psilon посоветовал, но это совсем просто
Думаю это совсем не вариант, так как лаунчер скачивает приложение wf из сервера, после его запускает.
0
NickoTin
Почетный модератор
Эксперт .NET
8446 / 3568 / 402
Регистрация: 14.06.2010
Сообщений: 4,512
Записей в блоге: 9
30.08.2013, 11:32 15
Qfeed, да какая разница? Properties.Resources.WindowsFormsApplication1 это массив байт, замените на принятый от сервера массив, всё.
0
Qfeed
0 / 0 / 0
Регистрация: 14.03.2013
Сообщений: 56
30.08.2013, 11:37  [ТС] 16
Цитата Сообщение от NickoTin Посмотреть сообщение
Qfeed, да какая разница? Properties.Resources.WindowsFormsApplication1 это массив байт, замените на принятый от сервера массив, всё.
Честно сказать я не понял...
0
NickoTin
Почетный модератор
Эксперт .NET
8446 / 3568 / 402
Регистрация: 14.06.2010
Сообщений: 4,512
Записей в блоге: 9
30.08.2013, 11:42 17
Ну вот вы скачиваете Ваш файл с сервера, Вы получаете массив байт (ну или Stream, переводите его в массив байт), его и используйте потом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        private void ButtonBase_OnClick ( object sender, RoutedEventArgs e )
        {
            var thread = new Thread( 
                ( ) => Assembly.Load( GetFileFromServer() )
                               .EntryPoint.Invoke( null, new object[] { new string[0] /* Если у функции Main нет параметров, то null вместо string[0] */ } ));
            thread.Start();
        }
 
        private byte[] GetFileFromServer()
        {
            byte[] buff = ...;
            // TODO
            return buff;
        }
1
Qfeed
0 / 0 / 0
Регистрация: 14.03.2013
Сообщений: 56
30.08.2013, 12:09  [ТС] 18
NickoTin, Большое спасибо, всё понял) Помогите ещё пожалуйста с 12 постом.
0
Psilon
Master of Orion
Эксперт .NET
6000 / 4850 / 902
Регистрация: 10.07.2011
Сообщений: 14,460
Записей в блоге: 5
Завершенные тесты: 4
30.08.2013, 19:42 19
NickoTin, кстати на днях видел очень похожий код, но слабо понял что и откуда он загружает и как работает. Не поможете?
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
[STAThread]
private static void Main(string[] args)
{
    try
    {
        using (Stream stream = typeof(P).Assembly.GetManifestResourceStream("a.zip"))
        {
            using (Package package = Package.Open(stream, FileMode.Open, FileAccess.Read))
            {
                L(package, "/WPFForm.exe").EntryPoint.Invoke(null, new object[0]);
            }
        }
    }
    catch (Exception)
    {
    }
}
private static Assembly L(Package p, string u)
{
    byte[] buffer;
    Uri partUri = new Uri(u, UriKind.Relative);
    using (Stream stream = p.GetPart(partUri).GetStream())
    {
        buffer = new byte[(int) stream.Length];
        stream.Read(buffer, 0, buffer.Length);
    }
    Assembly assembly = Assembly.Load(buffer);
    if (null == assembly)
    {
        throw new ArgumentException("Unable to load assembly: " + u);
    }
    return assembly;
}
0
NickoTin
Почетный модератор
Эксперт .NET
8446 / 3568 / 402
Регистрация: 14.06.2010
Сообщений: 4,512
Записей в блоге: 9
30.08.2013, 20:33 20
Цитата Сообщение от Qfeed Посмотреть сообщение
Помогите ещё пожалуйста с 12 постом
Вам шифрование нужно? Тут можно несколько вариантов:
  • если сервер Ваш, то можно сделать такую схему:
    используем асимметричный алгоритм шифрования, например RSA, генерируем ключ, отправляем на сервер открытую часть ключа, сервер шифрует данные отправляет их Вам, Вы их расшифровываете закрытым ключом у себя;
  • если нет, то можно что-то простенькое, тогда можете обычный XOR использовать ) ну или подобные алгоритмы, хотя не понимаю зачем, всё-равно сборку можно сдампить в момент Assembly.Load
На форуме много раз обсуждались принципы использования шифрования.

Цитата Сообщение от Psilon Посмотреть сообщение
но слабо понял что и откуда он загружает и как работает
В 6 строчке получаем ресурс "a.zip" из сборки в которой объявлен тип P, он представляет из себя ZipPackage, открываем этот package и передаем его в метод L с указанием файла который нужно извлечь - "WPFForm.exe". В 22 строке получаем поток который представляет из себя запакованный файл "WPFForm.exe", извлекаем этот файл из архива и сохраняем в buffer, загружаем этот буфер в 27 строчке, выходим из L и вызываем точку входа загруженной сборки.
1
30.08.2013, 20:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.08.2013, 20:33

Запуск программы из Stream
Есть ли возможность запуска программы бинарник которой находится в потоке...

Запретить запуск программы
а как запретить запуск программы даже первый раз? т.е. чтоб программа вобще не...

Запуск файла из программы
Никак не могу найти функцию. Программа является ланчером для другой программы,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru