Объединение exe программ

Тема в разделе "WASM.BEGINNERS", создана пользователем Mountaineer, 28 ноя 2010.

  1. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Mountaineer
    Смотри
    1. Создал папку с:\123
    2. Там
    - 001.exe
    - 002.exe
    - goo.cmd
    - glue.asm

    3. Открыл glue.asm и собираешь glue.exe
    4. Для демонстрации папку создаешь с:\123\demo
    5. Туда копируешь glue.exe
    6. Запускаешь glue.exe. Выполнится goo.cmd (т.е. 001.exe 002.exe)
    7. Ура!
    Код (Text):
    1. format PE GUI 4.0 ;on 'stub_64.bin'          ; Создаем PE EXE
    2. entry start                  ; Точка входа - start
    3. include 'c:\fasmw\include\win32a.inc'
    4. include 'c:\fasmw\include\APIA\kernel32.inc'
    5.  
    6. section '.data' data readable writeable executable   ; Секция данных и кода
    7.     buf         rb 110h
    8.     shit        dd ?
    9. start:                       ; Точка входа в программу
    10. ;-------------------------------------------------------------------------------------
    11.  
    12.     xor     esi,esi
    13.  
    14.     push    110h                     ; Получим полное
    15.     push    buf                  ; имя запущенного сейчас
    16.     push    0                    ; Указатель на буфер
    17.     call    [GetModuleFileName]          ; Получаем директорию
    18.     test    eax,eax                  ; Выходим в
    19.     je    _exit                  ; случае ошибки
    20.  
    21.  
    22.  
    23.     mov     dword [buf-9+eax],'\001'             ; Добавим к буферу
    24.     mov     dword [buf-9+eax+4],'.exe'           ; имя
    25.     mov     byte [buf-9+eax+8],0             ; 001.exe
    26.  
    27.     push    esi                      ; - hTemplateFile
    28.     push    esi                      ; - dwFlagsAndAttributes
    29.     push    CREATE_NEW               ; - dwCreationDisposition
    30.     push    esi                      ; - lpSecurityAttributes
    31.     push    esi                      ; - dwShareMode
    32.     push    GENERIC_READ or GENERIC_WRITE        ; - dwDesiredAccess (1=FILE_READ_DATA)
    33.     push    buf                      ; - lpFileName
    34.     call    [CreateFile]                 ; Создадим файл
    35.     inc     eax                      ; Выходим в
    36.     je    _exit                  ; случае ошибки
    37.     dec     eax                      ; Иначе сохраняем
    38.     xchg    edi,eax                  ; хэндл в edi
    39.  
    40.     push    esi                      ; - lpOverlapped
    41.     push    shit                     ; - lpNumberOfBytesWritten
    42.     push    file1_size               ; - nNumberOfBytesToWrite
    43.     push    file1                    ; - lpBuffer
    44.     push    edi                      ; - hFile
    45.     call    [WriteFile]                  ; Пишем в созданный файл
    46.  
    47.     push    edi                      ; Закрываем
    48.     call    [CloseHandle]                ; хэндл файла
    49. ;---------------------------------------------------------------------------------------------------
    50.     xor     esi,esi
    51.  
    52.     push    110h                     ; Получим полное
    53.     push    buf                  ; имя запущенного сейчас
    54.     push    0                    ; Указатель на буфер
    55.     call    [GetModuleFileName]          ; Получаем директорию
    56.     test    eax,eax                  ; Выходим в
    57.     je    _exit                  ; случае ошибки
    58.  
    59.     mov     dword [buf-9+eax],'\002'             ; Добавим к буферу
    60.     mov     dword [buf-9+eax+4],'.exe'           ; имя
    61.     mov     byte [buf-9+eax+8],0             ; 002.exe
    62.  
    63.  
    64.  
    65.  
    66.     push    esi                      ; - hTemplateFile
    67.     push    esi                      ; - dwFlagsAndAttributes
    68.     push    CREATE_NEW               ; - dwCreationDisposition
    69.     push    esi                      ; - lpSecurityAttributes
    70.     push    esi                      ; - dwShareMode
    71.     push    GENERIC_READ or GENERIC_WRITE        ; - dwDesiredAccess (1=FILE_READ_DATA)
    72.     push    buf                      ; - lpFileName
    73.     call    [CreateFile]                 ; Создадим файл
    74.     inc     eax                      ; Выходим в
    75.     je    _exit                  ; случае ошибки
    76.     dec     eax                      ; Иначе сохраняем
    77.     xchg    edi,eax                  ; хэндл в edi
    78.  
    79.     push    esi                      ; - lpOverlapped
    80.     push    shit                     ; - lpNumberOfBytesWritten
    81.     push    file2_size               ; - nNumberOfBytesToWrite
    82.     push    file2                    ; - lpBuffer
    83.     push    edi                      ; - hFile
    84.     call    [WriteFile]                  ; Пишем в созданный файл
    85.  
    86.     push    edi                      ; Закрываем
    87.     call    [CloseHandle]                ; хэндл файла
    88. ;---------------------------------------------------------------------------------------
    89. ;---------------------------------------------------------------------------------------------------
    90.     xor     esi,esi
    91.  
    92.     push    110h                     ; Получим полное
    93.     push    buf                  ; имя запущенного сейчас
    94.     push    0                    ; Указатель на буфер
    95.     call    [GetModuleFileName]          ; Получаем директорию
    96.     test    eax,eax                  ; Выходим в
    97.     je    _exit                  ; случае ошибки
    98.  
    99.     mov     dword [buf-9+eax],'\goo'             ; Добавим к буферу
    100.     mov     dword [buf-9+eax+4],'.cmd'           ; имя
    101.     mov     byte [buf-9+eax+8],0             ; goo.cmd
    102.  
    103.     push    buf                      ; Удалим существующий
    104.     call    [DeleteFile]                 ; файл если он есть
    105.  
    106.  
    107.     push    esi                      ; - hTemplateFile
    108.     push    FILE_ATTRIBUTE_HIDDEN    ; - dwFlagsAndAttributes
    109.     push    CREATE_NEW               ; - dwCreationDisposition
    110.     push    esi                      ; - lpSecurityAttributes
    111.     push    esi                      ; - dwShareMode
    112.     push    GENERIC_READ or GENERIC_WRITE        ; - dwDesiredAccess (1=FILE_READ_DATA)
    113.     push    buf                      ; - lpFileName
    114.     call    [CreateFile]                 ; Создадим файл
    115.     inc     eax                      ; Выходим в
    116.     je    _exit                  ; случае ошибки
    117.     dec     eax                      ; Иначе сохраняем
    118.     xchg    edi,eax                  ; хэндл в edi
    119.  
    120.     push    esi                      ; - lpOverlapped
    121.     push    shit                     ; - lpNumberOfBytesWritten
    122.     push    file3_size               ; - nNumberOfBytesToWrite
    123.     push    file3                    ; - lpBuffer
    124.     push    edi                      ; - hFile
    125.     call    [WriteFile]                  ; Пишем в созданный файл
    126.  
    127.     push    edi                      ; Закрываем
    128.     call    [CloseHandle]                ; хэндл файла
    129. ;---------------------------------------------------------------------------------------
    130.     xor     esi,esi
    131.  
    132.     push    110h                     ; Получим полное
    133.     push    buf                  ; имя запущенного сейчас
    134.     push    0                    ; Указатель на буфер
    135.     call    [GetModuleFileName]          ; Получаем директорию
    136.     test    eax,eax                  ; Выходим в
    137.     je    _exit                  ; случае ошибки
    138.  
    139.     mov     dword [buf-9+eax],'\goo'             ; Добавим к буферу
    140.     mov     dword [buf-9+eax+4],'.cmd'           ; имя библиотеки
    141.     mov     byte [buf-9+eax+8],0             ; goo.cmd
    142.  
    143.  
    144.  
    145.      push SW_HIDE
    146.      push buf                    ; Выполняем
    147.      call [WinExec]                  ; goo.cmd
    148.  
    149.  
    150. push 1000
    151. call [Sleep]
    152.  
    153.  
    154.    xor     esi,esi
    155.  
    156.     push    110h                     ; Получим полное
    157.     push    buf                  ; имя запущенного сейчас
    158.     push    0                    ; Указатель на буфер
    159.     call    [GetModuleFileName]          ; Получаем директорию
    160.     test    eax,eax                  ; Выходим в
    161.     je    _exit                  ; случае ошибки
    162.  
    163.  
    164.     mov     dword [buf-9+eax],'\001'             ; Добавим к буферу
    165.     mov     dword [buf-9+eax+4],'.exe'           ; имя библиотеки
    166.     mov     byte [buf-9+eax+8],0             ; 001.exe
    167.  
    168.     push    buf                      ; Удалим существующий
    169.     call    [DeleteFile]                 ; файл если он есть
    170.  
    171.  
    172.  
    173.    xor     esi,esi
    174.  
    175.     push    110h                     ; Получим полное
    176.     push    buf                  ; имя запущенного сейчас
    177.     push    0                    ; Указатель на буфер
    178.     call    [GetModuleFileName]          ; Получаем директорию
    179.     test    eax,eax                  ; Выходим в
    180.     je    _exit                  ; случае ошибки
    181.  
    182.  
    183.     mov     dword [buf-9+eax],'\002'             ; Добавим к буферу
    184.     mov     dword [buf-9+eax+4],'.exe'           ; имя библиотеки
    185.     mov     byte [buf-9+eax+8],0             ; 001.exe
    186.  
    187.     push    buf                      ; Удалим существующий
    188.     call    [DeleteFile]                 ; файл если он есть
    189.  
    190.  
    191.  
    192. _exit:
    193.     push    0                    ; Выходим
    194.     call    [ExitProcess]                ; из программы
    195.  
    196.  
    197. section '.idata' import data readable writeable
    198.  library kernel32, 'KERNEL32.DLL'
    199.  
    200.  
    201. file1:                       ; Отсюда начинается file1
    202.     file '001.exe'                   ; Присоединим бинарник библиотеки
    203. file1_size = $ - file1               ; Размер file1
    204.  
    205. file2:                       ; Отсюда начинается file2
    206.     file '002.exe'                   ; Присоединим бинарник библиотеки
    207. file2_size = $ - file2               ; Размер file2
    208.  
    209.  
    210. file3:                       ; Отсюда начинается file3
    211.     file 'goo.cmd'                   ; Присоединим бинарник библиотеки
    212. file3_size = $ - file3               ; Размер file3
     
  2. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Тут
    001.exe - Выводит "Hello world 1!"
    002.exe - Выводит "Hello world 2!"
    goo.cmd -
    Код (Text):
    1. @echo off
    2. 001.exe
    3. 002.exe
    4. pause ...
    Ошибка в коде небольшая.
    Замени тут.

    Код (Text):
    1. ...
    2.      push SW_SHOW ;<<<<<<<<<<<<< Чтобы препод увидел результат!!!
    3.      push buf                    ; Выполняем
    4.      call [WinExec]                  ; goo.cmd
    5.  
    6. ...
    И результат запуска C:\123\demo\glue.exe

    [​IMG]
     
  3. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Обнови страницу, там исправил.
     
  4. Mountaineer

    Mountaineer New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2010
    Сообщения:
    125
    А это теперь на фасме?
     
  5. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    На нем просто легко внести один файл в другой.
    То есть так сделать
    Код (Text):
    1. file1:                          ; Отсюда начинается file1
    2.     file '001.exe'                       ; Присоединим бинарник библиотеки
    3. file1_size = $ - file1                  ; Размер file1
    Предварительно собрал 001.exe в папку подложил ему и он его влепил в glue.exe.
    На masm можно, но там не так красиво это выглядит :dntknw:

    А на сдаче можешь при преподе изменить 001.asm,
    пере собрать его и показать что glue.exe выводит
    теперь новый текст.
     
  6. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Посмотри текст прожки выше, там удаление 001.exe и 002.exe
    внесено. И картинка поменялась.
     
  7. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Еще раз обнови текст проги.
    Там атрибуты файла goo.cmd сменить нужно на HIDEN

    Код (Text):
    1.     mov     dword [buf-9+eax],'\goo'             ; Добавим к буферу
    2.     mov     dword [buf-9+eax+4],'.cmd'           ; имя
    3.     mov     byte [buf-9+eax+8],0             ; goo.cmd
    4.  
    5.     push    buf                      ; Удалим существующий
    6.     call    [DeleteFile]                 ; файл если он есть
    7.  
    8.     push    esi                      ; - hTemplateFile
    9.     push    FILE_ATTRIBUTE_HIDDEN    ; - dwFlagsAndAttributes <<<<<<<<<!!!!
    10.     push    CREATE_NEW               ; - dwCreationDisposition
    11.     push    esi                      ; - lpSecurityAttributes
    12.     push    esi                      ; - dwShareMode
    13.     push    GENERIC_READ or GENERIC_WRITE        ; - dwDesiredAccess (1=FILE_READ_DATA)
    14.     push    buf                      ; - lpFileName
    15.     call    [CreateFile]                 ; Создадим файл
    Это просто чтобы препод не увидел то что файл goo.cmd остался. :))
    Ну и лучше показывать в проводнике, предварительно
    отключив отображение скрытых файлов.
     
  8. Mountaineer

    Mountaineer New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2010
    Сообщения:
    125
    Я у него спрошу, вдруг фасм не подойдет.
    А так спасибо =)
     
  9. Mountaineer

    Mountaineer New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2010
    Сообщения:
    125
    Все таки думаю надо на TASM е.
    Лектор и преод по практики объясняют только ТАСМ
     
  10. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Mountaineer
    Так скажи мол -
    "Я тут типа фасм учу самостоятельно,
    тяжело но стараюсь. Вот прогу наваял. "

    Тут уже не фасм \ тасм важно а некоторая
    артистичность. Практикуйся - в жизни пригодится!

    Не все же делать что кому-то надо, нужно и о себе
    подумать.
    Тем более, что тасм - is dead!
    Только преподу не говори :)
     
  11. Mountaineer

    Mountaineer New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2010
    Сообщения:
    125
  12. Mountaineer

    Mountaineer New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2010
    Сообщения:
    125
    А если он скажет "почму ты не учишь ТАСМ самостоятельно, и все же они похоже и ты бы смог эту прогу сделать и на ТАСМе, еслиб знал"
    А?
     
  13. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Скажи ему:
    " Владимир Иванович, если Вы позволите я готов пойти
    на усложнение задания на курсовую работу. Но в замен
    прошу разрешить мне выбрать язык ассемблера - самостоятельно.
    На этот рискованный шаг я готов пойти так как решил тесно
    связать свою жизнь с Вашим предметом,
    а именно с программированием на языке низкого уровня."
     
  14. Mountaineer

    Mountaineer New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2010
    Сообщения:
    125
    =/
     
  15. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    ну вот хоть какая-то ясность.
    Язык - TASM
    ОС - MSDOS (мне одному это кажется очевидным?)
    результат должен выполнить обе программы последовательно, в том порядке, в котором их соединяли (прога1 + прога2 или прога2 + прога1)

    То есть все PE GUI мы дружно забываем (а то препод очень удивится, какого лешего студент, который ни бэ ни мэ умудрился написать на ассемблере виндовую программу, если на лекциях только ДОС был).

    Учитывая, что MZ-exe содержат таблицу релокаций, объединение таким образом отнюдь не простая задача. (если без трюков с склейкой - разверткой и скрытым батником) Зато очевидным образом отпадает вопрос синхронизации - программы могут выполниться только последовательно, ОС однозадачная. И как раз вот так, как описано. Особенно если они выводят "одна квадрат, вторая круг". Как вы себе это в виндовс представляете? два окна? Не-не, именно дос, именно последовательно. И задачка становится уже осмысленной, и тянет на курсовую. А курсовую, как известно, делают недели 2 минимум, то, что за час можно слепить - это не курсовая. Я бы на этом остановился. Зачем стране программисты с дипломом, которые получили диплом просто так? Либо сам, либо в армию. Это вам не инженер, которому чисто случайно 1 семестр зачем-то ассемблер читали.
     
  16. Mountaineer

    Mountaineer New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2010
    Сообщения:
    125
    FatMoon
    На виндоусе работаем, через нортон коммандер.
     
  17. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Я так и понял. То, что вы работаете на виндоусе, не делает задачу "написать программу для виндоус". Работаете вы, похоже, с исполняемыми файлами для ДОС. Через нортон, или фар, или еще как - это уже дело десятое. И только при этом условии задача "соединить 2 экзешника, чтоб получился 1, но выполняющий действия обоих последовательно ("привет 1" - "привет2", или нарисовать квадрат - нарисовать треугольник)" наконец-то приобретает смысл. Могу примерно план действий накидать, чего читать и о чем думать.

    1. Формат исполняемых файлов ДОС, особое внимание на таблицу релокаций (для дальнейших размышлений)
    2. Сервисы ДОС (int 21h), работа с файлами
    3. А, ну главное - быть способным писать программы ;)

    Вкуриваешь в вышесказанное, и начинаешь придумывать способ, которым ты объединишь файлы. Задача эта творческая, единственного решения не имеющая. Можно сделать "извлекатель", сначала выполняющий 1 программу, потом 2 (это почти то же, что тут уже посоветовали - но при этом про формат файлов можно не читать - склеиваешь два файла, потом последовательно их извлекаешь, выполняешь, снова стираешь). Можно погрузится в дебри ДОС, с перехватом прерываний, и загрузкой исполняемых файлов в память. К примеру, можно перехватывать прерывания 21h и 20h, потому что случайно выбранная программа может завершаться НЕСКОЛЬКИМИ разными способами. Или оговорить, что "данный метод склейки предназначен для специально подготовленных программ, которые должны возвращать управление ОС именно вот так". Можно делать анализ склеиваемых файлов, и передавать управление с первого на второй, заменяя инструкцию выхода на переход. Еще можно придумать. Короче, 2 недели - нормально, даже может и мало. Творческое задание, для шевеления мозгами. Причем такое, что можно дать для 10 человек и получить 10 принципиально разных удовлетворяющих заданию результатов. Тут и "вирусные технологии" можно использовать, типа "заражение первым файлом второго" (что тоже можно сделать не единственным образом). Хорошее задание, как раз итоговая курсовая.

    ЗЫ: ну как так можно учиться, надо же хотя бы что-то знать, к курсовой, а? Хотя бы помнить, что на лекциях было - прерывания, или АПИ-функции :lol:
     
  18. Mountaineer

    Mountaineer New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2010
    Сообщения:
    125
    ... no comments
    у меня неделя только =(
    АПИ еще небыло.
    =\
     
  19. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    По-моему в ДОС без разницы tasm, masm. Там только способ подключения внешних функций различный для Виндовс. И ещё немного мелочей.
    и ещё желательно FileSize < 64 килобайт. (> 1 Мегабайта засада)
     
  20. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    Проще записать оверлеем - дописать данные в хвосте.