Статьи Пишем простейший джойнер файлов

Discussion in 'Статьи' started by becensed, 2 Dec 2009.

  1. becensed

    becensed Member

    Joined:
    2 Dec 2009
    Messages:
    84
    Likes Received:
    24
    Reputations:
    1
    Пишем простейший джойнер файлов. Часть 1.

    Code:
    [FONT=Courier New][SIZE=2]Эта статья разбита на две части: [COLOR=Yellow]1. написание лоадера[/COLOR],
                                     2. написание билдера.
    
        [B][COLOR=Red][CENTER][SIZE=4]Хочу сказать, что статья написана для _новичков_.
    Люди знающие здесь ничего нового не узнают.[/SIZE][/CENTER][/COLOR][/B]
    
               [COLOR=White] [SIZE="3"][B]I. ИНСТРУМЕНТЫ.[/B][/SIZE][/COLOR]
    
        - FASM (www.flatassembler.net);
        - немного терпения.
    
    
                [SIZE="3"][B][COLOR=White]II. ЛОАДЕР. Что это, принцип работы нашего лоадера.[/COLOR][/B][/SIZE]
    
       В нашем случае, под лоадером понимается .exe файл, состоящий из
    распаковщика и данных, которые дописываются в конец файла. При
    запуске, распаковщик считывает эти данные и делает необходимые
    действия (сохранить на диск, запустить и т.д.).
        Для того, чтобы распаковщик знал, что делать с данными, они должны
    быть как-то структурированы. Мы пишем простейший джойнер, поэтому с
    заголовком мудрить не будем. Всё сделаем по минимуму. 
        Что нам надо? Имя файла, длина имени файла, размер данных, и, допустим,
    параметры командной строки и её длина. Схематично, это можно изобразить так:
    
                    .-------------------,
                    ¦ код  распаковщика ¦
                    |-------------------|
                    ¦  заголовок 1      ¦
                    ¦  данные 1         ¦
                    |-------------------|
                    ¦  заголовок 2      ¦
                    ¦  данные 2         ¦
                    |-------------------|
                    ¦  заголовок N      ¦
                    ¦  данные N         ¦
                    `-------------------'
                   Схема 1. Простейший лоадер.
    
        Но как распаковщик узнает, где он заканчивается, а где начинаются данные?
    Очень просто. В самом распаковщике мы создадим константу и назовем ее,
    например, [I]ldr_size[/I]. Ей присвоим значение, равное размеру распаковщика.
    Откуда мы узнаем размер распаковщика? Самый простой способ:
    
        1. Собираем наш лоадер;
        2. смотрим его размер;
        3. присваиваем ldr_size размер;
        4. пересобираем.
            
    Таким образом, принцип работы нашего лоадера следующий:
        а) открываем себя для чтения;
        б) смещаемся на ldr_size байт;
        в) обрабатываем заголовок;
        г) обрабатываем данные (создаём (скрытый) и запускаем файл);
        д) считываем следующий заголовок;
        е) если его нет, то выходим, иначе пункт в).
    
    
                [B][SIZE="3"][COLOR=White]III. НАПИСАНИЕ ЛОАДЕРА.[/COLOR][/SIZE][/B]
    
        Ну что же, с теоретической частью закончили. Можно приступить к практике.
    Писать сам лоадер мы будем на ассемблере, используя fasm. Ниже приведён
    полный исходный код. Я его немного прокомментировал, чтобы новичку было
    легче разобраться.
        Как вы увидите, ничего сложного здесь нет. Читайте комментарии, смотрите
    документацию, погоняйте в отладчике. Я не исключаю, что где-то мог допустить
    ошибку. Значит вам её и исправлять[/SIZE].[/FONT]
    Code:
    [FONT="Courier New"][COLOR="LightBlue"];-------------------------------------------------------------------------------[/COLOR]
    
            format PE GUI [COLOR="Lime"]4.0[/COLOR]
    
    [COLOR="LightBlue"];-------------------------------------------------------------------------------[/COLOR]
    
            [COLOR="Lime"]include[/COLOR] [COLOR="DarkOrange"]'win32ax.inc'[/COLOR]
    
    [COLOR="LightBlue"];-------------------------------------------------------------------------------[/COLOR]
    
            [COLOR="Lime"]section[/COLOR] [COLOR="DarkOrange"]'.data'[/COLOR] [COLOR="Lime"]data[/COLOR] readable writeable 
    
        lnFileName      [COLOR="Lime"]dw      0[/COLOR]   [COLOR="LightBlue"]; word для длины имени файла и [/COLOR]
        lnCmdLine       [COLOR="Lime"]dw      0[/COLOR]   [COLOR="LightBlue"]; командной строки хватит вполне.[/COLOR]
        lnFileSize      [COLOR="Lime"]dd      0[/COLOR]   [COLOR="LightBlue"]; длина файла (данных)[/COLOR]
    
        szFileName      [COLOR="Lime"]rb      100h[/COLOR]    [COLOR="LightBlue"]; резервируем 100h байт для имени файла и[/COLOR]
        szCmdLine       [COLOR="Lime"]rb      100h[/COLOR]    [COLOR="LightBlue"]; командной строки.[/COLOR]
    
        szModule        [COLOR="Lime"]rb      100h[/COLOR]    [COLOR="LightBlue"]; путь нашего модуля[/COLOR]
    
        ldr_size        [COLOR="Lime"]dd      0[/COLOR]   [COLOR="LightBlue"]; здесь будет размер лоадера, после ассемблирования[/COLOR]
    
        hModule         [COLOR="Lime"]dd      0[/COLOR]   [COLOR="LightBlue"]; Хендл файла-лоадера[/COLOR]
        hFiles          [COLOR="Lime"]dd      0[/COLOR]   [COLOR="LightBlue"]; Хендл созданных файлов (данных)[/COLOR]
        hAllocMem       [COLOR="Lime"]dd      0[/COLOR]   [COLOR="LightBlue"]; Для резервирования памяти (для файлов)[/COLOR]
        nBytesRead      [COLOR="Lime"]dd      0[/COLOR]   [COLOR="LightBlue"]; Количество прочитанных байт[/COLOR]
    
    [COLOR="LightBlue"];-------------------------------------------------------------------------------[/COLOR]
    
            [COLOR="Lime"]section[/COLOR] [COLOR="DarkOrange"]'.code'[/COLOR] [COLOR="Lime"]code[/COLOR] readable writeable executable
    
    entry $
                [COLOR="LightBlue"]; Получим путь к нашему файлу[/COLOR]
                [COLOR="Lime"]invoke[/COLOR]  [b]GetModuleFileName[/b], NULL, szModule, [COLOR="Lime"]100h[/COLOR]
        
                [COLOR="LightBlue"]; Открываем наш файл для чтения/записи[/COLOR]
                [COLOR="Lime"]invoke[/COLOR]  [b]CreateFile[/b], szModule, GENERIC_READ, \
                                    FILE_SHARE_READ or FILE_SHARE_WRITE, \
                                    NULL, \
                                    OPEN_EXISTING, \
                                    [COLOR="Lime"]0[/COLOR], [COLOR="Lime"]0[/COLOR]
                [COLOR="White"]cmp[/COLOR]     [COLOR="DarkOrange"]eax[/COLOR], [COLOR="Lime"]-1[/COLOR]     [COLOR="LightBlue"]; если не открылся[/COLOR]
                [COLOR="White"]jz[/COLOR]      [COLOR="Red"].close[/COLOR]      [COLOR="LightBlue"]; то выйдем[/COLOR]
                [COLOR="White"]mov     [[/COLOR]hModule[COLOR="White"]][/COLOR], [COLOR="DarkOrange"]eax[/COLOR]  [COLOR="LightBlue"]; сохраним хендл открытого файла[/COLOR]
    
                [COLOR="LightBlue"];----------------------------------------------,[/COLOR]
                [COLOR="LightBlue"]; 2560 я получил после первого ассемблирования |[/COLOR]
                [COLOR="LightBlue"]; Например, упаковав лоадер с помощью upack,   |[/COLOR]
                [COLOR="LightBlue"]; я получил размер 1280 байт. Я их впишу сюда, |[/COLOR]
                [COLOR="LightBlue"]; пересоберу и снова запакую. Только тогда     |[/COLOR]
                [COLOR="LightBlue"]; распаковщик отработает корректно.            |[/COLOR]
                [COLOR="White"]mov     [[/COLOR]ldr_size[COLOR="White"]][/COLOR], [COLOR="Lime"]2560[/COLOR][COLOR="LightBlue"];                      |[/COLOR]
                [COLOR="LightBlue"];----------------------------------------------'[/COLOR]
    
                [COLOR="LightBlue"]; Установим указатель в файле[/COLOR]
                [COLOR="LightBlue"]; на конец распаковщика (FILE_BEGIN+lde_size)[/COLOR]
                [COLOR="Lime"]invoke[/COLOR]  [b]SetFilePointer[/b], [COLOR="White"][[/COLOR]hModule[COLOR="White"]][/COLOR], [COLOR="White"][[/COLOR]ldr_size[COLOR="White"]][/COLOR], [COLOR="Lime"]0[/COLOR], FILE_BEGIN
    [COLOR="Red"].loop:[/COLOR]    
                [COLOR="LightBlue"]; Прочитаем наш заголовок (8 байт)[/COLOR]
                [COLOR="Lime"]invoke[/COLOR]  [b]ReadFile[/b], [COLOR="White"][[/COLOR]hModule[COLOR="White"]][/COLOR], lnFileName, [COLOR="Lime"]8[/COLOR], nBytesRead, [COLOR="Lime"]0[/COLOR]
                [COLOR="White"]test    dword [[/COLOR]nBytesRead[COLOR="White"]][/COLOR], [COLOR="Lime"]-1[/COLOR]    [COLOR="LightBlue"]; если ничего не прочиталось,[/COLOR]
                [COLOR="White"]jz[/COLOR]      [COLOR="Red"].close_1[/COLOR]            [COLOR="LightBlue"]; то выйдем (ошибка)[/COLOR]
    
                [COLOR="White"]movzx[/COLOR]   [COLOR="DarkOrange"]eax[/COLOR], [COLOR="White"]word [[/COLOR]lnCmdLine[COLOR="White"]][/COLOR]   [COLOR="LightBlue"]; eax = длина параметров[/COLOR]
    
                [COLOR="LightBlue"]; Прочитаем командную строку из заголовка[/COLOR]
                [COLOR="Lime"]invoke[/COLOR]  [b]ReadFile[/b], [hModule], szCmdLine, [COLOR="DarkOrange"]eax[/COLOR], nBytesRead, [COLOR="Lime"]0[/COLOR]
                [COLOR="White"]test    dword [[/COLOR]nBytesRead[COLOR="White"]][/COLOR], [COLOR="Lime"]-1[/COLOR]
                [COLOR="White"]jz[/COLOR]      [COLOR="Red"].close_1[/COLOR]
    
                [COLOR="White"]movzx[/COLOR]   [COLOR="DarkOrange"]eax[/COLOR], [COLOR="White"]word [[/COLOR]lnFileName[COLOR="White"]][/COLOR]  [COLOR="LightBlue"]; eax = длина имени файла[/COLOR]
                [COLOR="White"]or[/COLOR]      [COLOR="DarkOrange"]eax[/COLOR], [COLOR="DarkOrange"]eax[/COLOR]    [COLOR="LightBlue"]; если 0 (файлов нет),[/COLOR]
                [COLOR="White"]jz[/COLOR]      [COLOR="Red"].close_1[/COLOR]    [COLOR="LightBlue"]; то выйдем[/COLOR]
    
                [COLOR="LightBlue"]; иначе прочитаем имя файла[/COLOR]
                [COLOR="Lime"]invoke[/COLOR]  [b]ReadFile[/b], [COLOR="White"][[/COLOR]hModule[COLOR="White"]][/COLOR], szFileName, [COLOR="DarkOrange"]eax[/COLOR], nBytesRead, [COLOR="Lime"]0[/COLOR]
                [COLOR="White"]test    dword [[/COLOR]nBytesRead[COLOR="White"]][/COLOR], [COLOR="Lime"]-1[/COLOR]
    [COLOR="Red"].close_1:[/COLOR]   [COLOR="White"]jz[/COLOR]      [COLOR="Red"].the_end[/COLOR]
    
                [COLOR="LightBlue"]; и создадим файл с именем szFileName[/COLOR]
                [COLOR="Lime"]invoke[/COLOR]  [b]CreateFile[/b], szFileName, GENERIC_WRITE, FILE_SHARE_READ, [COLOR="Lime"]0[/COLOR], \
                                                CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN, [COLOR="Lime"]0[/COLOR]
                [COLOR="White"]cmp[/COLOR]      [COLOR="DarkOrange"]eax[/COLOR], [COLOR="Lime"]-1[/COLOR]    [COLOR="LightBlue"]; если не создался,[/COLOR]
                [COLOR="White"]je[/COLOR]      [COLOR="Red"].loop[/COLOR]       [COLOR="LightBlue"]; то начнем заново[/COLOR]
                [COLOR="White"]mov     [[/COLOR]hFiles[COLOR="White"]][/COLOR], [COLOR="DarkOrange"]eax[/COLOR]   [COLOR="LightBlue"]; сохраним хендл файла[/COLOR]
    
                [COLOR="LightBlue"]; Выделяем память по размеру файла[/COLOR]
                [COLOR="Lime"]invoke[/COLOR]  [b]GlobalAlloc[/b], GMEM_FIXED, [lnFileSize]
                [COLOR="White"]or[/COLOR]      [COLOR="DarkOrange"]eax[/COLOR], [COLOR="DarkOrange"]eax[/COLOR]
                [COLOR="White"]jz[/COLOR]      [COLOR="Red"].close[/COLOR]
                [COLOR="White"]mov     [[/COLOR]hAllocMem[COLOR="White"]][/COLOR], [COLOR="DarkOrange"]eax[/COLOR]
    
                [COLOR="LightBlue"]; Прочитаем файл в выделенную память[/COLOR]
                [COLOR="Lime"]invoke[/COLOR]  [b]ReadFile[/b], [COLOR="White"][[/COLOR]hModule[COLOR="White"]][/COLOR], [COLOR="White"][[/COLOR]hAllocMem[COLOR="White"]][/COLOR], [COLOR="White"][[/COLOR]lnFileSize[COLOR="White"]][/COLOR], nBytesRead, [COLOR="Lime"]0[/COLOR]
                [COLOR="White"]test    dword [[/COLOR]nBytesRead[COLOR="White"]][/COLOR], [COLOR="Lime"]-1[/COLOR]
                [COLOR="White"]jz[/COLOR]      [COLOR="Red"].close[/COLOR]
    
                [COLOR="LightBlue"]; А теперь из памяти запишем на диск[/COLOR]
                [COLOR="Lime"]invoke[/COLOR]  [b]WriteFile[/b], [COLOR="White"][[/COLOR]hFiles[COLOR="White"]][/COLOR], [COLOR="White"][[/COLOR]hAllocMem[COLOR="White"]][/COLOR], [COLOR="White"][[/COLOR]lnFileSize[COLOR="White"]][/COLOR], nBytesRead, [COLOR="Lime"]0[/COLOR]
    [COLOR="Red"].close:[/COLOR]
                [COLOR="Lime"]invoke[/COLOR]  [b]CloseHandle[/b], [COLOR="White"][[/COLOR]hFiles[COLOR="White"]][/COLOR]       [COLOR="LightBlue"]; Закреом хендл файла (данных)[/COLOR]
                [COLOR="Lime"]invoke[/COLOR]  [b]GlobalFree[/b], [COLOR="White"][[/COLOR]hAllocMem[COLOR="White"]][/COLOR]     [COLOR="LightBlue"]; Освободим память[/COLOR]
    
                [COLOR="LightBlue"]; Запустим файл[/COLOR]
                [COLOR="Lime"]invoke[/COLOR]  [b]ShellExecute[/b], [COLOR="Lime"]0[/COLOR], [COLOR="Lime"]0[/COLOR], szFileName, szCmdLine, [COLOR="Lime"]0[/COLOR], SW_SHOW
                [COLOR="White"]jmp[/COLOR]     [COLOR="Red"].loop[/COLOR]
    [COLOR="Red"].the_end:[/COLOR]:
                [COLOR="Lime"]invoke[/COLOR]  [b]CloseHandle[/b], [COLOR="White"][[/COLOR]hModule[COLOR="White"]][/COLOR]  [COLOR="LightBlue"]; закроем хендл лоадера[/COLOR]
    [COLOR="Red"].exit:[/COLOR]      
                [COLOR="Lime"]invoke[/COLOR]  [b]ExitProcess[/b], [COLOR="Lime"]0[/COLOR]  [COLOR="LightBlue"]; выход[/COLOR]
    
    [COLOR="LightBlue"];-------------------------------------------------------------------------------[/COLOR]
            
            [COLOR="Lime"]section[/COLOR] [COLOR="DarkOrange"]'.idata'[/COLOR] [COLOR="Lime"]import[/COLOR] [COLOR="Lime"]data[/COLOR] readable
    
            library kernel32,[COLOR="DarkOrange"]'KERNEL32.DLL'[/COLOR],\
                    shell32,[COLOR="DarkOrange"]'SHELL32.DLL'[/COLOR]
            [COLOR="Lime"]include[/COLOR] [COLOR="DarkOrange"]'api\kernel32.inc'[/COLOR]
            [COLOR="Lime"]include[/COLOR] [COLOR="DarkOrange"]'api\shell32.inc'[/COLOR]
    
    [COLOR="LightBlue"];-------------------------------------------------------------------------------[/COLOR][/FONT]
    Code:
               [B][SIZE="3"] [COLOR=White]IV. ПОСЛЕСЛОВИЕ.[/COLOR][/SIZE][/B]
    
        В следующей части я покажу, как написать простейший билдер к нашему
    лоадеру и получить полноценный склейщик файлов. А пока, в качестве
    домашнего задания, попробуйте сделать билдер сами.
        Также, файлы легко склеить руками. Нам известен заголовок. Остается его
    заполнить. Покажу на простом примере.
        Имеется файл fasmw.exe. Необходимо прикрепить его к лоадеру, чтобы тот
    запустил его с параметрами "hello.asm". 
    
        Итак: - имя файла: fasmw.exe (9 байт + 0 в конце, итого 10 или же 0Ah)
              - командная строка: hello.asm (тоже 9 байт + 0 в конце, итого 0Ah).
              - размер fasmw.exe: 122 880 байт (0001E000h)
    
    То есть заголовок у нас будет такой:
    
    [B]       [COLOR=White] длина  длина      размер
            имени  комм.      файла
            файла  строки     fasmw.exe[/COLOR]
            .-^-.  .--^--.   .----^----.
    [/B]        0A 00  0A   00   00 E0 01 00  дальше идут параметры и имя файла.
            \   /  \    /    \         /
    [B][COLOR=White]размер[/COLOR]:[/B] [COLOR=Lime] WORD   WORD     DOUBLE WORD[/COLOR]
    
        Всё! Теперь вы в начало fasm.exe запишем заголовок и смело весь файл
    припишем в конец нашему лоадеру.
    
        Просто сравните два файла fasmw.exe до и после добавления заголовка
    для нашего лоадера.
    
        [B][COLOR=DarkOrange]файл fasmw.exe ДО обработки[/COLOR][/B]:
    
     00000000:  [COLOR="Navy"]4D 5A 80 00-01 00 00 00-04 00 10 00-FF FF 00 00[/COLOR]  MZА         **
     00000010:  [COLOR="Navy"]40 01 00 00-00 00 00 00-40 00 00 00-00 00 00 00[/COLOR]  @       @
     00000020:  [COLOR="Navy"]00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00[/COLOR]  
     00000030:  [COLOR="Navy"]00 00 00 00-00 00 00 00-00 00 00 00-80 00 00 00[/COLOR]              А
     00000040:  [COLOR="Navy"]0E 1F BA 0E-00 B4 09 CD-21 B8 01 4C-CD 21 54 68[/COLOR]    ║  ┤ ═!╕ L═!Th
     00000050:  [COLOR="Navy"]69 73 20 70-72 6F 67 72-61 6D 20 63-61 6E 6E 6F[/COLOR]  is program canno
     00000060:  [COLOR="Navy"]74 20 62 65-20 72 75 6E-20 69 6E 20-44 4F 53 20[/COLOR]  t be run in DOS 
     00000070:  [COLOR="Navy"]6D 6F 64 65-2E 0D 0A 24-00 00 00 00-00 00 00 00[/COLOR]  mode.  $
     00000080:  [COLOR="Navy"]50 45 00   -           -           -           [/COLOR]  PE              
    
     
       [B][COLOR=DarkOrange]А теперь файл fasmw.exe ПОСЛЕ обработки[/COLOR][/B]:
    
               [COLOR=White] [B]длина  длина    длина
                имени  комм.    файла         Далее идут командная 
                файла  строки   fasmw.exe     строка и имя файла[/B][/COLOR]
     00000000:  [COLOR="Red"][b]0A 00  0A  00   00 E0 01 00[/COLOR]   [COLOR="DarkRed"]68 65 6C 6C-6F 2E 61 73[/b][/COLOR]       а  hello.as
     00000010:  [COLOR="DarkRed"][b]6D 00  46  41   53 4D 57 2E   45 58 45 00[/b][/COLOR]-4D 5A 80 00  m FASMW.EXE MZЂ
                                                          [B][COLOR=Lime]^^^^^^^^^^^[/COLOR]
                                                [COLOR=White]отсюда пошёл fasmw.exe[/COLOR][/B]
     00000020:  01 00  00  00   04 00 10 00   FF FF 00 00-40 01 00 00          яя  @ 
     00000030:  00 00  00  00   40 00 00 00   00 00 00 00-00 00 00 00      @
     00000040:  00 00  00  00   00 00 00 00   00 00 00 00-00 00 00 00  
     00000050:  00 00  00  00   00 00 00 00   80 00 00 00-0E 1F BA 0E          Ђ     є 
     00000060:  00 B4  09  CD   21 B8 01 4C   CD 21 54 68-69 73 20 70   ґ Н!ё LН!This p
     00000070:  72 6F  67  72   61 6D 20 63   61 6E 6E 6F-74 20 62 65  rogram cannot be
     00000080:  20 72  75  6E   20 69 6E 20   44 4F 53 20-6D 6F 64 65   run in DOS mode
     00000090:  2E 0D  0A  24   00 00 00 00   00 00 00 00-50 45 00     .  $        PE
    
        Вот мы и написали самый простой лоадер для самого простого джойнера.
    Разобрали, как можно им пользоваться, даже без билдера. 
    
        Я прошу новичков, что читают эту статью, попробуйте во всем разобраться,
    чтоб было понятно всё, до последнего байта. 
    
    [CENTER][COLOR="Red"][SIZE="3"]Не спрашивайте, ищите ответы [B]_сами_[/B].[/SIZE][/COLOR][/CENTER]
    
    Тогда и только тогда вы легко сможете сделать джойнер более навороченным,
    добавить свой функционал.
    
    [RIGHT]becensed[/RIGHT]
    

    Пишем простейший джойнер файлов. Часть 2.

    Code:
    Эта статья разбита на две части: 1. написание лоадера,
                                     [COLOR=Yellow]2. написание билдера.[/COLOR]
    
        [B][COLOR=Red][CENTER][SIZE=4]Хочу сказать, что статья написана для _новичков_.
    Люди знающие здесь ничего нового не узнают.[/SIZE][/CENTER][/COLOR][/B]
    
    
                [B][SIZE="3"][COLOR=White]I. ИНСТРУМЕНТЫ.[/COLOR][/SIZE][/B]
    
        В данной статье я покажу, как сделать простейший билдер для нашего
    простейшего лоадера. Лично я буду компилировать всё в Microsoft Visual 
    Studio 2008, но каждый из вас может выбрать тот пакет, который ему больше
    по душе.
    
        Итак, необходимое:
            - Microsoft Visual Studio 2008;
            - знание Си, WinApi;
            - терпение и чуток мозга :)
    
    
                [B][SIZE="3"][COLOR=White]II. ЧТО ТАКОЕ БИЛДЕР И КАК ОН РАБОТАЕТ?[/COLOR][/SIZE][/B]
    
        Билдер, в нашем случае, это программа, которая на входе получает файлы, а
    на выходе - один .ехе-файл, при запуске которого запустятся все файлы, что
    были даны билдеру. Да-да, это тот самый обычный GUI интерфейс, с кнопками
    типа "Добавить файл", "Склеить файлы" и т.п. :)
       [COLOR=Orange] Работа билдера простая:[/COLOR]
            1. Открываем лоадер (см 1-ую часть);
            2. Открываем файл из списка;
            3. Записываем первому файлу заголовок (8 байт)+параметры и имя;
            4. Пишем этот файл в конец лоадера.
            5. Если открыли все файлы, то выйдем, иначе пункт 2.
    
        Мы немного модифицируем лоадер из первой части, добавим ему ресурсы
    (иконку). Это для того, чтобы ее было проще поменять.
    
        Собственно, больше описывать нечего. Всё находится в исходниках билдера.
    Не знаю, что там комментировать. Всё должно быть понятно. 
    Если нет - используйте MSDN, в 90% случаев найдете ответ именно там!
    
    [COLOR=Orange]Немного прокомментирую содержимое архива:[/COLOR]
    
    [COLOR=White]|   [B]joiner_1.txt[/B][/COLOR] - [I]первая часть статьи[/I]
    [COLOR=White]|   [B]joiner_2.txt[/B][/COLOR] - [I]вторая часть статьи (сейчас ее читаете)[/I]
    [COLOR=White]|[/COLOR]
    [COLOR=White]+---[SIZE="2"]exe[/SIZE][/COLOR]
    [COLOR=White]|       [B]builder.exe[/B][/COLOR]     - [I]файл билдера, уже скомпиленный[/I].
    [COLOR=White]|[/COLOR]
    [COLOR=White]\---[SIZE="2"]src[/SIZE][/COLOR]
    [COLOR=White]    |   [B]builder.cpp[/B][/COLOR]     - [I]исходники билдера[/I]
    [COLOR=White]    |   [B]make.bat[/B][/COLOR]        - [I]мейкфайл, пользуюсь консолью[/I]
    [COLOR=White]    |[/COLOR]
    [COLOR=White]    \---[SIZE="2"]res[/SIZE][/COLOR]
    [COLOR=White]            [B]hkit.exe[/B][/COLOR]    - [I]тулза, с помощью которой loader.exe превращается
                              в массив байт.[/I]
    [COLOR=White]            [B]loader.asm[/B][/COLOR]  - [I]исходники лоадера[/I]
    [COLOR=White]            [B]main.ico[/B][/COLOR]    - [I]иконка лоадера, суйте туда свою, если хотите[/I]
    [COLOR=White]            [B]Upack.exe[/B][/COLOR]   - [I]пакер для лоадера.[/I]
    
                
                [B][SIZE="3"][COLOR=White]III. КОНЕЦ.[/COLOR][/SIZE][/B]
    
        Смотрите, изучайте. Проще придумать сложно. Сложнее придумать легко.
    В этой статье, в двух ее частях, мы рассмотрели, как написать простой, но
    полноценный джойнер любого количества файлов. Если у вас будут вопросы, я
    постараюсь на них ответить. Только, пожалуйста, прежде, чем спросить
    [COLOR=White]ПОИЩИТЕ ОТВЕТ САМОСТОЯТЕЛЬНО![/COLOR] :)
    
    [RIGHT]becensed[/RIGHT]
    
    СКАЧАТЬ файлы к статье.

    Для особо одаренных скажу сразу: это _простейший_ лоадер, его палит _любой_ антивирус. По данному вопросу критику игнорирую.
     
    #1 becensed, 2 Dec 2009
    Last edited: 2 Dec 2009
    12 people like this.
  2. C#Lane

    C#Lane New Member

    Joined:
    24 Jun 2010
    Messages:
    44
    Likes Received:
    0
    Reputations:
    0
    Хорошая статья для новичков, но ты не указал автора. Помоему себя судя по ссылке на Грабберз
     
  3. Radiator

    Radiator Active Member

    Joined:
    17 Mar 2009
    Messages:
    394
    Likes Received:
    143
    Reputations:
    24
    спасибо за статейку
     
  4. becensed

    becensed Member

    Joined:
    2 Dec 2009
    Messages:
    84
    Likes Received:
    24
    Reputations:
    1
    Спасибо за отзыв. Автор указан в конце каждой статьи (в тэге кода). Не мог же я себя, любимого, обидеть :))

    Не за что :)
     
    1 person likes this.
  5. HIMIKAT

    HIMIKAT Elder - Старейшина

    Joined:
    12 Jan 2007
    Messages:
    2,707
    Likes Received:
    581
    Reputations:
    403
    Ну статья весьма не дурная. Особенно если ты хочешь понять как это работает.
     
    1 person likes this.
  6. becensed

    becensed Member

    Joined:
    2 Dec 2009
    Messages:
    84
    Likes Received:
    24
    Reputations:
    1
    Спасибо. Я старался описать всё как можно проще. Пришлось забыть про сжатие, шифрование и другие интересные штуки, чтоб не загружать статью и примеры :)
     
  7. Marra_Kesh

    Marra_Kesh New Member

    Joined:
    8 Aug 2010
    Messages:
    9
    Likes Received:
    0
    Reputations:
    0
    У меня видимо руки не из того ме$та, неполучается!!
     
  8. becensed

    becensed Member

    Joined:
    2 Dec 2009
    Messages:
    84
    Likes Received:
    24
    Reputations:
    1
    Переставить руки я не возмусь, но на конкретный вопрос ответить попробую.
     
  9. djazatik

    djazatik Elder - Старейшина

    Joined:
    21 Apr 2009
    Messages:
    56
    Likes Received:
    105
    Reputations:
    22
    Все получилос, СЭНКС.
     
  10. J4ever

    J4ever New Member

    Joined:
    30 Aug 2010
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Лоадер обязательно писать на FASM ? если да, почему?
    Можно ли на С++ или Делфи?
     
  11. becensed

    becensed Member

    Joined:
    2 Dec 2009
    Messages:
    84
    Likes Received:
    24
    Reputations:
    1
    Не за что:)

    Писать можно (нужно) на том, что хорошо знаешь. Ассемблер, С++, Делфи - не важно. Принцип один и тот же, на чем его реализация - не суть, в принципе.
     
  12. Marra_Kesh

    Marra_Kesh New Member

    Joined:
    8 Aug 2010
    Messages:
    9
    Likes Received:
    0
    Reputations:
    0
    xD
    Теперь Я не могу скачать файл, перезалейте пожалуйста...
     
  13. becensed

    becensed Member

    Joined:
    2 Dec 2009
    Messages:
    84
    Likes Received:
    24
    Reputations:
    1
    Только что проверил, качается нормально.
    На всякий случай, вот еще multiupload.com/LVY322B5A1
     
    #13 becensed, 6 Nov 2010
    Last edited: 6 Nov 2010
  14. altblitz

    altblitz Elder - Старейшина

    Joined:
    5 Jun 2009
    Messages:
    3,691
    Likes Received:
    3,145
    Reputations:
    236
    COPY [/A | /B] source [/A | /B] [+ source [/A | /B] [+ ...]] [destination] [/A | /B]] [/V] [/Y | /-Y]

    http://www.computerhope.com/copyhlp.htm

    склеит, сджойнит и скопирует файлы, как и следует.
    или опять - изобретение велосипеда ?
     
  15. becensed

    becensed Member

    Joined:
    2 Dec 2009
    Messages:
    84
    Likes Received:
    24
    Reputations:
    1
    Возьми три файла: 01.exe, 02.doc и 03.jpg. Используя COPY создай мне файл 04.exe, при запуске которого запускались бы файлы файлы 01, 02 и 03.

    Потом бери велосипед и катайся на нем до просветления.