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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++ WinAPI]Скопировать содержимое exe файла, прочитать нетекстовый файл 
:(
    Опции темы
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   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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