Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
16 / 16 / 8
Регистрация: 18.03.2014
Сообщений: 268

Запуск программы из массива байт

07.01.2015, 18:50. Показов 3602. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вся суть в том что моя программа шифрует исполняем файл а при расшифровке сразу запускает изнутри . Вот в чём вся проблема массив байт не хочет запускаться. Что посоветуете? Вот часть кода:
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
        byte[] CryptFile(byte[] byt, int key)
        {
            byte[] _byt = byt;
 
            if (checkBox1.Checked) // checkBox1 - отвечает шифрование или дишифровка
                _byt[0] = (byte)(_byt[0] ^ key);
 
            for (int i = 1; i <= _byt.Length - 1; i++)
            {
                _byt[i] = (byte)(_byt[i] ^ _byt[0] ^ key);
            }
 
            if (!checkBox1.Checked) 
                _byt[0] = (byte)(_byt[0] ^ key);
 
            return byt;
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            byte[] byt = File.ReadAllBytes(textBox4.Text); // В textBox4 - путь до программы
 
            byte[] crypt = CryptFile(byt, Convert.ToInt32(textBox3.Text)); // В textBox3 - ключь
 
            if (!checkBox1.Checked)
            { // Собственно часть которая должна запускать программу
                var assembly = Assembly.Load(crypt); 
                var entryPoint = assembly.EntryPoint;
                var commandArgs = new string[0];
                var returnValue = entryPoint.Invoke(null, new object[] {commandArgs});
            }
else 
{ 
File.WriteAllBytes(textBox5.Text, crypt); // В textBox5 - путь для сохранения 
}
        }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.01.2015, 18:50
Ответы с готовыми решениями:

Как заставить программу принимать цепочку байт из оперативной памяти, в виде массива байт ?
В памяти процесса есть закодированный блок с байтами, есть адрес этого блока и размер. Есть так-же функция дешифровки этих байт, но она...

Вычесть из одного массива байт другой массив байт
Здравствуйте! Подскажите что нужно сделать чтобы из одного массива байт вычесть другой массив байт!

Запуск программы без создания окна. Запуск фоновой программы
Вопрос, как сделать, чтобы консольное приложение при запуске не создавало окошко консоли. Т.е. запустился процесс, но визуально ничего не...

8
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
07.01.2015, 20:02
Hopeco, попробуйте так. Тут без всякого кодирования-раскодирования, но это не принципиально...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.IO;
using System.Reflection;
 
namespace TestProgram_Test {
    class Program {
        static void Main(string[] args) {
            byte[] data = File.ReadAllBytes("TestProgram.exe");
            Assembly asm = Assembly.Load(data);
            Type t = asm.GetType("TestProgram.Program");
            MethodInfo mi = t.GetMethod("Main", BindingFlags.NonPublic|BindingFlags.Static);
            object[] strArgs = new object[] { new string[] { null } };
            mi.Invoke(null, strArgs);
        }
    }
}
1
16 / 16 / 8
Регистрация: 18.03.2014
Сообщений: 268
08.01.2015, 05:13  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
using System.IO;
using System.Reflection;
 
namespace Cr
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] data = File.ReadAllBytes("Cr.exe");
            Assembly asm = Assembly.Load(data);
            Type t = asm.GetType("cr.Program");
            MethodInfo mi = t.GetMethod("Main", BindingFlags.NonPublic | BindingFlags.Static);
            object[] strArgs = new object[] { new string[] { null } };
            mi.Invoke(null, strArgs);
        }
    }
}
Необработанное исключение типа "System.NullReferenceException" в Cr.exe

Дополнительные сведения: Ссылка на объект не указывает на экземпляр объекта.

===
Возникает на строчке:
C#
1
MethodInfo mi = t.GetMethod("Main", BindingFlags.NonPublic | BindingFlags.Static);
Добавлено через 2 минуты
Да и плюс ко всем в данном примере нужно указать класс, и метод:
C#
1
2
 Type t = asm.GetType("cr.Program");
            MethodInfo mi = t.GetMethod("Main", BindingFlags.NonPublic | BindingFlags.Static);
А если программа написана на c++ типа:
C++
1
2
3
4
5
#include <iostream>
void main()
{
std::cout << "Hello";
}
То данный метод тут не действителен.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
08.01.2015, 05:16
Цитата Сообщение от Hopeco Посмотреть сообщение
Дополнительные сведения: Ссылка на объект не указывает на экземпляр объекта.
Пройдите в отладке, и посмотрите код самой программы, что пытаетесь запустить. Метод Main() в ней присутствует? Он не public там случаем?

Добавлено через 1 минуту
Цитата Сообщение от Hopeco Посмотреть сообщение
А если программа написана на c++
Та программа, которую пытаетесь запустить, на каком языке написана?
0
16 / 16 / 8
Регистрация: 18.03.2014
Сообщений: 268
08.01.2015, 05:30  [ТС]
Программа которую надо запустить может быть написана на любом языке в этом вся суть проблемы. А проблему с исключением уже исправил.

Добавлено через 1 минуту
Главное что бы это был исполняемый файл.

Добавлено через 3 минуты
Надо как то обнаруживать класс и метод автоматически и передавать в качестве параметров.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
08.01.2015, 05:40
Цитата Сообщение от Hopeco Посмотреть сообщение
в этом вся суть проблемы.
Суть проблемы в том, что вы пытаетесь применить отражение для того, для чего это не предназначено.
В данном случае вариант - создавать файл из массива байт и через Process.Stsrt запускать его. Перед выходом из программы убивать этот процесс и удалять файл.
0
16 / 16 / 8
Регистрация: 18.03.2014
Сообщений: 268
08.01.2015, 05:52  [ТС]
Да но если мне нельзя создавать никакого файла по религиозным соображениям ?
То как мне ещё запустить этот массив байт?
А так что вы говорите реализуется в две строчки и в данном случае это неподходящий метод.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
08.01.2015, 05:55
Цитата Сообщение от Hopeco Посмотреть сообщение
Да но если мне нельзя создавать никакого файла по религиозным соображениям ?
Меняйте соображения)))
Цитата Сообщение от Hopeco Посмотреть сообщение
То как мне ещё запустить этот массив байт?
Никак, ятд. Отражение предназначено для работы с управляемыми сборками.
0
16 / 16 / 8
Регистрация: 18.03.2014
Сообщений: 268
08.01.2015, 06:41  [ТС]
Что вы подразумеваете под управляемыми сборками?

Добавлено через 10 минут
И вот ещё вопрос у меня есть файл Test.exe он выводит консоль с текстом Hello world, и если я его запускаю так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.IO;
using System.Reflection;
 
namespace TestProgram_Test {
    class Program {
        static void Main(string[] args) {
            byte[] data = File.ReadAllBytes("Test.exe");
            Assembly asm = Assembly.Load(data);
            Type t = asm.GetType("Test.Program");
            MethodInfo mi = t.GetMethod("Main", BindingFlags.NonPublic|BindingFlags.Static);
            object[] strArgs = new object[] { new string[] { null } };
            mi.Invoke(null, strArgs);
        }
    }
}
то всё работает, а если использую при этом коде алгоритм шифрования xor, то есть сначала шифрую а потом сразу декодирую не запускает и вылезает исключение на строчке
C#
1
mi.Invoke(null, strArgs);
.

Добавлено через 25 минут
Проблема решена, вопрос закрыт!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.01.2015, 06:41
Помогаю со студенческими работами здесь

Автоматический запуск java файла для получения байт-кода
Есть ли возможность сделать так , чтобы при нажатии на java файл он автоматически прописывал в командную строку javac имяфайла.java .? и...

Запуск студией и запуск самой виндой. Разница работы программы
Итак, проблема такова: есть проект, который замечательно работает при нажатии F5 в студии. При компиляции в релиз-режиме и запуске...

Найти максимальный элемент массива и записать его в Rg BH (формат элементов массива - байт).
Помогите пожалуйста написать программу на ассемблере. Буду очень сильно благодарен. Найти максимальный элемент массива и записать его...

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

Как удалить ссылку на запуск программы при удалении программы
Всем привет! Для установки - удаления программ использую такие пакеты как InstallShield и Advanced Installer. Они чётко справляются со...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru