12.07.2015 Views

Август - Xakep Online

Август - Xakep Online

Август - Xakep Online

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

codingПрограмма-загрузчикКонструктор у нас есть. Но вот беда: без программы-загрузчика онмало чем полезен, поэтому нам придется создать новый пустой проекти написать в нем несколько строчек кода. Для программы-загрузчикаформа нам не потребуется, поэтому сразу ее удаляй. Вообще, программа-загрузчикдолжна иметь минимальный размер, а значит, нужноизбавиться от всего лишнего. Удали из Uses все модули, оставь лишьWindows и ShellAPI. Их нам будет вполне достаточно. Опиши структуруFileInfRecord. Она должна выглядеть точно так же, как и в программеконструкторе.Если ты укажешь разные размеры массивов или ещечего-нибудь, то наш загрузчик будет работать неправильно (точнее, небудет работать вовсе).Создай константу mySize. В этой константе у нас будет храниться нашсобственный размер, то есть размер программы-загрузчика. На данномэтапе мы его не знаем, поэтому пока указываем 0. Код программы-загрузчикаприведен в соответствующей врезке. Для экономии места я вырезализ него код, который отвечает за обработку опций. Полный вариант ты, каквсегда, можешь найти на диске.Сначала нам нужно открыть для чтения файл программы-загрузчика,то есть самого себя. После открытия выполняем смещение до адреса, скоторого начинается код нашего блока с информаций. Как его узнать?Очень просто! Поскольку программа-конструктор записала структурус информаций в самый конец программы-загрузчика, нужно простоперейти в файле на размер файла загрузчика. Этот размер у нас будетопределен в объявленной ранее константе. Позиционирование в файлеопять же выполняется с помощью SetFilePointer. При переходе нанужную позицию становится возможным считать структуру. А раз так, топосле выполнения «ReadFile(_fileSource, _fileHeader, sizeOf(_fileHeader),_temp, nil);» вся наша структура будет считана. Ну а это значит, что мыобладаем всей необходимой информацией для выдергивания остальныхфайлов. Код разбивки тела загрузчика на файлы похож на кодпрограммы-конструктора, поэтому не будем на нем останавливаться.Окончательно дописав код и прочитав предыдущие строки, скомпилируйпроект. После завершения компиляции зайди в меню «Project Information» и обрати внимание на строку File Size.В ней указан конечный размер exe нашего проекта. У меня он равен16384. Именно это число нужно присвоить нашей константе mySize. Послеэтого еще раз сохраняй все изменения в проекте и выполняй компиляцию.Все, наш joiner полностью готов, а значит, пора переходить к тесту.ТестированиеПеред тестом скопируй скомпилированный файл загрузчика в папку, в которойу тебя лежит конструктор. Если ты помнишь, то именно в этой папкенаш конструктор будет его искать. Теперь попробуй запустить конструктор,добавить несколько файлов и нажать на кнопку «Склеить». Подумавпару секунд (время напрямую зависит от размера выбранных тобойфайлов), программа радостно отрапортует тебе о завершении процессасклейки и создаст новый файл.В проводнике появился файл с именем test. Это и есть результат работыпрограммы. После его запуска в этой же директории оказываются все прикрепленныенами файлы. Таким образом, программа прошла тест-драйв.Что можно улучшитьВ статье я рассмотрел самый простой вариант joiner’а. Но ты не должен наэтом останавливаться. Вот некоторые идеи, которые также хорошо былобы реализовать в программе такого типа:1. Убрать ограничение количества добавляемых файлов.2. Сделать возможной смену иконки для конечного файла, чтобы не вызыватьлишних подозрений у пользователя.3. Расширить набор опций. Вот здесь есть, где разгуляться. Чтобы представлятьсебе примерно, что можно реализовать, я советую тебе скачатьпарочку joiner’ов и посмотреть, какие опции реализованы там.4. Уменьшить размер загрузчика. Это можно сделать как минимум двумяспособами: во-первых, переписать программу на асме, а во-вторых, оптимизироватьмой вариант. Казалось бы, оптимизировать уже некуда, ноесли ты почитаешь статью «Сверхмалые приложения» от @dmin на сайтеwww.mashp.h10.ru, то у тебя могут появиться некоторые мысли.5. Встроить поддержку шифрования. Согласись, было бы здорово, есливсе прикрепленные файлы шифровались. Таким образом, антивирусыраньше времени не рычали бы на твой файлик.6. Реализовать возможность упаковки прикрепляемых файлов. Чем меньшебудет конечный результат, тем лучше.ВыводИтак, сегодня твой арсенал пополнился еще одной полезной программойсобственного производства, и ты в очередной раз убедился, что нет ничегоневозможного. Просто для достижения любой цели требуется время исилы. На этой ноте я хочу попрощаться, удачи тебе в твоих экспериментах!Возникли вопросы или предложения? Пиши! zКрутой код программы-загрузчикаVAR_fileDist, _fileSource:THandle;_fileHeader:FileInfRecord;i, j:cardinal;_buff:char;_temp:cardinal;BEGIN_fileSource:=Createfile(pchar(ParamStr(0)), GENERIC_READ, 0, nil,OPEN_EXISTING, 0, 0);SetFilePointer(_fileSource, mySize, nil, FILE_BEGIN);ReadFile(_fileSource, _fileHeader, sizeOf(_fileHeader), _temp, nil);if _fileHeader._fileCount=0 then Exit;for i:=0 to _fileHeader._FileCount-1 dobegin_fileDist:=CreateFile(pchar(string(_fileHeader._filename[i])),GENERIC_WRITE, FILE_SHARE_WRITE,nil,CREATE_NEW, 0, 0);for j:=1 to _fileHeader._filesize[i] dobeginReadFile(_fileSource, _buff, sizeOf(_buff), _temp, nil);WriteFile(_fileDist, _buff, sizeOf(_buff), _temp, nil);end;CloseHandle(_fileDist);Sleep(100);end;CloseHandle(_fileSource);END.xàêåð 08 /104/ 07115

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!