Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание кода программы, Чтение и запись файла в код программы 
V
    Опции темы
586
Дата 25.8.2006, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Bima @  25.8.2006,  15:56 Найти цитируемый пост)
Но если взять исполняемый файл, там есть не печатанные символы, их Мемо не поймет. В результате, файл создастся не такой, как оригинальный

Ты хочешь просмотреть exe-шник в Memo. Или ещё отредактировать сохранить в файл??? Ничего не понял.
PM   Вверх
Bima
Дата 25.8.2006, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Ты хочешь просмотреть exe-шник в Memo. Или ещё отредактировать сохранить в файл??? Ничего не понял. 

Я не хочу его просматривать!!! и тем более не хочу его редактировать
Мне нужно создать код, что бы он создавал точно такие же файлы, который я читаю первой программой. Что у них находится внутри, мне не интересно. Файлы могут быть ЛЮБЫЕ (txt, exe, bin, cab, rar и т.д.).

Мемо нужен для того, что бы вывести туда информацию, точнее сгенерированный код для будущей программы. я просто не знаю, более удобного варианта... (ну можно на крайний случай вывести в RichText).
Проблема не в считывании и записывании файла, а в преобразовании в текстовый вид, а потом назад в бинарный. Вариант преобразования в шеснадцатитиричную форму меня бы устроил, только как все это сделать (желательно быстро). Скорость, нужна, что бы вторая программа не 20 минут думала, что бы переворить внутреннюю информацию и создать файл в 10 кб.


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
586
Дата 25.8.2006, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Bima @  25.8.2006,  16:18 Найти цитируемый пост)
а потом назад в бинарный

Если ты его редактировать не собираешься, какой смысл тогда переводить его обратно.

Это сообщение отредактировал(а) 586 - 25.8.2006, 15:22
PM   Вверх
Bima
Дата 25.8.2006, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ок.
как мне создать код программы, который делал бы мне файл ну скажем cmd.exe (из стандартной поставки винды) ???


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
586
Дата 25.8.2006, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Bima @  25.8.2006,  16:25 Найти цитируемый пост)
как мне создать код программы, который делал бы мне файл ну скажем cmd.exe (из стандартной поставки винды) ??? 

Из чего он должен его делать? Где исходные данные?
PM   Вверх
Bima
Дата 25.8.2006, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



исходные данные: файл cmd.exe. На этом же компьютере установлен ВСВ.
Задача: нужно создать программу, что бы на другом компьютере, она создала ТОЧНО ТАКОЙ-ЖЕ ФАЙЛ cmd.exe (примем, что его там нет).


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
dumb
Дата 26.8.2006, 02:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



мдя... вот почему порой целесообразно писать о том, чего хочется добиться в результате.

где-то тут на форуме есть около миллиона топиков о сохранении файлов в ресурсы. ключевые слова для поиска: FindResource, LoadResource
PM MAIL   Вверх
Bima
Дата 26.8.2006, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В принципе тему можно считать закрытой, хотя вопрос не решили, как я хотел.
Тема создавалась для того, чо бы скрыть файл в другом файле, а если быть точнее, то несколько файлов.  При создании ресурсов, любой мало-мальский редактор ресурсов может спокойно вытянуть все эти файлы из exe-ка. Своего рода это инсталятор, который делает еще кучу функций, по защите программы. А при создании ресурсов, эту программу можно очень легко вскрыть  smile 


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
dumb
Дата 26.8.2006, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



ресурсы - не единственное решение, но в данном случае, пожалуй, самое оптимальное.
шифруй ресурсы.
PM MAIL   Вверх
Bima
Дата 26.8.2006, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а что, есть возможность на лету их зашифровать и расшифровать?


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
586
Дата 26.8.2006, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Кажется, я тебя понял. Вот код:
Код
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void proc1(char *ch)
{
    HANDLE f, hMap;
    void *pMap;
        char *err, *buff;
        LARGE_INTEGER li;
        DWORD ddd;
    f=CreateFile(ch, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
    if(f!=(HANDLE)-1)
    {
        hMap=CreateFileMapping(f, 0, PAGE_READONLY, 0, 0, 0);
        if(hMap)
        {
                        pMap=MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
            if(pMap)
            {
                              GetFileSizeEx(f, &li);
                              ddd=li.LowPart;
                              buff=new char[ddd*4+20+ddd/128];
                              buff[0]=0;
                              lstrcat(buff, "unsigned char data[]={");
                              __asm {
                                mov esi, dword ptr pMap
                                mov edi, buff
                                add edi, 22
                                mov ecx, ddd
                              loc_1:
                                lodsb
                                mov bl, 100
                                xor ah, ah
                                div bl
                                or al, al
                                setz dl
                                jz loc_2
                                add al, 48
                                stosb
                              loc_2:
                                mov al, ah
                                xor ah, ah
                                mov bl, 10
                                div bl
                                or al, al
                                jnz loc_6
                                or dl, dl
                                jnz loc_3
                              loc_6:
                                add al, 48
                                stosb
                              loc_3:
                                mov al, ah
                                add al, 48
                                stosb
                                mov al, ','
                                stosb
                                test cx, 11111111b
                                jne loc_4
                                mov ax, 0x0A0D
                                stosw
                              loc_4:
                              loop loc_1
                                dec edi
                                mov ax, ';}'
                                stosw
                                xor al, al
                                stosb
                              }
                              UnmapViewOfFile(pMap);
                              Form1->Memo1->Text=buff;
                              delete buff;
            } else MessageBoxA(Form1->Handle, "Can't map view of file.", 0, 16);
            CloseHandle(hMap);
        } else MessageBoxA(Form1->Handle, "Can't create file mapping.", 0, 16);
        CloseHandle(f);
    } else {
        FormatMessage(0x1100, 0, GetLastError(), 0, (char*)&err, 0, 0);
                MessageBoxA(Form1->Handle, err, "Can't open target file", 16);
    }
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 proc1("C:\\timer.exe");
}

На форме Memo1, Button1.
Скорость хорошая - ~ 1.2 мб/сек
Конвертирует файл в код типа:
Код

char data[]={...};


Это сообщение отредактировал(а) 586 - 26.8.2006, 22:41
PM   Вверх
stmamont
Дата 26.8.2006, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Сообщение мое стерлось.
Теперь расписывать не буду.
Предыдущий пост - круто , но не понятно, можно комментарии что там проиходит?

Можно еще попробвать MIME - кодирование.
Можно попробовать покопать как делают исталляторы (хотя б идею)
Можно воспользоваться каким нибудь инсталлятором (NSIS например).
Возможно он поможет полностью тебе. (он скриптовый, и может быть ничего не придется кодить)))

А вообще асм рулит) (но не понятно(()


--------------------
user posted image
PM MAIL ICQ   Вверх
586
Дата 26.8.2006, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(stmamont @  26.8.2006,  22:06 Найти цитируемый пост)
можно комментарии что там проиходит

Да ничего сложного. Достаточно открыть справочник по асм.
Код
void proc1(char *ch)
{
    HANDLE f, hMap;
    void *pMap;
        char *err, *buff;
        LARGE_INTEGER li;
        DWORD ddd;
    f=CreateFile(ch, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
    if(f!=(HANDLE)-1)
    {
        hMap=CreateFileMapping(f, 0, PAGE_READONLY, 0, 0, 0);
        if(hMap)
        {
            pMap=MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
            if(pMap)
            {
                GetFileSizeEx(f, &li);                // определение размера файла
                ddd=li.LowPart;                    // младшая часть размера (4 байта) сохраняется отдельно (для __asm вставки)
                buff=new char[ddd*4+20+ddd/128];        // выделение памяти (здесь будет строка, только работать с ней будем напрямую)
                buff[0]=0;                    // очистка строки
                lstrcat(buff, "unsigned char data[]={");    // ...
                __asm {
                        mov esi, dword ptr pMap   
                        mov edi, buff
                        add edi, 22        // позиция, где будет записываться строка
                        mov ecx, ddd        // для цикла loop
                loc_1:
                        lodsb            // читает байт по адресу esi, заносит его в регистр al и увеличивает esi на единицу
        // здесь происходит преобразование числа в строку
                        mov bl, 100        // на что будем делить
                        xor ah, ah        // обнуляет регистр ah (старшую часть регистра ax)
                        div bl            // делит регистр ax на bl  (ax/100)
                        or al, al        // проверка, равен ли al нулю (if(al) ...)
                        setz dl            // заносит результат в регистр dl
                        jz loc_2        // if(!al) goto loc_2; (если это 0, то он не записывается, поскольку, например, 10 и 010 - это разные числа (разная система счисления)
                        add al, 48        // al+='0';
                        stosb            // записывает регистр al по адресу edi, и увеличивает его на единицу
                loc_2:
                        mov al, ah        // ah - остаток от деления, помещается в al
                        xor ah, ah        // ah обнуляется
                        mov bl, 10        // на что вудет делиться
                        div bl            // ax/bl
                        or al, al
                        jnz loc_6        // if(al) goto loc_6; (ноль добавляется)
                        or dl, dl        // проверка предыдущего условия
                        jnz loc_3        // if(dx) goto loc_3; (если число >=100, то ноль не убирается)
                loc_6:
                        add al, 48        // al+='0';
                        stosb            // ...
                loc_3:
                        mov al, ah        // помещение остатка в регистр al для stosb
                        add al, 48        // al+='0';
                        stosb
                        mov al, ','
                        stosb            // добавление символа ',' в конец строки
                        test cx, 11111111b    // *
                        jne loc_4
                        mov ax, 0x0A0D
                        stosw            // добавление символа "\n", то есть начало новой строки
                loc_4:
                        loop loc_1        // цикл: if(ecx!=0) goto loc_1;
                        dec edi            // edi--;  (убирает лишнюю запятую)
                        mov ax, ';}'
                        stosw            // добавление "};" в конец строки
                        xor al, al
                        stosb            // завершение строки
                }
                UnmapViewOfFile(pMap);
                Form1->Memo1->Text=buff;
                delete buff;            // освобождение памяти
            } else MessageBoxA(Form1->Handle, "Can't map view of file.", 0, 16);
            CloseHandle(hMap);
        } else MessageBoxA(Form1->Handle, "Can't create file mapping.", 0, 16);
        CloseHandle(f);
    } else {
        FormatMessage(0x1100, 0, GetLastError(), 0, (char*)&err, 0, 0);
                MessageBoxA(Form1->Handle, err, "Can't open target file", 16);
    }
}

-------
*  test cx, 11111111b - устраняет проблему со вставкой строки в Билдер (поскольку строка будет длинная (>1024 символов) то выскакивает ошибка), не придумал ничего, лучше этого. Если в регистре ecx 8 первых бит равны 1, то в строку добавляется символ "\n".

Это сообщение отредактировал(а) 586 - 27.8.2006, 01:12
PM   Вверх
Bima
Дата 28.8.2006, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Супер.
586 ОГРОМНОЕ СПАСИБО
Это то, что нужно!!!!

Великолепное решение задачи, и скорость отличная!!!


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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