Я хочу загрузить внешний файл .exe и расширить его исходный код или изменить его во время работы. - PullRequest
0 голосов
/ 24 апреля 2020

Начну с того, что я новичок в MASM. Я выучил C и Python в прошлом году, а затем C ++ - OOP во время "летнего перерыва" (я взял дополнительный курс вместо перерыва), но я не чувствую, что эти навыки действительно помогают мне столько с этим конкретным c курсом.

В моих домашних заданиях мой профессор обычно собирает свой собственный простой код и связывает этот файл .exe, поэтому мы должны вручную запустить его файл, извлечь произвольный значение из него, а затем использовать это значение в нашем собственном коде. Например, в прошлый раз все его программы запрашивали у нас идентификационный номер нашего студента, а затем давали нам «уникальный ключ», который мы должны были включить в нашу собственную программу.

Запуск двух отдельных исполняемых файлов для меня крайне избыточен, и мне очень не нравится тот факт, что мои программы не являются модульными, поэтому я хотел бы получить некоторую помощь по правильному использованию INT21 \ 4AH и INT21 \ 4BH прерывает.

Программы моего профессора довольно просты c - они всегда печатают инструкцию, которая просит пользователя ввести что-то, затем читают этот ввод и сразу дают вам вывод. Итак, я думаю о двух способах решения этой проблемы:

  1. Путем внедрения: загрузить его код без его запуска, а затем каким-то образом перенаправить вывод своей программы в строку вместо ее печати - и затем запустить его. В C ++ это было бы чрезвычайно легко сделать, но я не совсем уверен, как я мог бы перенаправить вывод в asm.
  2. Расширяя: чтобы его код работал нормально, и как только его код готов, я извлечь необходимые параметры из их экранных координат (0b800h: [координаты]), а затем использовать их в моей части кода.

Мне удалось найти основную c схему кода для исполняемых файлов, но у меня проблемы с документацией.

  1. Нужно ли использовать INT21 \ 1AH при загрузке файлов .exe? потому что, хотя код использует его - он говорит, что файл .exe не требует много места, в отличие от файлов .com. Так как мне узнать, сколько места мне нужно выделить?

  2. Какими должны быть мои параметры? Я не мог найти примеры для этой части. Я не совсем уверен, каково расположение исполняемого файла, и я не уверен, где будет храниться его код.

По сути, я пытаюсь выяснить, как управлять расположением внешнего кода, когда выделять больше памяти и как переходить от моего кода к коду моего профессора и обратно.

Это базовый c код:

.model small
.stack 200h

clr_scr macro
push ax
push bx
mov ah, 15
int 10h
mov ah,0
int 10h
pop bx
pop ax
endm


.data
    filename db 'KEYGEN.EXE',0
    parameters dw 7 dup (0)
    oldSS dw 0
    oldSP dw 0

.code
start:

mov ax, @data
mov dx, ax
clr_scr

shell:
mov bx, randseg
mov ax, es
sub bx, ax
mov ah,4ah
int 21h

mov ax, seg parameters
mov es, ax
mov bx, offset parameters
mov oldSP, sp
mov oldSS, ss
mov dx, offset filename
mov ax, seg filename
mov ds, ax
mov ah, 4bh
mov al, 00h
int 21h



mov ax, @data
mov ds, ax
mov ss, keep_ss
mov sp, keep_sp



 mov ax, 0b800h
 mov es, ax 



exit:

mov ax, 4c00h
int 21h
randseg segment 
randseg ends
end start
...