Гы-гы-гы А можно и мне тогда, вопрос. Как запустить экрешник, чтобы им можно было управлять. Хочу лоадер и инжект длл, помогите литературой. Пожалуйста.
Ну вариант, аналогичный "copy 1.exe + 2.exe 3.exe" слишком прост и для исполняемых не имеет смысла, поэтому не рассматриваю Предположим, задание должно иметь смысловую нагрузку, то есть исполняемые файлы должны в итоге какие-то функции выполнять, причем оба. ИМХО задача нерешаема в общем случае (2 произвольных исполняемых файла). Почему? потому что не указано, как используется результат. Решаема, если оба файла суть некие линейные программы, выполняемые последовательно. Или файлы суть сервисы, выполняемые одновременно. Поскольку никаких граничных условий не указано, предположу, что ТС неправильно понял задание, и имелось в виду "dual exe", один исполняемый файл для DOS, второй - для Windows, выполняющие схожие функции. То есть надо прилинковать вместо stub'а второй программы первую. То есть кроме "склейки" еще и правка заголовков, в одном - сменить (добавить) указатель на начало PE-header'а, в другом - убрать MZ-stub. Естественно, исполняемые программы должны быть выбраны разумно, а не "возьмем notepad.exe и соединим с iexplore.exe" )) Главный вопрос: о чем курсовая???
Mountaineer Смех смехом, но ты на консультацию-то пожалуй, а то неровен час препод. поймет, что тему дал невнятную и прикажет студенту Николаю Монтейнеру полученную прожку-то запустить на исполнение! Так что будь предусмотрительным. Мой тебе совет.
Ну вот Code (Text): .586 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\masm32.inc include \masm32\include\kernel32.inc include \masm32\include\ws2_32.inc include \masm32\include\user32.inc includelib \masm32\lib\masm32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\ws2_32.lib includelib \masm32\lib\user32.lib .data szFile1 db 'file1.exe',0 ; - имя первого склеиваемого файла szFile2 db 'file2.exe',0 ; - имя второго склеиваемого файла szResult db 'result.exe',0 ; - имя файла в котором склеены первый и второй .code start proc LOCAL lhFile1, lhFile2, lhResult: DWORD LOCAL lsFile1, lsFile2, lsResult: DWORD LOCAL lmFile1, lmFile2, lmResult: DWORD LOCAL leFile1, leFile2, leResult: DWORD LOCAL Tmp: DWORD ; Открываем для чтения первый файл invoke CreateFile,addr szFile1,GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0 ; Сохраняем его хендл в переменной lhFile1 mov lhFile1,eax ; Найдем размер первого файла invoke GetFileSize,lhFile1,0 ; Сохраним размер в переменной lsFile1 mov lsFile1,eax ; Закажем память объемом lsFile1 invoke GlobalAlloc,GMEM_FIXED,lsFile1 ; Сохраним указатель на первый байт этой памяти в переменной lmFile1 mov lmFile1,eax ; Добавим к адресу выделенной памяти размер первого файла add eax,lsFile1 ; Сохраним этот адрес в переменной leFile1 mov leFile1,eax ; Прочитаем первый файл в выделенную память invoke ReadFile,lhFile1,lmFile1,lsFile1,addr Tmp,0 ; То же самое но теперь для второго файла ; Все результаты в свои переменные соответственно ; Тут по аналогии сам разберись invoke CreateFile,addr szFile2,GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0 mov lhFile2,eax invoke GetFileSize,lhFile2,0 mov lsFile2,eax invoke GlobalAlloc,GMEM_FIXED,lsFile2 mov lmFile2,eax add eax,lsFile2 mov leFile2,eax invoke ReadFile,lhFile2,lmFile2,lsFile2,addr Tmp,0 ; Создаем для записи файл результата первый файл invoke CreateFile,addr szResult,GENERIC_WRITE,0,0,CREATE_NEW,0,0 ; Прячем его хендл в переменную lhResult mov lhResult,eax ; Определяем размер файла-результата mov eax,lsFile1 ; В EAX <- Размер первого файла add eax,lsFile2 ; EAX = EAX+Размер второго файла mov lsResult,eax ; Все это прячем в переменную lsResult add eax,lmResult ; В EAX <- Размер первого файла mov leResult,eax ; ???? ; Выделим память объемом = сумме объемов первого + второго файла invoke GlobalAlloc,GMEM_FIXED,lsResult ; Полученный адрес сохраним в перем. lmResult mov lmResult,eax ; Начинаем перенос из памяти выделенной под чтение ; первого файла в память результата mov esi,lmFile1 mov edi,lmFile2 mov ebx,lmResult next: cmp esi,leFile1 jae @F mov al,[esi] mov [ebx],al inc ebx inc esi ; Продолжаем перенос из памяти выделенной под чтение ; второго файла в память результата @@: cmp edi,leFile2 ja @F mov al,[edi] mov [ebx],al inc ebx inc edi @@: cmp ebx,leResult jb next ; Записываем из наполненной памяти с результатом в файл результата invoke WriteFile,lhResult,lmResult,lsResult,addr Tmp,0 ; Освобождаем все участки памяти и заказанные переменные invoke GlobalFree,lmFile1 invoke GlobalFree,lmFile2 invoke GlobalFree,lmResult invoke CloseHandle,lhFile1 invoke CloseHandle,lhFile2 invoke CloseHandle,lhResult ; Выход! invoke ExitProcess,0 ret start endp end start
Mountaineer Не бойся переходить на masm! Если знаешь как писать на tasm, вообще проблемы не будет. Разницы практически и нет!