Вопрос № 64120: Ув. Boriss
как вы и сказали добавил в код
mov ax, 3 ; ah =0 - номер функции, al=3 - режим
int 10h
--------
Привожу пример (не забывайте я в бронепоезде)
CSEG segment
org 100h
_beg:
mov ax,0B800h
mo...Вопрос № 64166: Привет! У меня несколько вопросов.
1. Когда пишешь стандартным asm-овским синтаксисом, то имя сегмента указывается сразу (NameSegment segment). Как именуется сегмент если писать masm-овским синтаксисом (.code)?
2. Как происходит формирование...Вопрос № 64184:
что обозначает
ASSUMECS:CSEG,DS:CSEG,ES:CSEG,SS:CSEG?Где применяеться данная команда?...Вопрос № 64201: Здравствуйте, уважаемые эксперты. У меня такой вопрос.
Написал резидент, который по CTRL+s - выводит параметры диска,с которого запущена прога, по CTRL+x- выгружается из памяти. Писал используя проги из рассылки Калашникова. Запускал из Windows X...Вопрос № 64212: Как удалить файл через функцию 41h прерывания №21h
Если его атрибут только для чтения! ...
Вопрос № 64.120
Ув. Boriss
как вы и сказали добавил в код
mov ax, 3 ; ah =0 - номер функции, al=3 - режим
int 10h
--------
Привожу пример (не забывайте я в бронепоезде)
mov ax, 3 ; ah =0 - номер функции, al=3 - режим
int 10h
mov ah,10h
int 16h
int 20h
CSEG ends
end _beg
В результате выполнения меняется размер окна ФАРА
но символа так и нету! Что делать? Как поправить код?
Пользуюсь Turbo Assembler Version 4.1 Copyright (c) 1988, 1996 Borland International
Turbo Link Version 4.0 Copyright (c) 1991 Borland International
Отправлен: 25.11.2006, 09:49
Вопрос задал: Snik (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Олег Владимирович
Здравствуйте, Snik!
Не туда вставили :)
Режим должен меняться до вывода рожицы
CSEG segment
org 100h
_beg:
mov ax, 3 ; ah =0 - номер функции, al=3 - режим
int 10h
mov ax,0B800h
mov ds,ax
mov di,0
mov ah,31
mov al,1
mov ds:[di],ax
mov ah,10h
int 16h
int 20h
CSEG ends
end _beg
--------- Факультет ПМ-ПУ - лучший в СПбГУ!
Ответ отправил: Олег Владимирович (статус: 7-ой класс)
Ответ отправлен: 25.11.2006, 13:45
Вопрос № 64.166
Привет! У меня несколько вопросов.
1. Когда пишешь стандартным asm-овским синтаксисом, то имя сегмента указывается сразу (NameSegment segment). Как именуется сегмент если писать masm-овским синтаксисом (.code)?
2. Как происходит формирование адреса при создании 32 битной проги. Я знаю , что сегментная составляющая сдвигается на 4 при формировании линейного адреса, а потом добавляется смещение. Так ли для 32 битных прог?
3. На что похож вызов процедуры через invoke. Похож ли он на call? Ну и следовательно, что за "PROTO". Как я понимаю, таким образом создается прототипа процедуры. Можно ли через invoke вызывать процедуры из своей библиотеки *.lib. Я пиши через макрос прототип для каждой функции, который каждый передоваемый параметр ложит в стек и забирает от туда возвращаемые значения(сделано, что бы вдруг в стеке чего не оставить). Правильно ли я делаю или может есть более грамотные способы.
PS: И еще, ну это так, может руки кривые или компилил криво. Скомпили прогу и запустил через ollydbg. Так он мне половину кода не дизасемблировал. Причем тот код, который шел после mov eax, dword ptr es:[1ah].
Приложение:
Отправлен: 25.11.2006, 17:17
Вопрос задал: Oxaid (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 3)
Отвечает: IceWolf
Здравствуйте, Oxaid!
1)
Это так называемый упрощенный синтаксис, чтобы получить адрес сегмента существуют предопределённые имена:
data-сегмент данных, @code-понятно, @stack-тож понятно, etc.
Подробней смотрите в приложении.
2)
Насколько я понял, имеются ввиду Win32-программмы(32-битные регистры можно использовать и в 16-разрядных дос-программах и всё будет также) и модели памяти flat. Тогда нет, в защищенном режиме(Win32-приложения) адрес формируется иначе: механизм сложнее, почитать про это можно например на wasm.ru (цикл статей про защищённый режим) или, например, sasm.narod.ru
3)invoke Function, par1, par2, par3, ... <=>
...
push par3
push par2
push par1
call Function
>Как я понимаю, таким образом создается прототипа процедуры.
Правильно понимаете. А нужно это для того, чтобы проверить столько-ли передали параметров, сколько нужно.Т.е.
Function proto :DWORD, :DWORD, :DWORD означает, что нужно передать 3 параметра типа DWORD.
Можно. Если опишите прототип(см выше), и не только из .lib-файла, функция может быть в как самой программе, так и в DLL(нужен .lib-файл), так и в include-файле.
Как самому создавать invoke'абельные функции-смотри туторы Iczelion'a(wasm.ru), там же есть инструкция по создению invoke'абельной DLL'ки.
С сегментными регистрами под Win32 так обращатся нельзя(читай про защищённый режим), скорее всего из-за этогj оля и слгючила.
С уважением, IceW0|f.
Приложение:
--------- Идеальных защит не существует, ибо то, что создано человеческим разумом, им же будет и разрушено!
Ответ отправил: IceWolf (статус: 4-ый класс)
Ответ отправлен: 26.11.2006, 20:50
Вопрос № 64.184
что обозначает
ASSUMECS:CSEG,DS:CSEG,ES:CSEG,SS:CSEG?Где применяеться данная команда?
Отправлен: 25.11.2006, 18:59
Вопрос задал: Metrok (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Вiктор
Здравствуйте, Metrok!
Это значит что сегментные регистры CS,DS,ES,SS будут содержать сегмент CSEG. Обычто такое делается в СОМ-файлах, где все сегменты указывают на один сегмет, в котором расположены и код, и данные, и стек.
(кстати, после ASSUME должен быть пробел: ASSUME CS:CSEG, ....)
Если этого не делать, то в таком случае если в коде будет длинный прыжок (на этот же сегмент), то ассемблер этого не поймёт и выдаст ошибку: jump or call to different CS, а если указать что CS будет содержать CSEG, то таких сообщений возникать не должно.
В ЕХЕ-файлах для каждой цели можно сделать отдельный сегмент, тогда может быть так:
ASSUME CS:Code_SEG, DS:Data_SEG, ES:Data_SEG2, SS:Stack_SEG
--------- ни дня без строчки (но не получается)
Ответ отправил: Вiктор (статус: 9-ый класс)
Ответ отправлен: 25.11.2006, 23:10 Оценка за ответ: 5 Комментарий оценки: Отличный ответ.
Отвечает: Луковкин Николай Иванович
Здравствуйте, Metrok!
ASSUME - это директива, которая определяет назначение сегментов проги сегментным регистрам, т.е. помогает Ассемблеру преоброзовать метки в адреса, сообщая, каким регистром сегмента МЫ будем пользоваться при адресации этих меток.
Если Вы пишите COM-программу на Ассемблере, то в нем присутствует ВСЕГО ОДИН СЕГМЕНТ, назовем мы его CSEG.
Ваш пример:
ASSUME CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG
говорит нам о том, что МЫ указываем Ассемблеру на то, что сегментные регистры CS, DS, ES, SS будут указывать на НАШ ЕДИНСТВЕННЫЙ сегмент - CSEG!
P.S. Думаю где применяется данная команда, ВАМ объяснять не надо: сообразите!
Желаю терпения и удачи в изучении замечательного языка, низкого уровня, но МОЩНОГО -Ассемблера!
Николай
--------- Главным критерием эффективности того или иного пути может служить лишь то, достиг или нет крекер конечного результата!!!
Ответ отправил: Луковкин Николай Иванович (статус: 3-ий класс)
Ответ отправлен: 29.11.2006, 10:20 Оценка за ответ: 5
Вопрос № 64.201
Здравствуйте, уважаемые эксперты. У меня такой вопрос.
Написал резидент, который по CTRL+s - выводит параметры диска,с которого запущена прога, по CTRL+x- выгружается из памяти. Писал используя проги из рассылки Калашникова. Запускал из Windows XP sp2(через FAR) работает(только не выгружается, а параметры диска показывает. Пришел сдавать начал запускать под ДОС - не работает.
Препод сказал, что Windows не пускает в ядро,а эмулирует доступ.Поэтому все работает нормально.А в ДОСе идет прямое обращение.сказал, что у меня что-то неправильно.я посмотрел все - не могу найти ошибку.
Приложение:
Отправлен: 25.11.2006, 21:19
Вопрос задал: JONNY (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: IceWolf
Здравствуйте, JONNY!
Поделюсь своим методом поиска таких ошибок:
1)Пишем вспомогательную программу(см приложение)
2)Запускаем резидент, ещё раз запускаем-отвечает, значит загрузился
3)Правим в резиденте:
MOV AX,CS
MOV DS,AX
IN AL,60H ;Получим скан-код клавиши
CMP CTRL_FLAG,1 ;ЗДЕСЬ
JNE CTRL ;Да -> CTRL
CMP AL,CTRLR_CODE ;Это отпускание CTRL
JE CTRLR ;Да -> CTRLr
CMP AL,AL ;И ЗДЕСЬ
JE VIVOD ;Да -> VIVOD
И ещё:
CTRL:
MOV CTRL_FLAG,1
JMP OLD_09H
Компилируем. Теперь после первого int9(независимо от AL) в CTRL_FLAG будет 1, а после второго-вывод параметров диска. Запускаем int9.com(программа из приложения) 1 раз, ещё 1 -и видим параметры диска.
4)Снова правим оригиналльный код:
IN AL,60H ;Получим скан-код клавиши
CMP CTRL_FLAG,1 ;Это нажатие CTRL
;ЗДЕСЬ ЧАСТЬ КОДА МОЖНО ВЫБРОСИТЬ
CMP AL,AL ;ТАК ЖЕ, КАК В ПРОШЛЫЙ РАЗ
JE REMOVE_JMP ;ТОЛЬКО ТЕПЕРЬ ВЫГРУЖАЕМСЯ
JMP OLD_09H
И ещё:
CTRL:
MOV CTRL_FLAG,1
JMP OLD_09H
Теперь после второго int9 программа должна выгрузится.
Запускаем int9.com 1 раз, второй раз-ответ-"ПРОГРАММА ВЫГРУЖЕНА ИЗ ПАМЯТИ".
Делем вывод-прерывание 9 не разу не вызывается при наборе на клавиатуре, т.е. код который мы меняли получает управление только при вызове int9 из какой-либо программы(как это делали мы). Скорее всего дело в эмуляторе дос ntvdm.exe-он не эмулирует вызов int9 при клавиатурном вводе(у меня(WinXPpro SP2)программа не из под far не из под cmd.exe/command.com не работала, как кстати и все резиденты, перехватывающие 9-ое прерывание).
С уважением, IceW0|f.
Приложение:
--------- Идеальных защит не существует, ибо то, что создано человеческим разумом, им же будет и разрушено!
Ответ отправил: IceWolf (статус: 4-ый класс)
Ответ отправлен: 26.11.2006, 22:27
Вопрос № 64.212
Как удалить файл через функцию 41h прерывания №21h
Если его атрибут только для чтения!
Отвечает: Стас
Здравствуйте, Silinski I.L.!
Сначала снимаешь аттрибут:
mov ah,43h
mov dx,offset f
xor cx,cx
mov al,1
int 21h
затем удаляешь:
mov ah,41h
mov dx,offset f
int 21h
Ответ отправил: Стас (статус: Специалист)
Ответ отправлен: 26.11.2006, 02:36
Отвечает: IceWolf
Здравствуйте, Silinski I.L.!
Нужно снять этот аттрибут:
Функция 43h:
Вход:AH = 43H
DS:DX = адрес строки ASCIIZ с именем файла
AL=Код подфункции:0=извлечь текущий атрибут файла 1=установить атрибут файла
CX= новый атрибут файла (для подфункции 01H)
Выход: AX=код ошибки если CF установлен
CX=текущий атрибут файла (для подфункции 00H)
В атрибуте определены следующие биты:
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │a│d│v│s│h│r║
╙─┴─┴╥┴╥┴╥┴╥┴╥┴╥╜ бит маска
║ ║ ║ ║ ║ ╚═► 0: 1=только чтение (нельзя обновлять или удалять) (01H)
║ ║ ║ ║ ╚═══► 1: 1=спрятанный (02H)
║ ║ ║ ╚═════► 2: 1=системный (04H)
║ ║ ╚═══════► 3: 1=метка тома (08H)
║ ╚═════════► 4: 1=элемент подоглавления (10H)
╚═══════════► 5: архив. 1=копия файла НЕ создавалась (20H)
Работающая программа в приложении.
С уважением, IceW0|f.
Приложение:
--------- Идеальных защит не существует, ибо то, что создано человеческим разумом, им же будет и разрушено!
Ответ отправил: IceWolf (статус: 4-ый класс)
Ответ отправлен: 26.11.2006, 19:29
Отвечает: Брона Вячеслав
Здравствуйте, Silinski I.L.!
Сначала установите файлу атрибут "архивный" в единицу и очистите все остальные.
А потом уже удаляйте.
Ответ отправил: Брона Вячеслав (статус: 1-ый класс)
Ответ отправлен: 27.11.2006, 12:21