![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Bugmaker |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 27.6.2008 Репутация: нет Всего: нет |
Как программно прочитать содержимое exe файла? Допустим виндового calc.exe.
Пробовал fopen\fgets.. не получается. Может я вообще не тем путем иду? хочу программно создать exe файл без копирования. То есть допустим запускаю программу на другом компе а она там создает exe файл с нужным содержимым. Можно ли это реализовать, и будет ли вообще такой файл потом корректно запускаться? |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 3 Всего: 106 |
Перемещено в "С/C++ общие вопросы"
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Bugmaker, Да, можно. Но на стадии компиляции тебе нужно содержимое файла преобразовать в массив значений, и при запуске проги его записывать в файл.
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
в ресурсы его засунь
|
|||
|
||||
xvr |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
fopen можно (только не забыть поставить ему бинарную моду чтения 'rb'). fgets - нельзя. Он читает строки, разделенные символом конца строки ('\n'), в бинарнике они могут быть где угодно. Пользуй fread
![]()
![]() Повбивав бы ![]() |
||||||
|
|||||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
xvr, такое поведение еще свойственно инсталляторам
|
|||
|
||||
Bugmaker |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 27.6.2008 Репутация: нет Всего: нет |
Не могу нагуглить ниодного простого примера... толи спать уже пора.
Вот такой код выводит кусок файла. Скажите, что где поменять чтобы прочесть весь файл. fread( buffer, 1,20, file); если пытаюсь менять цифры 1 и 20 на другие то программа иногда вообще закрывается сразу после запуска сама. Вобщем ссылочку бы на подробное описание или пример было бы неплохо. Спасибо всем, кто откликнулся. |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
http://www.cplusplus.com/reference/clibrar...tdio/fread.html http://msdn.microsoft.com/ru-ru/library/kt0etdcs.aspx |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
программа ведь под винду пишется? зачем тогда юзать fopen и т.п.
вроде бы надо "программно создать exe файл" зачем тогда его считывать? надо же написать программу которая пишет файл а та которая считывает - это совсем другой код можно конечно написать программу которая при запуске с параметром "имя файла" записывает в себя этот файл, а при запуске без параметра записывает этот файл на диск, но разве это надо? |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
buffer должен быть описан как char buffer[20]; Выводить его в cout через << не получится - это бинарные данные, что там выведется неизвестно |
||||
|
|||||
Bugmaker |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 27.6.2008 Репутация: нет Всего: нет |
GoldFinch ты прав, нужно создать exe. Но если я просто открою calc.exe в блокноте, все скопирую и через fputs помещу в exe файл, он же не будет работать не так ли?
xvr как корректно вывести бинарные данные? |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
Bugmaker, для копирования файла в большинстве случаев подойдет
copy dropper.exe+calc.exe dropper.exe затем dropper.exe должен будет записать calc.exe из конца себя на диск |
|||
|
||||
JAnty |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 6.12.2004 Где: Москва Репутация: 1 Всего: 2 |
Есть такой язык не С++, а С.
fprintf и fscanf читая и записывая символы как числа или наоборот. Не забывайте, что С могучей чем С++!!! -------------------- |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
JAnty, там понял что написал?
|
|||
|
||||
JAnty |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 6.12.2004 Где: Москва Репутация: 1 Всего: 2 |
GoldFinch да, я это уже делал. Я делал ехе файлы через принтф.
-------------------- |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
приведите пример. дабы не быть голословным. |
|||
|
||||
xvr |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Вывести куда? Если в stdout - то никак. Это текстовый поток и он не рассчитан на вывод бинарных данных. (Точнее, если перенаправить вывод из программы в файл, то в такой stdout вывести можно, но это уже за рамками) Для копирования из файла в файл можно использовать fread/fwrite. Для создания файла из ресурсов - FindResource/LoadResource/LockResource + fwrite Для помещения файла в ресурс нужно добавить в проект *.rc файл такого содержания
Добавлено через 1 минуту и 38 секунд
Это сделать можно (через printf("%c",byte);) Но с тем же успехом можно и гланды через жо... удалять ![]() |
||||||
|
|||||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
||||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
||||
|
||||
Bugmaker |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 27.6.2008 Репутация: нет Всего: нет |
с ресурсами не разберусь... создал новый source.rc вписал в него CFG_dgrs_cfg RCDATA DISCARDABLE "calc.exe"
потом в основнйо программе сделал #include <source.rc>. Далее могу его использовать например так fwrite ("1.exe",500,500,CFG_dgrs_cfg); ?? Или чтото не так делаю?? Вообще когда пытаюсь откомпилировать source.rc компилятор тужится и помоему зависает... буду ждать... GoldFinch а что писать в конец файла то?? где взять содержимое экзешника?? если я его блокнотом открою и получанный текст запишу, это ведь будет неверно?? как узнать что писать то?? Это сообщение отредактировал(а) Bugmaker - 6.4.2009, 21:57 |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
в консоли (cmd) copy dropper.exe+calc.exe dropper.exe правда тут возникает проблема определения конца дроппера, к тому же размер дроппера должен быть выровнен по 512-байтовой границе Это сообщение отредактировал(а) GoldFinch - 6.4.2009, 22:03 |
|||
|
||||
Bugmaker |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 27.6.2008 Репутация: нет Всего: нет |
GoldFinch
Если я с таким примитивом не могу разобраться то куда уж мне до определения конца и выравнивания то?? -) Поясните подробнее с ресурсами.. В чем моя ошибка ? |
|||
|
||||
GoldFinch |
|
||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
в том что надо не тупо копипастить, а умно копипастить, разбираясь в том что копипастишь для работы с бинарными файлами (в том числе .ехе) есть специальные программы - hex-редакторы самой популярной считается WinHEX в частности в WinHEX есть фича - копирование данных в виде исходника С выделяешь весь файл, edit>copy block->C source получаешь в буфере обмена текст вида
вставляешь его в исходник дроппера, и получаешь чтото такое
Это сообщение отредактировал(а) GoldFinch - 6.4.2009, 23:19 |
||||
|
|||||
Bugmaker |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 27.6.2008 Репутация: нет Всего: нет |
GoldFinch спасибо большое.. это я и имел ввиду, когда спрашивал будет ли верным просто скопировать содержимое через блокнот.
|
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Если вы хотите создать exe без копирования, то чем уж так принципиально отличаются ресурсы от копирования? Что кроме exe в файле ресурсов еще пара иконок будет? Переименуйте calc.exe в файл ttt.dat и программно копируйте его в calc.exe - по сути тот же эффект, что и с ресурсами.
Вариант WinHEX - для разумных по размеру файлов весьма неплох. По крайней мере exe-файл вашей программы будет один. |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
Bugmaker, даи вообще, дался те этот С++, всеравно ты его не знаешь ^^
пиши лучше на fasm, он более приспособлен для таких целей, и код там короче, и никаких WinHEX и ресурсов не надо
|
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Все не так.
|
||||
|
|||||
JAnty |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 6.12.2004 Где: Москва Репутация: 1 Всего: 2 |
Упс, я надеюсь вы не поверели буквально не printf а fprintf();
Вот пример, я програмно прочитал calc.exe и записал его в calc_2.exe
![]() -------------------- |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
unsigned char c;
fscanf(f,"%c",&c); ололо быдлокод детектед |
|||
|
||||
JAnty |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 6.12.2004 Где: Москва Репутация: 1 Всего: 2 |
можно и без unsigned
это для корректности. -------------------- |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
Это сообщение отредактировал(а) Lazin - 7.4.2009, 12:43 |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
а какое число вы будете писать, вместо 176128 если размер файла 5 гиг будет? int как-бы не бесконечный Добавлено через 2 минуты и 50 секунд unsigned как-раз и нужен. вы с байтами работаете. а байт - это число от 0 до 255. если signed char будет - некорректно файл скопируете. Это сообщение отредактировал(а) zim22 - 7.4.2009, 12:58 |
|||
|
||||
JAnty |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 6.12.2004 Где: Москва Репутация: 1 Всего: 2 |
Согласен, нон какл копируется и без унсигнед. А если 5 гиг то пока не достигнем конца файла feof(f); -------------------- |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
действительно копируется. странно... |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
||||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
я имел ввиду не обязательно exe. можно и видео-файлы копировать. я думал, что в битовом представлении с1 и c2 различны. ошибался.
Это сообщение отредактировал(а) zim22 - 7.4.2009, 13:45 |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
zim22, даже если бы их "битовое представление" различалось, как у float и int, это POD-типы одного размера, и согласно стандарту их можно копировать один в другой без потери информации
|
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
||||
|
||||
JAnty |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 6.12.2004 Где: Москва Репутация: 1 Всего: 2 |
Если не unsigned то знак минус тупо меняется на знак "1" в бинарном представлении если присваиваем отрицательное значение только положительному типу типа int.
P.S. Ну я и написал... -------------------- |
|||
|
||||
zim22 |
|
||||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
ничего не меняется. два разных значения будут иметь один и тот же битовый эквивалент. смотри сам:
|
||||
|
|||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
||||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
Anikmar,
во первых SizeOfImage <= 0x77000000 (размер образа в памяти) во вторых значения файловых смещения секций должны влазить в dword разве что в конце файла будет мусор не принадлежащий ни одной из секций, тогда файл может и загрузится |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Во-первых размер образа памяти никоим образом не колышит файловую систему. Во-вторых почитайте описание NTFS на досуге, прежде чем кидать голословные утверждения. В-третьих про какие секции файла вы говорите? Вы сказали про win32. Windows XP принадлежит к этой категории? |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
||||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
||||
|
||||
GoldFinch |
|
||||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
вобщем теория это хорошо, а эксперимент - лучше
я расширил размер .exe до 2Гб, файл запустился, расширил размер файла до 4Гб - файл не запустился способ расширения размера файла:
Добавлено через 6 минут и 17 секунд не, я наврал. при попытке сделать файл ~2.7Гб
винда отказывается его запускать
|
||||||
|
|||||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
а как она его разместит в адресном пространстве, выделяемом процессу в 32х разрядной версии windows?
|
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
Lazin, загрузчик мог бы не загружать весь файл целиком, а загрузить только его заголовок и секции, но видимо этого не происходит
|
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
То что единый образ не может быть больше 4 Гигов - это понятно, но GoldFinch прав - можно ведь пришить в хвост exe свои дополнительные данные и файл может хоть 15 гиг.
Однако тут опыт показывает, что что-то не так. WinRar успешно создает SFX архивы любого размера - у меня есть exe файл размером 6 Гиг, который WinRar успешно создал и ничего не сказал. Вот только винда говорит, что этот файл не Win32 - видимо последний WinRar создает его уже заточенным под Win64 - не знаю. Но я лично читал, что так возможно. Найду более старый WinRar попробую. |
|||
|
||||
JAnty |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 6.12.2004 Где: Москва Репутация: 1 Всего: 2 |
zim22 :
-------------------- |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
и что? в битовом представлении они одинаковы Это сообщение отредактировал(а) zim22 - 8.4.2009, 15:41 |
|||
|
||||
JAnty |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 6.12.2004 Где: Москва Репутация: 1 Всего: 2 |
Да, точно! Значит -159=97
![]() -------------------- |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
||||
|
||||
JAnty |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 6.12.2004 Где: Москва Репутация: 1 Всего: 2 |
-------------------- |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |