Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > [C++ WinAPI]Скопировать содержимое exe файла |
Автор: Bugmaker 5.4.2009, 18:14 |
Как программно прочитать содержимое exe файла? Допустим виндового calc.exe. Пробовал fopen\fgets.. не получается. Может я вообще не тем путем иду? хочу программно создать exe файл без копирования. То есть допустим запускаю программу на другом компе а она там создает exe файл с нужным содержимым. Можно ли это реализовать, и будет ли вообще такой файл потом корректно запускаться? |
Автор: GremlinProg 5.4.2009, 18:19 |
Перемещено в "С/C++ общие вопросы" |
Автор: andrew_121 5.4.2009, 18:51 |
Bugmaker, Да, можно. Но на стадии компиляции тебе нужно содержимое файла преобразовать в массив значений, и при запуске проги его записывать в файл. |
Автор: GoldFinch 5.4.2009, 18:58 |
в ресурсы его засунь |
Автор: xvr 5.4.2009, 20:08 | ||||||
fopen можно (только не забыть поставить ему бинарную моду чтения 'rb'). fgets - нельзя. Он читает строки, разделенные символом конца строки ('\n'), в бинарнике они могут быть где угодно. Пользуй fread
![]()
![]() Повбивав бы ![]() |
Автор: GoldFinch 5.4.2009, 20:11 |
xvr, такое поведение еще свойственно инсталляторам |
Автор: Bugmaker 6.4.2009, 00:05 | ||
Не могу нагуглить ниодного простого примера... толи спать уже пора.
Вот такой код выводит кусок файла. Скажите, что где поменять чтобы прочесть весь файл. fread( buffer, 1,20, file); если пытаюсь менять цифры 1 и 20 на другие то программа иногда вообще закрывается сразу после запуска сама. Вобщем ссылочку бы на подробное описание или пример было бы неплохо. Спасибо всем, кто откликнулся. |
Автор: GoldFinch 6.4.2009, 08:23 |
программа ведь под винду пишется? зачем тогда юзать fopen и т.п. вроде бы надо "программно создать exe файл" зачем тогда его считывать? надо же написать программу которая пишет файл а та которая считывает - это совсем другой код можно конечно написать программу которая при запуске с параметром "имя файла" записывает в себя этот файл, а при запуске без параметра записывает этот файл на диск, но разве это надо? |
Автор: xvr 6.4.2009, 10:27 | ||||
buffer должен быть описан как char buffer[20]; Выводить его в cout через << не получится - это бинарные данные, что там выведется неизвестно |
Автор: Bugmaker 6.4.2009, 18:10 |
GoldFinch ты прав, нужно создать exe. Но если я просто открою calc.exe в блокноте, все скопирую и через fputs помещу в exe файл, он же не будет работать не так ли? xvr как корректно вывести бинарные данные? |
Автор: GoldFinch 6.4.2009, 18:47 |
Bugmaker, для копирования файла в большинстве случаев подойдет copy dropper.exe+calc.exe dropper.exe затем dropper.exe должен будет записать calc.exe из конца себя на диск |
Автор: JAnty 6.4.2009, 18:50 |
Есть такой язык не С++, а С. fprintf и fscanf читая и записывая символы как числа или наоборот. Не забывайте, что С могучей чем С++!!! |
Автор: GoldFinch 6.4.2009, 18:54 |
JAnty, там понял что написал? |
Автор: JAnty 6.4.2009, 18:58 |
GoldFinch да, я это уже делал. Я делал ехе файлы через принтф. |
Автор: zim22 6.4.2009, 20:03 |
приведите пример. дабы не быть голословным. |
Автор: xvr 6.4.2009, 20:24 | ||||||
Вывести куда? Если в stdout - то никак. Это текстовый поток и он не рассчитан на вывод бинарных данных. (Точнее, если перенаправить вывод из программы в файл, то в такой stdout вывести можно, но это уже за рамками) Для копирования из файла в файл можно использовать fread/fwrite. Для создания файла из ресурсов - FindResource/LoadResource/LockResource + fwrite Для помещения файла в ресурс нужно добавить в проект *.rc файл такого содержания
Добавлено через 1 минуту и 38 секунд
Это сделать можно (через printf("%c",byte);) Но с тем же успехом можно и гланды через жо... удалять ![]() |
Автор: zim22 6.4.2009, 20:33 | ||
интересно дождаться варианта JAnty. Вдруг у него всё будет без крови, цивильнинько. ![]() |
Автор: GoldFinch 6.4.2009, 21:47 |
для записи на диск в винде нада использовать WriteFile , а не fwrite и ресурсы юзать необязательно, можно прямо в конец файла писать |
Автор: Bugmaker 6.4.2009, 21:56 |
с ресурсами не разберусь... создал новый source.rc вписал в него CFG_dgrs_cfg RCDATA DISCARDABLE "calc.exe" потом в основнйо программе сделал #include <source.rc>. Далее могу его использовать например так fwrite ("1.exe",500,500,CFG_dgrs_cfg); ?? Или чтото не так делаю?? Вообще когда пытаюсь откомпилировать source.rc компилятор тужится и помоему зависает... буду ждать... GoldFinch а что писать в конец файла то?? где взять содержимое экзешника?? если я его блокнотом открою и получанный текст запишу, это ведь будет неверно?? как узнать что писать то?? |
Автор: GoldFinch 6.4.2009, 21:58 | ||
в консоли (cmd) copy dropper.exe+calc.exe dropper.exe правда тут возникает проблема определения конца дроппера, к тому же размер дроппера должен быть выровнен по 512-байтовой границе |
Автор: Bugmaker 6.4.2009, 22:15 |
GoldFinch Если я с таким примитивом не могу разобраться то куда уж мне до определения конца и выравнивания то?? -) Поясните подробнее с ресурсами.. В чем моя ошибка ? |
Автор: GoldFinch 6.4.2009, 23:13 | ||||
в том что надо не тупо копипастить, а умно копипастить, разбираясь в том что копипастишь для работы с бинарными файлами (в том числе .ехе) есть специальные программы - hex-редакторы самой популярной считается WinHEX в частности в WinHEX есть фича - копирование данных в виде исходника С выделяешь весь файл, edit>copy block->C source получаешь в буфере обмена текст вида
вставляешь его в исходник дроппера, и получаешь чтото такое
|
Автор: Bugmaker 6.4.2009, 23:27 |
GoldFinch спасибо большое.. это я и имел ввиду, когда спрашивал будет ли верным просто скопировать содержимое через блокнот. |
Автор: Anikmar 6.4.2009, 23:29 |
Если вы хотите создать exe без копирования, то чем уж так принципиально отличаются ресурсы от копирования? Что кроме exe в файле ресурсов еще пара иконок будет? Переименуйте calc.exe в файл ttt.dat и программно копируйте его в calc.exe - по сути тот же эффект, что и с ресурсами. Вариант WinHEX - для разумных по размеру файлов весьма неплох. По крайней мере exe-файл вашей программы будет один. |
Автор: GoldFinch 7.4.2009, 08:25 | ||
Bugmaker, даи вообще, дался те этот С++, всеравно ты его не знаешь ^^ пиши лучше на fasm, он более приспособлен для таких целей, и код там короче, и никаких WinHEX и ресурсов не надо
|
Автор: xvr 7.4.2009, 11:59 | ||||
Все не так.
|
Автор: JAnty 7.4.2009, 12:14 | ||
Упс, я надеюсь вы не поверели буквально не printf а fprintf(); Вот пример, я програмно прочитал calc.exe и записал его в calc_2.exe
![]() |
Автор: GoldFinch 7.4.2009, 12:17 |
unsigned char c; fscanf(f,"%c",&c); ололо быдлокод детектед |
Автор: JAnty 7.4.2009, 12:32 |
можно и без unsigned это для корректности. |
Автор: Lazin 7.4.2009, 12:42 | ||
|
Автор: zim22 7.4.2009, 12:57 | ||
а какое число вы будете писать, вместо 176128 если размер файла 5 гиг будет? int как-бы не бесконечный Добавлено через 2 минуты и 50 секунд unsigned как-раз и нужен. вы с байтами работаете. а байт - это число от 0 до 255. если signed char будет - некорректно файл скопируете. |
Автор: JAnty 7.4.2009, 13:05 |
Согласен, нон какл копируется и без унсигнед. А если 5 гиг то пока не достигнем конца файла feof(f); |
Автор: zim22 7.4.2009, 13:14 |
действительно копируется. странно... |
Автор: GoldFinch 7.4.2009, 13:28 | ||
zim22, а как это интересно signed может на чтото повлиять? Добавлено через 4 минуты и 8 секунд
в вин32 .ехе таких размеров не бывает и быть не может |
Автор: zim22 7.4.2009, 13:45 | ||
я имел ввиду не обязательно exe. можно и видео-файлы копировать. я думал, что в битовом представлении с1 и c2 различны. ошибался.
|
Автор: GoldFinch 7.4.2009, 14:51 |
zim22, даже если бы их "битовое представление" различалось, как у float и int, это POD-типы одного размера, и согласно стандарту их можно копировать один в другой без потери информации |
Автор: zim22 7.4.2009, 15:10 | ||
не знал. век живи - век учись у GoldFinch'а ![]() |
Автор: JAnty 7.4.2009, 18:37 |
Если не unsigned то знак минус тупо меняется на знак "1" в бинарном представлении если присваиваем отрицательное значение только положительному типу типа int. P.S. Ну я и написал... |
Автор: zim22 7.4.2009, 20:24 | ||||
ничего не меняется. два разных значения будут иметь один и тот же битовый эквивалент. смотри сам:
|
Автор: Anikmar 7.4.2009, 23:16 |
Почему вы так уверены? |
Автор: GoldFinch 8.4.2009, 00:38 |
Anikmar, во первых SizeOfImage <= 0x77000000 (размер образа в памяти) во вторых значения файловых смещения секций должны влазить в dword разве что в конце файла будет мусор не принадлежащий ни одной из секций, тогда файл может и загрузится |
Автор: Anikmar 8.4.2009, 01:03 | ||
Во-первых размер образа памяти никоим образом не колышит файловую систему. Во-вторых почитайте описание NTFS на досуге, прежде чем кидать голословные утверждения. В-третьих про какие секции файла вы говорите? Вы сказали про win32. Windows XP принадлежит к этой категории? |
Автор: GoldFinch 8.4.2009, 08:11 |
с этого и надо было начинать. какбэ .exe-PE файл состоит из заголовка и секций, вот о них я и говорю да, XP принадлежит к этой категории |
Автор: Anikmar 8.4.2009, 08:19 | ||
Т.е. я не смогу создать SFX-архив больше 4-х гигов или он не является exe-файлом? |
Автор: GoldFinch 8.4.2009, 08:36 | ||||||
вобщем теория это хорошо, а эксперимент - лучше я расширил размер .exe до 2Гб, файл запустился, расширил размер файла до 4Гб - файл не запустился способ расширения размера файла:
Добавлено через 6 минут и 17 секунд не, я наврал. при попытке сделать файл ~2.7Гб
винда отказывается его запускать
|
Автор: Lazin 8.4.2009, 10:24 |
а как она его разместит в адресном пространстве, выделяемом процессу в 32х разрядной версии windows? |
Автор: GoldFinch 8.4.2009, 10:33 |
Lazin, загрузчик мог бы не загружать весь файл целиком, а загрузить только его заголовок и секции, но видимо этого не происходит |
Автор: Anikmar 8.4.2009, 11:09 |
То что единый образ не может быть больше 4 Гигов - это понятно, но GoldFinch прав - можно ведь пришить в хвост exe свои дополнительные данные и файл может хоть 15 гиг. Однако тут опыт показывает, что что-то не так. WinRar успешно создает SFX архивы любого размера - у меня есть exe файл размером 6 Гиг, который WinRar успешно создал и ничего не сказал. Вот только винда говорит, что этот файл не Win32 - видимо последний WinRar создает его уже заточенным под Win64 - не знаю. Но я лично читал, что так возможно. Найду более старый WinRar попробую. |
Автор: JAnty 8.4.2009, 14:29 | ||
zim22 :
|
Автор: zim22 8.4.2009, 15:39 |
и что? в битовом представлении они одинаковы |
Автор: JAnty 8.4.2009, 16:15 |
Да, точно! Значит -159=97 ![]() |
Автор: zim22 8.4.2009, 16:24 |
только учителю математики этого не говорите ![]() |
Автор: JAnty 8.4.2009, 19:22 |
и а=а+1 |