Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 8 мая!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Программисты долго мучаются с кодом прогаммы, изучают С++, WinAPI функции, MSDN. Потом пишут банальную систему защиты или навешивают банальный протектор, а крэкеры и реверсеры справляются с такой защитой за 5 минут. В итоге, продажи программы почти нулевые. Чтобы такого не допустить, тут самому надо немного поднабрать опыта отладки, реверсинга, тот же отладчик Ollydbg изучить или дизассемблер IDA Pro. Но где искать по крохам эти знания? Нет, конечно можно годами "методом тыка" разбираться, но куда быстрее видеокурс специальный посмотреть. Вот тут он есть: ссылка. Автор курса с большим опытом и объясняет понятно, я из этого курса много узнал про то как работает компьютер, процессор, про инструменты специальные и как с ними работать. Мои коллеги программисты на работе ничего такого и не знают, теперь я им нос утру.

__emit__

 
 Функция            Вставляет значение литерала непосредственно в код.
 
 
 
 Синтаксис          #include<dos.h>
 
                    void __emit__(argument,...);
 
 
 
 Файл, содержащий   dos.h
 
 прототип
 
 
 
 Описание           Функция __emit__  позволяет  вам  вставить значение
 
                    литерала непосредственно в объектный код,  как если
 
                    бы  он  был  откомпилирован.  Она  используется для
 
                    генерирования машинных инструкций без использования
 
                    встроенных операторов ассемблера.
 
 
 
                    Обычно аргументы  __emit__  представляют  из   себя
 
                    однобайтовые  машинные команды.  Однако возможности
 
                    данной  функции  позволяют  строить  более  сложные
 
                    команды, вплоть до ссылок на переменные С.
 
 
 
                    Предупреждение! Этой функцией могут воспользоваться
 
                    только  программисты,  хорошо   ориентирующиеся   в
 
                    машинном  языке  процессоров  семейства  80х86.  Вы
 
                    можете использовать данную  функцию  для  помещения
 
                    произвольных  байтов  в машинный код функции.  Если
 
                    эти  байты  будут  неправильными,  то   это   может
 
                    привести к  неисправимой  ошибке.  Borland  C++  не
 
                    анализирует код, помещаемый таким образом. Если эти
 
                    машинные  команды  изменяют  значение регистров или
 
                    переменных,  то Borland C++ не знает об этом  и  не
 
                    сохраняет их перед использованием данного кода, как
 
                    он делает это при работе со встроенным ассемблером,
 
                    где    он,   например,   распознает   использование
 
                    регистров SI и DI  и  сохраняет  их.  Здесь  же  вы
 
                    предоставлены сами себе.
 
 
 
                    Вы должны  передать  __emit__  по  меньшей  мере  1
 
                    аргумент;  реальное  число   может   быть   больше.
 
                    Аргументы этой функции рассматриваются не так,  как
 
                    других  функций:  никаких  преобразований  они   не
 
                    претерпевают.
 
 
 
                    Имеется специальное  ограничение  формы  аргументов
 
                    __emit__.  Они  должны  иметь   форму   константных
 
                    выражений, т.е.  чтобы  их  можно было использовать
 
                    для   инициализации   статических   объектов.   Это
 
                    означает, что в выражениях можно использовать целые
 
                    константы,  константы с плавающей точкой  и  адреса
 
                    статических объектов. Значение записывается в точке
 
                    вызова функции также, как если они используются для
 
                    инициализации   данных.  Можно  также  использовать
 
                    адреса параметров и автоматических переменных, плюс
 
                    или минус константное смещение. Для этих аргументов
 
                    запоминается смещение переменной в BP.
 
 
 
                    Количество байт,  помещаемых   в   объектный   код,
 
                    определяется   типом   аргумента,   за  исключением
 
                    следующих случаев:
 
 
 
                    - знаковая целая константа (например 0х90) значение
 
                      которой   лежит   в   диапазоне   от   0  до  255
 
                      рассматривается как символ.
 
 
 
                    - Когда    используется    адрес     автоматической
 
                      переменной   или   параметра,  то  если  смещение
 
                      переменной в BP лежит в диапазоне от -128 до  127
 
                      то записывается байт, иначе слово.
 
 
 
                    Просто байты записываются следующим образом:
 
 
 
                    __emit__(0x90);
 
 
 
                    Если вы хотите записать слово,  однако его значение
 
                    меньше 255, то просто преобразуйте его в unsigned:
 
 
 
                    __emit__(0xB8,(unsigned)17);
 
 
 
                    или
 
 
 
                    __emit__(0xB8, 17u);
 
 
 
                    Двух- или  четырехбайтовые   адреса   можно   прямо
 
                    указать с помощью типов:  void near * и void far *,
 
                    соответственно.
 
 
 
 Возвращаемое       Нет.
 
 значение
 
 
 
 Переносимость      __emit__ уникальна для семейства машин 80х86.
 
 
 
 Пример:
 
 
 
 #include<dos.h>
 
 
 
 int main()
 
 {
 
    /* вставить код, который генерирует печать экрана, через
 
       прерывание int 5 */
 
    __emit__(0xcd,0x05);  /* INT 05h */
 
    return 0;
 
 }

<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS