• На проекте открылась регистрация только для продавцов. Для обычных пользователей будет открыта позже. Подробнее.
    P.S. Не надо скидывать ссылки на форумы, где у вас ноль сообщений. Подобные заявки будут отклонятся.

ASM Статьи по ASM

ddd

(•̪̀●́)=o/̵͇̿̿/'̿̿ ̿ ̿̿
Команда форума
WebOwner
WebVoice
Статья: Что есть консоль.
Источник:
www.myscript.ru
Консольные программы - что это? О, это для тех, кто любит работать с командной строкой. Самая знаменитая консольная программа - это Far. Но дело ведь не только в любви к текстовому режиму. Часто нет необходимости и времени для создания графического интерфейса, а программа должна что-то делать, например, обрабатывать большие объемы информации. И вот тут на помощь приходят консольные приложения. Ниже Вы увидите, что консольные приложения очень компактны не только в откомпилированном виде, но и в текстовом варианте. Но главное, консольное приложение имеет такие же возможности обращаться к ресурсам Windows посредством API-функций, как и обычное оконное графическое приложение.
И так с чего же начнем. Материала довольно много. Ограничим себе лишь следующими вопросами:
  • Создание консолей.
  • Стандартный ввод-вывод.
  • Параметры командной строки.
Ввод и вывод.
Консольные приложения могут создать свою консоль. В этом случае весь ввод-вывод будет производиться в эту консоль. Если же приложение консоль не создает, то здесь может возникнуть двоякая ситуация: либо наследуется консоль, в которой программа была запущена, либо Windows создает для приложения свою консоль. И вот пример не заставляет себя ждать.
;консольное приложение console1
.386P
;плоская модель
.MODEL FLAT, stdcall
;константы
STD_OUTPUT_HANDLE equ -11
;прототипы внешних процедур
EXTERN GetStdHandle@4:NEAR
EXTERN WriteConsoleA@20:NEAR
EXTERN ExitProcess@4:NEAR
;директивы компоновщику для подключения библиотек
includelib c:masm32libuser32.lib
includelib c:masm32libkernel32.lib
;------------------------------------------------
;сегмент данных
_DATA SEGMENT DWORD PUBLIC USE32 'DATA'
STR1 DB "This a console application!"
LENS DD ? ;количество выведенных символов
RES DD 0
_DATA ENDS
;сегмент кода
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
START:
;получить HANDLE вывода
PUSH STD_OUTPUT_HANDLE
CALL GetStdHandle@4
;вывести строку
PUSH OFFSET RES ;резерв
PUSH OFFSET LENS ;выведено символов
PUSH 27 ;длина строки
PUSH OFFSET STR1 ;адрес строки
PUSH EAX ;HANDLE вывода
CALL WriteConsoleA@20 PUSH 0
CALL ExitProcess@4
_TEXT ENDS
END START
Стало быть начнем разбирать программу подробнее. У начинающего, я думаю, вопросов море. Но попорядку.​
  • В программе использованы три API-функции. Опишем их прототипы.​
HANDLE GetStdHandle(DWORD nStdHandle) - с помощью данной функции можно получить дескриптор стандартного ввода, вывода или устройства вывода сообщений об ошибке. Единственный аргумент функции и указывает, что мы хотим получить. Мы используем константу STD_OUTPUT_HANDLE, т.е. желаем получить дескриптор вывода.​
BOOL WriteConsole(
HANDLE
hConsoleOutput,
CONST VOID*lpBuffer,
DWORD nNumberOfCharsToWrite,
LPDWORD lpNumberOfCharsWritten,
LPVOID lpReserved ) - эта функция выводит на консоль текстовую строку. Первый параметр и есть дескриптор консоли, полученный с помощью предыдущей функции. Второй параметр - указатель на буфер, где содержится выводимый текст. Третий параметр содержит количество выводимых символов. Четвертый указывает на переменную, куда будет помещено количесвто реально выведенных символов. Наконец четвертый параметр это резерв. В документации Microsoft сказано, что данный указатель должен быть равен NULL, т.е. равным нулю. Мы не следуем этому правилу и без всяких при этом последствий. Наконец, заметим, что в случае успешного выполнения функция возвращает не нулевое значение и нулю, если в процессе вывода произошла ошибка. Мы, в своей программе, не проверяем правильность выполнения функции.
VOID ExitProcess(UINT uExitCode) - данная функция корректно заканчивает работу приложения. Единственным ее аргментом является код выхода. Мы как видно из программы полагаем этот код равным нулю.
И так, функции я Вам описал, а теперь снова взгляните на программу и вспомните, что говорилось в предыдущем уроке о порядке помещения параметров в стек («слева на*право - снизу вверх»), о префиксах "A" и "@N". Не правда ли, все понятно?
  • Несколько слов о структуре программы. Текст программы разбит на два сегмента - сегмент данных (_DATA) и сегмент, где содержится код (_TEXT). О смысле такого разделения мы поговорим в будущих уроках. Замечу только для тех, программировал на ассемблере в MS DOS: это не сегменты в DOS'овском понимании.
  • Откомпилируем нашу программу: ML /c /coff console1 / LINK /subsystem:console console1. Находясь в консоли программы FAR запустим полученный исполняемый модуль. Как и ожидалось на экран будет выведена строка "This a console application!". Если запустить данную программу из папки "Мой компьютер", то система сама создаст консоль для данного приложения и, после окончания работы программы, тут же закроет ее. Наше приложение не создает собственной консоли, поэтому при запуске из FAR'а оно наследует чужую.
  • Еще один вопрос - откуда система знает, что данное приложение консольное и для необходимо создавать консоль. Все очень просто: при компоновке мы указываем программе LINK.EXE, что наше приложение будет консольным и она устанавливает в заголовке EXE-файла специальный флаг, на который и ориентируется операционная система при запуске.
  • Вы, естественно, обратили внимание на то, что в нашей программе выводится строка на английском языке. Это сделано не случайно - для вывода строки на русском языке пришлось бы проводить дополнительную перекодировку.
Перейдем теперь, к чтению из консоли. Для начала разберем работу функции чтения.​
BOOL ReadConsole(
HANDLE
hConsoleInput,
LPVOID lpBuffer,
DWORD nNumberOfCharsToRead,
LPDWORD lpNumberOfCharsRead,
LPVOID lpReserved) - функция чтения очень похожа на функцию записи. Первым параметром функции будет дескриптор стандартного ввода консоли. Получить этот дескриптор можно также с помощью функции GetStdHandle, использую как параметр значения STD_INPUT_HANDLE. Второй параметр - это указатель на буфер, куда будет помещен считываемый текст. Третий параметр функции содержит количество считываемых байт (длина буфера). Четвертый параметр есть указатель на двойное слово, куда будет помещено количество фактически считанных байт - это важно, т.к. прекратить ввод строки можно нажав клавишу Enter. Наконец последний параметр зарезервирован для будущих использований.
Ну, что же, а теперь простой пример. Он похож на предыдущий, но в нем появился и ввод.​
;консольное приложение consol2
.386P
;плоская модель
.MODEL FLAT, stdcall
;константы
STD_OUTPUT_HANDLE equ -11
STD_INPUT_HANDLE equ -10
;прототипы внешних процедур
EXTERN GetStdHandle@4:NEAR
EXTERN WriteConsoleA@20:NEAR
EXTERN ReadConsoleA@20:NEAR
EXTERN ExitProcess@4:NEAR
;директивы компоновщику для подключения библиотек
includelib c:masm32libuser32.lib
includelib c:masm32libkernel32.lib
;------------------------------------------------
;сегмент данных
_DATA SEGMENT DWORD PUBLIC USE32 'DATA'
;буфер ввода
BUF DB 100 DUP(?)
LENS DD ? ;количество введенный символов
RES DD ?
H1 DD ?
H2 DD ?
_DATA ENDS
;сегмент кода
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
START:
;получить HANDLE вывода
PUSH STD_OUTPUT_HANDLE
CALL GetStdHandle@4 MOV H1,EAX
;получить HANDLE ввода
PUSH STD_INPUT_HANDLE
CALL GetStdHandle@4 MOV H2,EAX
;ввод информации
PUSH OFFSET RES ;резерв
PUSH OFFSET LENS ;введено символов
PUSH 100 ;длина буфера
PUSH OFFSET BUF ;адрес буфера
PUSH H2 ;HANDLE ввода
CALL ReadConsoleA@20
;вывести строку
PUSH OFFSET RES ;резерв
PUSH OFFSET LENS ;выведено символов
PUSH LENS ;длина строки
PUSH OFFSET BUF ;адрес строки
PUSH H1 ;HANDLE вывода
CALL WriteConsoleA@20 PUSH 0
CALL ExitProcess@4 _TEXT ENDS
END START
Урок наш затянулся, но я хочу рассказать еще и о том, как получать параметры командной строки. Это очень важно, т.к. консольную программу часто запускают с параметрами. Для получения самой командной строки используется функция LPTSTR GetCommandLine(), которая возвращает указатель на стрроку запуска программы. Строка заканчивается нулем, а первым параметром в ней идет полное имя самой запускаемой программы. Ну что же, пора заканчивать, а в качестве упражнения напишите процедуру, для получения параметра командной строки. Предполагается, что параметры отделяются друг от друга прбелами. Процедура получает два параметра: указатель на строку, куда будет помещен параметр и номер параметра, причем параметр с номером 0 это имя запущенной программы. Мы приведем текст процедуры в начале следующего урока.​

_SENDDATEE
 

bug1z

0x04
Взлом компьютерной мышки=))
Вот начал я изучать ассембер и не удержался чтоб не написать какую то программу шутку:).Эта программа не повредит компьютеру, а только изменит расположение кнопок мыши и напугает ламера:)).
Что нам потребуется:
1)Компилятор masm32 или tasm, разница в синтаксисе минимальна но советую взять masm32, потому что объяснять я буду именно по нему.
2)Любой текстовый редактор.
3)Прямые руки и голова на плечах.
Первые строки.
Код:
.386 
.el flat,stdcall 
option casemap:none 
include C:\masm32\INCLUDE\WINDOWS.INC 
include C:\masm32\INCLUDE\KERNEL32.INC 
include C:\masm32\INCLUDE\USER32.INC 
include C:\masm32\INCLUDE\ADVAPI32.INC 
includelib C:\masm32\lib\comctl32.lib 
includelib C:\masm32\lib\user32.lib 
includelib C:\masm32\lib\gdi32.lib 
includelib C:\masm32\lib\kernel32.lib 
includelib C:\masm32\lib\user32.lib 
includelib C:\masm32\lib\advapi32.lib
Разберемся в вышенаписаном:
.386-этой строкой мы говорим нашему компиятору, что намеpеваемся использовать набоp инстpукций пpоцессоpа 80386. .Model flat, stdcall говоpит MASM'у, что наша пpогpамма будет использовать плоскую модель памяти.
Далее мы подгружаем инклудники и библиотеки.
.data
В области дaнных у нас будет 2 строки:
Код:
HINST DWORD 0
Код:
strHack db "I hacked you mouse!",0
Они выведут текст "I hacked you mouse!"
.CODE
В области кода мы имеем:
Код:
start: 
invoke SwapMouseButton,1 
invoke MessageBox, 0 , addr strHack, addr strHack , 0 
exit: 
invoke ExitProcess , 0
Давайте разберем все по полочкам.
start:– указывает на начало исполняемого кода.
invoke SwapMouseButton,0– прикрепляем API функцию SwapMouseButton с параметром 1(Эта функция и меняет кнопки мыши местами).
invoke MessageBox, 0 , addr strHack, addr strHack , 0 – эта API функция выводит окно с сообщением.
addr strHack указывает на текст сообщения который мы указали выше.
exit: - указывает на код завершения программы.
invoke ExitProcess , 0 – завершение программы после нажатия кнопки ok.
Ну и самая последняя строка- это end start – она указывает на конец участка кода.
Вот мы и закончили с программной частью.
Компиляция.
Для компиляции нашей программы мы напишем 2 простеньких батника, что бы не мучатся каждый раз вбивая комманду в консоли...
Первый батник:
Код:
@ echo ----OBJ---- 
@ c:\masm32\bin\ml.exe /coff /c .\ISHODNIC\mouse.asm
Его и запускаем первым.
Второй:
Код:
@ echo ----EXE---- 
@ if EXIST pirat.obj c:\masm32\bin\link.exe /SUBSYSTEM:WINDOWS .\mouse.obj
Если в написание кода вы не допустили ошибок,то программа скомпилится удачно.Можети идти разводить ламеров=))
Теперь давайте разберемся как от этого избавится.
А это предельно просто:
Замените параметр SwapMouseButton с 1 на 0 и всё.
Вот мы и написали простинький «Вирус» и «Антивирус».
Полный текст программы:
Код:
.386 
.el flat,stdcall 
option casemap:nonе 
include C:\masm32\INCLUDE\WINDOWS.INC 
include C:\masm32\INCLUDE\KERNEL32.INC 
include C:\masm32\INCLUDE\USER32.INC 
include C:\masm32\INCLUDE\ADVAPI32.INC 
includelib C:\masm32\lib\comctl32.lib 
includelib C:\masm32\lib\user32.lib 
includelib C:\masm32\lib\gdi32.lib 
includelib C:\masm32\lib\kernel32.lib 
includelib C:\masm32\lib\user32.lib 
includelib C:\masm32\lib\advapi32.lib 
.data 
HINST DWORD 0 
strHack db "I hacked you mouse!",0 
.code 
start: 
invoke SwapMouseButton,0 
invoke MessageBox, 0 , addr strHack, addr strHack , 0 
exit: 
invoke ExitProcess , 0 
end start
Ну вот и всё!
С вами был bug1z (aka m0rgan).
Удачи во всех начинаниях!
P.S.:Статейка расчитана на (!!!)новичков в асме...
 
Z

zOOm

Гость
оО А че эт форум фильтрует "МОД"? (только на латинском)

Добавлено через 4 часа 26 минут 23 секунды
И еще чуть просмотрев гугл, нашел точно таких же тем... слово в слово, даже усомнился, что это ты автор, а если ты не автор, то убирай подобные строки Вот начал я изучать ассембер и не удержался чтоб не написать какую то программу шутку.Эта программа не повредит компьютеру, а только изменит расположение кнопок мыши и напугает ламера).
и вообще в этой программе много всего лишнего, и вот я её чуть минимализировал:
Код:
.386
.el flat,stdcall
option casemap: none
include \masm32\include\kernel32.inc  
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
.data 
strHack db "I hacked you mouse!",0 
.code 
start: 
invoke SwapMouseButton,0
invoke MessageBox, 0 , addr strHack, addr strHack , 0 
invoke ExitProcess , 0 
end start

И вообще я немогу понять откуда вы столько инклудников взяли Оо?
и что это за строки HINST DWORD 0
exit: Зачем тут он вообще нужен? если программа линейная?
 
Последнее редактирование модератором:
Сверху