Современные решения

для защиты Windows приложений

и восстановления исходного кода
Автор: xen. Дата публикации: 10.08.2004

Запуск дочерней программы


DOS выделяет всю доступную память текущей программе, независимо от того, какой объем реально необходим. Поэтому вы должны освободить часть памяти для того, чтобы загрузить и выполнить дочернюю программу. Это выполняется процедурой Setmem. Каждый параграф занимает 16 байт. Пространство, необходимое текущей программе вычисляется как размер в параграфах = Lseg - Psp + 1
где Lseg - сегмент, расположенный после последнего байта программы, а Psp - сегмент, в котором расположен psp программы.

Setmem proc ;Выделяет AX параграфов памяти текущей программе :и очищает всю остальную память. ;Входные данные: количество выделяемых параграфов в AX ;Выходные данные: число реально выделенных параграфов в AX mov BX,AX ;объем выделяемой памяти в 16-битных параграфах mov AH,4Ah int 21h ;ES должен указыват на сегмент PSP программы mov AX,BX ;число выделенных параграфов ret Setmem endp


Следующий фрагмент кода запускает программу CHILD.COM с параметром /HELP.

;сегмент данныхt: ChildName db 'CHILD.COM',0 ;имя файла в виде строки ASCIIZ ; сегмент кода: mov AX,CS mov SegCmdLine,AX mov SegFCB1,AX mov SegFCB2,AX push DS ;сохраняем регистры push ES mov CS:Shell_SS,SS ;сохраняем только регистр CS mov CS:Shell_SP,SP ;exec-function mov DX,offset ChildName ;DS:DX - указатель на строку, содержащую имя файла mov AX,CS mov ES,AX mov BX,offset CS:Parm_Table ;таблица параметров ES:BX mov AX,4B00h ;загрузить и выполнить программу int 21h cli ;запрещаем прерывания mov SS,CS:Shell_SS ;восстанавливаем регистры mov SP,CS:Shell_SP sti ;разрешаем прерывания pop ES pop DS cld ;флаг направления (direction flag) = 0 jc ThereWasError ;ошибка ; эти данные должны быть определены в сегменте кода CmdLineTail db 6,' /HELP',13 ;6 - число символов even ;faster this way Shell_SS dw 0 ;указатель стека Shell_SP dw 0 Parm_Table dw 0 ;наследуем переменные окружения родительской программы dw offset CmdLineTail SegCmdLine dw 0 ;сюда будет записан CS dw 5Ch ;блок управления файлом (FCB) #1 SegFCB1 dw 0 ;сюда будет записан CS dw 6Ch ;блок управления файлом (FCB) #2 SegFCB2 dw 0 ;сюда будет записан CS


Комментарии

отсутствуют

Добавление комментария


Ваше имя (на форуме):

Ваш пароль (на форуме):

Комментарии могут добавлять только пользователи,
зарегистрированные на форуме данного сайта. Если Вы не
зарегистрированы, то сначала зарегистрируйтесь тут

Комментарий: