Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/27: Рейтинг темы: голосов - 27, средняя оценка - 4.52
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
1

Запуск приложения из ресурсов

12.03.2012, 02:15. Показов 5480. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно реализовать запуск стороннего приложения которое лежит в ресурсах моего.

Пробовал так:
C#
1
2
System.Byte[] bts = global::MyApp.Properties.Resources.extapp;
Assembly asm = Assembly.Load(bts);
Дальше код не привожу ибо на Assembly.Load вылазит исключение BadImageFormatException:


An unhandled exception of type 'System.BadImageFormatException' occurred in mscorlib.dll

Additional information: Невозможно загрузить файл или сборку "491841 bytes loaded from MyApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" или один из зависимых от них компонентов. Была сделана попытка загрузить программу, имеющую неверный формат.

Код самого ресурса:
<data name="extapp" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\extapp.exe;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>

Возможно я не от того иду... Мну нужно просто по клику запускать приложение и выходить из моей программы.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.03.2012, 02:15
Ответы с готовыми решениями:

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

Запуск *.exe из ресурсов
Здравствуйте! Подскажите, как запустить исполняемый файл из ресурсов?

Запуск exe из ресурсов программы
Я сейчас делаю АнтиХак лаунчер.. И хотелось бы узнать - А возможно ли засунуть Wow.exe во внутрь...

Локализация приложения с использованием ресурсов
Имеется локализованное приложение с использованием ресурсов. dll-ка локализации лежит в папке...

11
107 / 107 / 9
Регистрация: 19.12.2010
Сообщений: 417
12.03.2012, 03:33 2
Может всё-таки кто-то предложит нормальный вариант?
0
134 / 87 / 22
Регистрация: 28.08.2009
Сообщений: 363
12.03.2012, 04:50 3
обычно делаю так

приложение, которое нужно стартануть, наследуется от интерфейса
например
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    public interface ISubSystem
    {
          //краткий перечень того что может потребоваться
 
        string Name
        {
            get;
        }
 
        /// <summary>
        /// Метод, запускающий подсистему
        /// </summary>
        void Show(object Form);
 
 
    }
потом зная имя файла получаешь из него объект класса, унаследованного от твоего интерфейса
в нем реализован метод Show, который стартанет твое приложение

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
       ISubSystem GetSubSystem(string fileName)
        {
            Type ObjType = null;
 
            try
            {
                Assembly ass = null;
 
                ass = Assembly.LoadFile(fileName);
 
                if (ass != null)
                {
                    Type[] types = ass.GetTypes();
 
                    ObjType = types.Where(t => t.GetInterface(ISubSystemName) != null).First();
                }
 
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
 
            if (ObjType != null)
                return (ISubSystem)Activator.CreateInstance(ObjType);
            else
                return null;
 
        }
получив объект, вызываешь у него метод Show
C#
1
2
3
ISubSystem s = GetSubSystem(filename);
 
s.Show(this);
остальной функционал добавляешь по желанию

Добавлено через 4 минуты
только сейчас мысль пришла, может тебе exe приложение надо запустить?
можно так
C#
1
System.Diagnostics.Process.Start("1.exe");
0
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
12.03.2012, 17:33  [ТС] 4
Стороннее приложение должно хранится в ресурсах) + оно написано на плюсах

Добавлено через 2 часа 22 минуты
А какой аналог memcpy в c#? Marshal.Copy?

Добавлено через 5 часов 5 минут
Нашёл одно решение: _ruring.info/index.php?db=so&id=305203#en но половина прог не работает ( на NtResumeThread падает ).

Сейчас реализую другой способ. Проблема в плохом знании c#. Подскажите аналог memcpy
0
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
13.03.2012, 18:15  [ТС] 5
ап


)
0
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.03.2012, 15:12  [ТС] 6
ап

)
0
2756 / 2059 / 384
Регистрация: 22.07.2011
Сообщений: 7,781
15.03.2012, 15:47 7
Отражение исполняемых файлов C++ может вызвать исключение BadImageFormatException. Причина этого, вероятнее всего, в том, что компилятор C++ удаляет адреса переадресации или раздел .reloc из исполняемого файла. Чтобы сохранить адрес .reloc для исполняемого файла на языке C++, следует задать при компоновке значение /fixed:no.

Добавлено через 5 минут
И вообще, могу ошибаться, но по моему загрузить в домен можно только управляемые сборки, т.к классический PE формат несколько отличается от PE NET формата, по меньшей мере он не содержит метаданных , которые анализируются при загрузки сборки.

Подскажите аналог memcpy
- разве что юзать апишную WriteProcessMemory, в NET-е все операции с памятью автоматические, поэтому нет надобности в подобных функциях.
0
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.03.2012, 16:03  [ТС] 8
sau
Я умею обращаться к справке.

в NET-е все операции с памятью автоматические, поэтому нет надобности в подобных функциях.
Зачем тогда unsafe
0
2756 / 2059 / 384
Регистрация: 22.07.2011
Сообщений: 7,781
15.03.2012, 16:43 9
Ну да, если сам хочешь с указателями работать, как я понял ты хочешь записать в память текущего процесса исполняемый код , а потом дергать его по адресу ?
Мну нужно просто по клику запускать приложение и выходить из моей программы.
а, ну если так, то просто сохраняешь файл из ресурсов на диск, запускаешь через Process.Start и выходишь из своей программы, и не нужно
другого гемороя.

Хотя конечно интереснее запустить код программы без создания файла на диске, на С++ тупо выделяем память, пишем туда код, получаем адрес и переходим через асм инструкцию mov 0xАдресс. - интересно как такое на шарпе провернуть.

Видимо что то вроде:
C#
1
2
3
4
5
6
byte[] data = global::MyApp.Properties.Resources.extapp;
IntPtr addr = Marshal.AllocCoTaskMem(data.Length);
Marshal.Copy(data,0,addr,data.Length);//кстати, в итоге она транслируется в memcpy
addr += 0x20000;//смещение до функции main.
MainDelegate main= Marshal.GetDelegateForFunctionPointer(addr, typeof(MainDelegate));
main();
0
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.03.2012, 16:51  [ТС] 10
sau
Держать на диске файл мне не подходит.

Ну да, если сам хочешь с указателями работать, как я понял ты хочешь записать в память текущего процесса исполняемый код , а потом дергать его по адресу
Я хочу выделить под приложение память и запустить его. Но из-за плохих знаний C# это проблематично.


Вот наброски:
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
IntPtr code, headers;
 
            Byte[] IMAGE_DOS_HEADER = new Byte[0x40];
            Byte[] IMAGE_NT_HEADERS = new Byte[0xF8];
 
            Byte* pIMAGE_DOS_HEADER;
            fixed (Byte* p = &IMAGE_DOS_HEADER[0])
                pIMAGE_DOS_HEADER = p;
 
            Byte* pIMAGE_NT_HEADERS;
            fixed (Byte* p = &IMAGE_NT_HEADERS[0])
                pIMAGE_NT_HEADERS = p;
 
            Buffer.BlockCopy( data, 0, IMAGE_DOS_HEADER, 0, IMAGE_DOS_HEADER.Length );
            if ( 0x5A4D  != (* (ushort*)(pIMAGE_DOS_HEADER) ) )
                return -1;  // Невалидный исполняемый файл
 
            Buffer.BlockCopy(data, (*(int*)(pIMAGE_DOS_HEADER + 0x3c)), IMAGE_NT_HEADERS, 0, IMAGE_NT_HEADERS.Length);
            if (0x4550 != (*(uint*)(pIMAGE_NT_HEADERS)))
                return -2;  // Не найден PE-заголовок
 
            // [url]http://www.jbox.dk/sanos/source/include/os.h.html[/url]
            code = VirtualAlloc(new IntPtr(*(int*)(pIMAGE_NT_HEADERS + 0x34)),  // IMAGE_NT_HEADERS->OptionalHeader.ImageBase
                                (*(uint*)(pIMAGE_NT_HEADERS + 0x50)), // IMAGE_NT_HEADERS->OptionalHeader.SizeOfImage
                                0x2000, // MEM_RESERVE
                                0x04    // PAGE_READWRITE
                               );
 
            if (IntPtr.Zero == code)   
            {
                code = VirtualAlloc( IntPtr.Zero,
                                    (*(uint*)(pIMAGE_NT_HEADERS + 0x50)), // IMAGE_NT_HEADERS->OptionalHeader.SizeOfImage
                                    0x2000, // MEM_RESERVE
                                    0x04    // PAGE_READWRITE
                                   );
 
                if (IntPtr.Zero == code)
                    return -3;  // Невозможно зарезервировать память
            }
 
            VirtualAlloc( code,
                          (*(uint*)(pIMAGE_NT_HEADERS + 0x50)), // IMAGE_NT_HEADERS->OptionalHeader.SizeOfImage
                          0x1000, // MEM_COMMIT
                          0x04    // PAGE_READWRITE
                         );
 
            headers = VirtualAlloc(code,
                          (*(uint*)(pIMAGE_NT_HEADERS + 0x50)), // IMAGE_NT_HEADERS->OptionalHeader.SizeOfImage
                          0x1000, // MEM_COMMIT
                          0x04    // PAGE_READWRITE
                         );
Что остается:
- Скопировать PE заголовки
- Скопировать секции
- Обработать таблицу импорта
- Получить точку входа и вызывать её

Добавлено через 2 минуты
Но я уже думаю реализовать либу на плюсах и её подтягивать, ибо на c# мне тяжелей)
0
2756 / 2059 / 384
Регистрация: 22.07.2011
Сообщений: 7,781
15.03.2012, 17:10 11
Нет уж, давайте на c# ), ибо мне тоже интересно..., все нативные структуры отражаются через маршалинг типа Marshal.PtrToStructure и тому подобное, ну или через unsafe как у вас.
https://www.cyberforum.ru/csha... 42135.html - тут основные моменты расписаны, думаю должно хватить для решения задачи.
0
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.03.2012, 17:16  [ТС] 12
Спасибо, приеду с работы обязательно попробую и отпишусь.
0
15.03.2012, 17:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.03.2012, 17:16
Помогаю со студенческими работами здесь

Использование ресурсов в папке приложения
Предположим я создал несколко Button при виртуалной иницилизации памяти. Я написал код когда при...

Как скопировать файл на диск из ресурсов приложения?
Всем добрый вечер! Очень срочная проблема. У меня в солюшне несколько проектов. В основном...

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

Запуск exe-файла из ресурсов
Здравствуйте. Как сделать, чтобы при нажатии на кнопку запускался exe файл из ресурсов?? Если...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru