Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++ WinAPI]Скопировать содержимое exe файла, прочитать нетекстовый файл 
:(
    Опции темы
Bugmaker
Дата 5.4.2009, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



Как программно прочитать содержимое exe файла? Допустим виндового calc.exe.
Пробовал fopen\fgets.. не получается.

Может я вообще не тем путем иду? хочу программно создать exe файл без копирования.
То есть допустим запускаю программу на другом компе а она там создает exe файл с нужным содержимым.
Можно ли это реализовать, и будет ли вообще такой файл потом корректно запускаться?
PM MAIL   Вверх
GremlinProg
Дата 5.4.2009, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 3
Всего: 106



Перемещено в "С/C++ общие вопросы"


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
andrew_121
Дата 5.4.2009, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
GoldFinch
Дата 5.4.2009, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



в ресурсы его засунь
PM MAIL ICQ   Вверх
xvr
Дата 5.4.2009, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Bugmaker @ 5.4.2009,  18:14)
Как программно прочитать содержимое exe файла? Допустим виндового calc.exe.
Пробовал fopen\fgets.. не получается.

fopen можно (только не забыть поставить ему бинарную моду чтения 'rb'). fgets - нельзя. Он читает строки, разделенные символом конца строки ('\n'), в бинарнике они могут быть где угодно. Пользуй fread
Цитата

То есть допустим запускаю программу на другом компе а она там создает exe файл с нужным содержимым.
Запросто - вирусы же создают  smile 
Цитата

Можно ли это реализовать, и будет ли вообще такой файл потом корректно запускаться?
И запускают, и создают, и запускают, и созда...  smile 
Повбивав бы  smile 
PM MAIL   Вверх
GoldFinch
Дата 5.4.2009, 20:11 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



xvr, такое поведение еще свойственно инсталляторам
PM MAIL ICQ   Вверх
Bugmaker
Дата 6.4.2009, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



Не могу нагуглить ниодного простого примера... толи спать уже пора.

Код

#include "windows.h"
#include <iostream>

 
using namespace std;
int main()
{
    FILE *file;
    char *buffer;
    
file = fopen( "calc.exe", "rb" );
if( file != 0 )
{
fread( buffer, 1,20, file); 
cout << buffer << endl;
}
else
{
cout << "File not found !!!" << endl;
}
fclose(file);
system ("PAUSE");
}



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

fread( buffer, 1,20, file);  если пытаюсь менять цифры 1 и 20 на другие то программа иногда вообще закрывается сразу после запуска сама.

Вобщем ссылочку бы на подробное описание или пример было бы неплохо.

Спасибо всем, кто откликнулся.
PM MAIL   Вверх
zim22
Дата 6.4.2009, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(Bugmaker @  6.4.2009,  00:05 Найти цитируемый пост)
Вобщем ссылочку бы на подробное описание или пример было бы неплохо.

http://www.cplusplus.com/reference/clibrar...tdio/fread.html
http://msdn.microsoft.com/ru-ru/library/kt0etdcs.aspx


--------------------
PM MAIL   Вверх
GoldFinch
Дата 6.4.2009, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



программа ведь под винду пишется? зачем тогда юзать fopen и т.п.
вроде бы надо "программно создать exe файл" зачем тогда его считывать? надо же написать программу которая пишет файл
а та которая считывает  - это совсем другой код

можно конечно написать программу которая при запуске с параметром "имя файла" записывает в себя этот файл, а при запуске без параметра записывает этот файл на диск, но разве это надо?
PM MAIL ICQ   Вверх
xvr
Дата 6.4.2009, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Bugmaker @ 6.4.2009,  00:05)
Не могу нагуглить ниодного простого примера... толи спать уже пора.

Код

#include "windows.h"
#include <iostream>

 
using namespace std;
int main()
{
    FILE *file;
    char *buffer;
    
file = fopen( "calc.exe", "rb" );
if( file != 0 )
{
fread( buffer, 1,20, file); 
cout << buffer << endl;
}
else
{
cout << "File not found !!!" << endl;
}
fclose(file);
system ("PAUSE");
}



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

fread( buffer, 1,20, file);  если пытаюсь менять цифры 1 и 20 на другие то программа иногда вообще закрывается сразу после запуска сама.

Вобщем ссылочку бы на подробное описание или пример было бы неплохо.

Спасибо всем, кто откликнулся.

buffer должен быть описан как char buffer[20]; Выводить его в cout через << не получится - это бинарные данные, что там выведется неизвестно

PM MAIL   Вверх
Bugmaker
Дата 6.4.2009, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



GoldFinch  ты прав, нужно создать exe.  Но если я просто открою calc.exe в блокноте, все скопирую и через fputs помещу в exe файл, он же не будет работать не так ли?

xvr как корректно вывести бинарные данные? 


PM MAIL   Вверх
GoldFinch
Дата 6.4.2009, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Bugmaker, для копирования файла в большинстве случаев подойдет 
copy dropper.exe+calc.exe dropper.exe

затем dropper.exe должен будет записать calc.exe из конца себя на диск
PM MAIL ICQ   Вверх
JAnty
Дата 6.4.2009, 18:50 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 6.12.2004
Где: Москва

Репутация: 1
Всего: 2



Есть такой язык не С++, а С.
 fprintf и fscanf читая и записывая символы как числа или наоборот. 

Не забывайте, что С могучей чем С++!!!


--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
GoldFinch
Дата 6.4.2009, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



JAnty, там понял что написал?
PM MAIL ICQ   Вверх
JAnty
Дата 6.4.2009, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 6.12.2004
Где: Москва

Репутация: 1
Всего: 2



GoldFinch да, я это уже делал. Я делал ехе файлы через принтф.


--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
zim22
Дата 6.4.2009, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(JAnty @  6.4.2009,  18:58 Найти цитируемый пост)
GoldFinch да, я это уже делал. Я делал ехе файлы через принтф.

приведите пример. дабы не быть голословным.


--------------------
PM MAIL   Вверх
xvr
Дата 6.4.2009, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Bugmaker @ 6.4.2009,  18:10)
xvr как корректно вывести бинарные данные?

Вывести куда? Если в stdout - то никак. Это текстовый поток и он не рассчитан на вывод бинарных данных. (Точнее, если перенаправить вывод из программы в файл, то в такой stdout вывести можно, но это уже за рамками)
Для копирования из файла в файл можно использовать fread/fwrite. Для создания файла из ресурсов - FindResource/LoadResource/LockResource + fwrite
Для помещения файла в ресурс нужно добавить в проект *.rc файл такого содержания
Код

CFG_dgrs_cfg     RCDATA  DISCARDABLE     "dgrs.cfg"
CFG_trs_cfg      RCDATA  DISCARDABLE     "trs.cfg"
Первый столбец - идентификатор ресурса (по нем FindResource будет искать),  последний - имя исходного файла

Добавлено через 1 минуту и 38 секунд
Цитата(zim22 @ 6.4.2009,  20:03)
Цитата(JAnty @  6.4.2009,  18:58 Найти цитируемый пост)
GoldFinch да, я это уже делал. Я делал ехе файлы через принтф.

приведите пример. дабы не быть голословным.

Это сделать можно (через printf("%c",byte);) Но с тем же успехом можно и гланды через жо... удалять  smile 
PM MAIL   Вверх
zim22
Дата 6.4.2009, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(xvr @  6.4.2009,  20:24 Найти цитируемый пост)
Это сделать можно (через printf("%c",byte);) Но с тем же успехом можно и гланды через жо... удалять

интересно дождаться варианта JAnty. Вдруг у него всё будет без крови, цивильнинько. smile


--------------------
PM MAIL   Вверх
GoldFinch
Дата 6.4.2009, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Цитата(xvr @  6.4.2009,  21:24 Найти цитируемый пост)
LockResource + fwrite

для записи на диск в винде нада использовать WriteFile , а не fwrite

и ресурсы юзать необязательно, можно прямо в конец файла писать

Это сообщение отредактировал(а) GoldFinch - 6.4.2009, 21:49
PM MAIL ICQ   Вверх
Bugmaker
Дата 6.4.2009, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
GoldFinch
Дата 6.4.2009, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Цитата(Bugmaker @  6.4.2009,  22:56 Найти цитируемый пост)
GoldFinch а что писать в конец файла то?? где взять содержимое экзешника??

в консоли (cmd)
copy dropper.exe+calc.exe dropper.exe

правда тут возникает проблема определения конца дроппера, к тому же размер дроппера должен быть выровнен по 512-байтовой границе

Это сообщение отредактировал(а) GoldFinch - 6.4.2009, 22:03
PM MAIL ICQ   Вверх
Bugmaker
Дата 6.4.2009, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



GoldFinch 
Если я с таким примитивом не могу разобраться то куда уж мне до определения конца и выравнивания то?? -)

Поясните подробнее с ресурсами.. В чем моя ошибка ? 
PM MAIL   Вверх
GoldFinch
Дата 6.4.2009, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Цитата(Bugmaker @  6.4.2009,  23:15 Найти цитируемый пост)
Поясните подробнее с ресурсами.. В чем моя ошибка ?  

в том что надо не тупо копипастить, а умно копипастить, разбираясь в том что копипастишь

для работы с бинарными файлами (в том числе .ехе) есть специальные программы - hex-редакторы
самой популярной считается WinHEX
в частности в WinHEX есть фича - копирование данных в виде исходника С
выделяешь весь файл, edit>copy block->C source
получаешь в буфере обмена текст вида
Код

unsigned char data[2683392] = {
    0x4D, 0x5A, ...
};

вставляешь его в исходник дроппера, и получаешь чтото такое
Код

#pragma comment(linker,"/entry:main")
#include <Windows.h>
char filename[]="hi.exe";
const int filesize = 133;
unsigned char data[133] = { // *__hellow.exe by Mikl_
    0x4D, 0x5A, 0x00, 0x00, 0x50, 0x45, 0x00, 0x00, 0x4C, 0x01, 0x01, 0x00, 0x4D, 0x65, 0x73, 0x73, 
    0x61, 0x67, 0x65, 0x42, 0x6F, 0x78, 0x41, 0x00, 0x40, 0x00, 0x0F, 0x01, 0x0B, 0x01, 0x75, 0x73, 
    0x65, 0x72, 0x33, 0x32, 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x6A, 0x00, 0xB8, 0x29, 0x00, 0x00, 0x00, 
    0xB8, 0x49, 0x00, 0x40, 0x00, 0x50, 0xEB, 0x0C, 0x00, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 
    0x04, 0x00, 0x00, 0x00, 0x50, 0x6A, 0x00, 0xEB, 0x05, 0x48, 0x69, 0x00, 0x04, 0x00, 0xFF, 0x15, 
    0x74, 0x00, 0x40, 0x00, 0xC3, 0x03, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 
    0x02, 0x00, 0xAA, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x1E, 0x00, 0x00, 0x00, 0x74
};
int main() {
    HANDLE hFile=CreateFileA(filename,GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0);
    DWORD written;
    WriteFile(hFile,data,filesize,&written,0);
    CloseHandle(hFile);
    WinExec(filename,0);
}


Это сообщение отредактировал(а) GoldFinch - 6.4.2009, 23:19
PM MAIL ICQ   Вверх
Bugmaker
Дата 6.4.2009, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



GoldFinch спасибо большое.. это я и имел ввиду, когда спрашивал будет ли верным просто скопировать содержимое через блокнот.
PM MAIL   Вверх
Anikmar
Дата 6.4.2009, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Если вы хотите создать exe без копирования, то чем уж так принципиально отличаются ресурсы от копирования? Что кроме exe в файле ресурсов еще пара иконок будет? Переименуйте calc.exe в файл ttt.dat и программно копируйте его в calc.exe - по сути тот же эффект, что и с ресурсами.

Вариант WinHEX - для разумных по размеру файлов весьма неплох. По крайней мере exe-файл вашей программы будет один.


PM MAIL ICQ   Вверх
GoldFinch
Дата 7.4.2009, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Bugmaker, даи вообще, дался те этот С++, всеравно ты его не знаешь ^^
пиши лучше на fasm, он более приспособлен для таких целей, и код там короче, и никаких WinHEX и ресурсов не надо
Код
include 'win32ax.inc'
include 'hll_simple.inc'

FILENAME equ "hi.exe"

proc main
    local hFile:DWORD, written:DWORD
    CreateFileA(FILENAME,GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0) mov [hFile],eax
    WriteFile([hFile],filedata,filesize,written,0)
    CloseHandle([hFile])
    WinExec(FILENAME,0)
    ret
endp

filedata: file FILENAME   ; тут запишется наш файл
filesize=$-filedata

.end main

PM MAIL ICQ   Вверх
xvr
Дата 7.4.2009, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(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);  ??
Или чтото не так делаю?? 

Все не так.
  •  Не надо делать #include <source.rc> в С программе
  •  Файл source.rc надо добавить в ПРОЕКТ. Его будет обрабатывать линкер, а не С компилятор. *.rc файл - это исходник от *.res файлов.
  •  Для доступа к ресурсам нужно использовать специальные функции (я уже их упоминал)
Код

HRSRC rc_h = FindResource(NULL,"CFG_dgrs_cfg",RT_RCDATA);
if (!rc_h) fatal_error();
HGLOBAL rc_g = LoadResource(NULL,rc_h);
if (!rc_g) fatal_error();
void* p= LockResource(rc_g);
if (!p) fatal_error();

FILE* f = fopen("calc.exe","wb");
if (!f) fatal_error();
fwrite(p,1,SizeofResource(NULL,rc_h),f);
fclose(f);

Если ресурс лежит в dll, то вместо NULL в исходнике надо подать instance handle этой dll

PM MAIL   Вверх
JAnty
Дата 7.4.2009, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 6.12.2004
Где: Москва

Репутация: 1
Всего: 2



Упс, я надеюсь вы не поверели буквально не printf а fprintf();

Вот пример, я програмно прочитал calc.exe и записал его в calc_2.exe

Код

 f2=fopen("calc_2.exe","wb");
 f=fopen("calc.exe","rb");

 unsigned char c;
 int i;

 for(int n=1; n<=176128; n++) //  176128 кол-во символов в файле, или через while(feof)
  {
   fscanf(f,"%c",&c);
   i=c;
     Form1->Caption=i; // номер символа.
   fprintf(f2,"%c",i);
 }//next n;

 fclose(f);
 fclose(f2);


 smile я правильно уловил суть вопроса?


--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
GoldFinch
Дата 7.4.2009, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



unsigned char c;
fscanf(f,"%c",&c);

ололо быдлокод детектед
PM MAIL ICQ   Вверх
JAnty
Дата 7.4.2009, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 6.12.2004
Где: Москва

Репутация: 1
Всего: 2



можно и без unsigned 
это для корректности.


--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
Lazin
Дата 7.4.2009, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Код

system("copy calc.exe calc_2.exe");


Это сообщение отредактировал(а) Lazin - 7.4.2009, 12:43
PM MAIL Skype GTalk   Вверх
zim22
Дата 7.4.2009, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(JAnty @  7.4.2009,  12:14 Найти цитируемый пост)
 for(int n=1; n<=176128; n++) //  176128 кол-во символов в файле, или через while(feof)

а какое число вы будете писать, вместо 176128 если размер файла 5 гиг будет? int как-бы не бесконечный

Добавлено через 2 минуты и 50 секунд
Цитата(JAnty @  7.4.2009,  12:32 Найти цитируемый пост)
можно и без unsigned это для корректности.

unsigned как-раз и нужен. вы с байтами работаете. а байт - это число от 0 до 255. если signed char будет - некорректно файл скопируете.

Это сообщение отредактировал(а) zim22 - 7.4.2009, 12:58


--------------------
PM MAIL   Вверх
JAnty
Дата 7.4.2009, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 6.12.2004
Где: Москва

Репутация: 1
Всего: 2



Цитата(zim22 @  7.4.2009,  12:57 Найти цитируемый пост)
некорректно файл скопируете.

Согласен, нон какл копируется и без унсигнед.

А если 5 гиг то пока не достигнем конца файла  feof(f);


--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
zim22
Дата 7.4.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(JAnty @  7.4.2009,  13:05 Найти цитируемый пост)
Согласен, нон какл копируется и без унсигнед.

действительно копируется. странно...


--------------------
PM MAIL   Вверх
GoldFinch
Дата 7.4.2009, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



zim22, а как это интересно signed может на чтото повлиять?

Добавлено через 4 минуты и 8 секунд
Цитата(zim22 @  7.4.2009,  13:57 Найти цитируемый пост)
а какое число вы будете писать, вместо 176128 если размер файла 5 гиг будет?

в вин32 .ехе таких размеров не бывает и быть не может
PM MAIL ICQ   Вверх
zim22
Дата 7.4.2009, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(GoldFinch @  7.4.2009,  13:28 Найти цитируемый пост)
в вин32 .ехе таких размеров не бывает и быть не может

я имел ввиду не обязательно exe. можно и видео-файлы копировать.


Цитата(GoldFinch @  7.4.2009,  13:28 Найти цитируемый пост)
а как это интересно signed может на чтото повлиять?

я думал, что в битовом представлении с1 и c2 различны. ошибался.
Код
int main()
{
  signed char c1 = 200;
  unsigned char c2 = 200;

  std::bitset<8> b1(c1);
  std::bitset<8> b2(c2); // b1 == b2
    
  return 0;
}




Это сообщение отредактировал(а) zim22 - 7.4.2009, 13:45


--------------------
PM MAIL   Вверх
GoldFinch
Дата 7.4.2009, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



zim22, даже если бы их "битовое представление" различалось, как у float и int, это POD-типы одного размера, и согласно стандарту их можно копировать один в другой без потери информации
PM MAIL ICQ   Вверх
zim22
Дата 7.4.2009, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(GoldFinch @  7.4.2009,  14:51 Найти цитируемый пост)
согласно стандарту их можно копировать один в другой без потери информации

не знал. век живи - век учись у GoldFinch'а smile

Это сообщение отредактировал(а) zim22 - 7.4.2009, 15:10


--------------------
PM MAIL   Вверх
JAnty
Дата 7.4.2009, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 6.12.2004
Где: Москва

Репутация: 1
Всего: 2



Если не unsigned то знак минус тупо меняется на знак "1" в бинарном представлении если присваиваем  отрицательное значение только положительному типу типа int.

P.S.  Ну я и написал...



--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
zim22
Дата 7.4.2009, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(JAnty @  7.4.2009,  18:37 Найти цитируемый пост)
Если не unsigned то знак минус тупо меняется на знак "1" в бинарном представлении

ничего не меняется. два разных значения будут иметь один и тот же битовый эквивалент. смотри сам:
Код
#include <iostream>
#include <bitset>

int main()
{
  signed char c1 = -150;
  unsigned char c2 = 106;

  std::bitset<8> b1(c1);
  std::bitset<8> b2(c2); // b1 == b2

  std::cout << b1 << std::endl;
  std::cout << b2 << std::endl;
    
  return 0;
}




--------------------
PM MAIL   Вверх
Anikmar
Дата 7.4.2009, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(GoldFinch @  7.4.2009,  13:28 Найти цитируемый пост)
в вин32 .ехе таких размеров не бывает и быть не может 

Почему вы так уверены?
PM MAIL ICQ   Вверх
GoldFinch
Дата 8.4.2009, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Anikmar
во первых SizeOfImage <= 0x77000000 (размер образа в памяти)
во вторых значения файловых смещения секций должны влазить в dword

разве что в конце файла будет мусор не принадлежащий ни одной из секций, тогда файл может и загрузится
PM MAIL ICQ   Вверх
Anikmar
Дата 8.4.2009, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(GoldFinch @  8.4.2009,  00:38 Найти цитируемый пост)
во первых SizeOfImage <= 0x77000000 (размер образа в памяти)
во вторых значения файловых смещения секций должны влазить в dword

разве что в конце файла будет мусор не принадлежащий ни одной из секций, тогда файл может и загрузится


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

Вы сказали про win32. Windows XP принадлежит к этой категории?

PM MAIL ICQ   Вверх
GoldFinch
Дата 8.4.2009, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Цитата(Anikmar @  8.4.2009,  02:03 Найти цитируемый пост)
про какие секции файла вы говорите

с этого и надо было начинать. какбэ .exe-PE файл состоит из заголовка и секций, вот о них я и говорю

да, XP принадлежит к этой категории

Это сообщение отредактировал(а) GoldFinch - 8.4.2009, 08:12
PM MAIL ICQ   Вверх
Anikmar
Дата 8.4.2009, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(GoldFinch @  8.4.2009,  08:11 Найти цитируемый пост)
с этого и надо было начинать. какбэ .exe-PE файл состоит из заголовка и секций, вот о них я и говорю

Т.е. я не смогу создать SFX-архив больше 4-х гигов или он не является exe-файлом?

Это сообщение отредактировал(а) Anikmar - 8.4.2009, 08:20
PM MAIL ICQ   Вверх
GoldFinch
Дата 8.4.2009, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



вобщем теория это хорошо, а эксперимент - лучше
я расширил размер .exe до 2Гб, файл запустился, 
расширил размер файла до 4Гб - файл не запустился

способ расширения размера файла:
Код

include 'win32ax.inc'
include 'hll_simple.inc'

high dd 1

proc main
     local hFile:DWORD
     CreateFileA("hi.exe",GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0) mov [hFile],eax
     SetFilePointer([hFile],1,high,0)
     SetEndOfFile([hFile])
     ret
endp

.end main


Добавлено через 6 минут и 17 секунд
не, я наврал. при попытке сделать файл ~2.7Гб 
Код

SetFilePointer([hFile],3000000000,0,0)

винда отказывается его запускать
Код

Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.

E:\>hi
Программа не умещается в памяти

E:\>

PM MAIL ICQ   Вверх
Lazin
Дата 8.4.2009, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



а как она его разместит в адресном пространстве, выделяемом процессу в 32х разрядной версии windows?
PM MAIL Skype GTalk   Вверх
GoldFinch
Дата 8.4.2009, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Lazin, загрузчик мог бы не загружать весь файл целиком, а загрузить только его заголовок и секции, но видимо этого не происходит
PM MAIL ICQ   Вверх
Anikmar
Дата 8.4.2009, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



То что единый образ не может быть больше 4 Гигов - это понятно, но GoldFinch прав - можно ведь пришить в хвост exe свои дополнительные данные и файл может хоть 15 гиг.

Однако тут опыт показывает, что что-то не так. WinRar успешно создает SFX архивы любого размера - у меня есть exe файл размером 6 Гиг, который WinRar успешно создал и ничего не сказал. Вот только винда говорит, что этот файл не Win32 - видимо последний WinRar создает его уже заточенным под Win64 - не знаю. Но я лично читал, что так возможно. Найду более старый WinRar попробую.
PM MAIL ICQ   Вверх
JAnty
Дата 8.4.2009, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 6.12.2004
Где: Москва

Репутация: 1
Всего: 2



zim22 :

Код

 signed char a=-159;

 unsigned char c;

 c=a; // с=97



--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
zim22
Дата 8.4.2009, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(JAnty @  8.4.2009,  14:29 Найти цитируемый пост)
signed char a=-159; unsigned char c; c=a; // с=97

и что? в битовом представлении они одинаковы

Это сообщение отредактировал(а) zim22 - 8.4.2009, 15:41


--------------------
PM MAIL   Вверх
JAnty
Дата 8.4.2009, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 6.12.2004
Где: Москва

Репутация: 1
Всего: 2



Да, точно!  Значит -159=97  smile 


--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
zim22
Дата 8.4.2009, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(JAnty @  8.4.2009,  16:15 Найти цитируемый пост)
 Значит -159=97

только учителю математики этого не говорите smile


--------------------
PM MAIL   Вверх
JAnty
Дата 8.4.2009, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 6.12.2004
Где: Москва

Репутация: 1
Всего: 2



Цитата(zim22 @  8.4.2009,  16:24 Найти цитируемый пост)
только учителю математики этого не говорите


и а=а+1


--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2043 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.