Linux: как проверить в скрипте, пингуется ли адрес.

Оказалось все очень просто.

ping <ip|url> -c <packets_count>

где:
<ip|url> — IP или URL адрес
ip — IP-адрес (например 8.8.8.8 или 192.168.0.1)
url — URL-адрес (например google.com)
<packets_count> — количество отправленных пакетов

В следующем примере мы пингуем google.com:

ping google.com -c 3

Вывод команды приводить не буду для экономии места, кому нужно, смотрите на PasteBin

Можно пропинговать и по IP, например, локальный роутер:

ping 192.168.0.1 -c 3

Вывод, опять же на PasteBin

Внимание! Количество отправленных пакетов (-с <число>), если вы используете ping в скрипте bash нужно указать обязательно, иначе команда ping никогда не прекратит свою работу и завесит скрипт, в отличии от команды ping в Windows (она по умолчанию посылает 5 пакетов и прекращает работу).

Коды возврата ping

Естественно, для анализа работы ping в скрипте, нам потребуются коды возврата.

К сожалению, в официальном man для команды ping их, почему-то забыли указать.

0 — Success (хоть один из пакетов дошел до адреса)
1 — No reply (не один из пакетов до пингуемого адреса не дошел)
2 — Other error (другая ошибка, в большинстве случаев — «сеть недоступна»).

На всякий случай

Если произошла ошибка с кодом 2, то команда ping выводит на stderr сообщение об ошибке, например:

ping 8.8.8.8 -c 3
connect: Network is unreachable

Отключение вывода

ping является полуинтерактивной командой, и показывает параметры отправленных пакетов (см. на PasteBin), если это не нужно, можно отключить вывод стандартным способом, перенаправив вывод команды ping из stdin и stderr в /dev/null, например:

ping 8.8.8.8 -c 3 >/dev/null 2>/dev/null

где:
>/dev/null — перенаправление stdin в нуль-устройство
2>/dev/null — перенаправление stderr в нуль-устройство

Пример

Простейшее использование команды ping в скрипте:

#!/bin/bash

#testping
# $1 - IP or URL address

ping $1 -c 3 >/dev/null 2>/dev/null
if [ $? -eq 0 ]; then
    echo "Pinging!"
else
    echo "Not pinging!"
fi

Копия на PasteBin

Проверка

smallwolfie@wolfschanze:~/nettest$ ./testping 8.8.8.8
Pinging!
smallwolfie@wolfschanze:~/nettest$ ./testping 666.666.666.666
Not pinging!
smallwolfie@wolfschanze:~/nettest$ ./testping 192.168.0.55
Not pinging!
smallwolfie@wolfschanze:~/nettest$ ./testping example.org
Pinging!

Цветной текст в консоли Linux #3. Улучшаем совместимость скрипта.

Преамбула

Друзья [info]ketmar@ljr и [info]grusha@ljr отправили мне несколько ценных замечаний по поводу покраски консоли из скрипта (копия). Решил про них здесь отдельно написать, и модифицировать скрипт

Замечание #1, попадание ESC-последовательностей в поток, при вызове скрипта в потоке

Решил начать с него, оно более важное.
Впрочем, отдельно ему посвятил маленькую заметку (копия), где описал проблему и ее решение, так что осталось только применить, оборачиваю основной код функции echoc() в if, осушествляющий проверку, вызвали ли скрипт в терминале или в потоке:

if [ -t 1 ];then
	E__="\x1b[${FGROUND[$2]}m"
	if [ -n "$3" ];then
		E__="$E__\x1b[${BGROUND[$3]}m"
	fi

	if [ -n "$4" ];then
		E__="$E__\x1b[$4""m"
	fi

	echo -e "$E__$1\x1b[0m"

else
	echo "$1"
fi

Если не в терминале, просто выводим обычный текст без ESC-кодов:

В функции echocn() поступаем аналогично, просто к вызову echo не забываем добавить пареметр -n:

if [ -t 1 ];then	
	...
	echo -e -n "$E__$1\x1b[0m"

else
	echo -n "$1"
fi

Замечание #2. Совместимость цветов.

коды для яркости не входят в общепринятый стандарт VT-100, это расширение, и поддерживается далеко не всеми. один из стандартных способов увеличить яркость — включить полужирный режим: «\e[1;32m». да, это не работает для фона, стандартного метода для фона нет..

Т.е. максимально совместимыми цветами с терминалом являются только первые 7: коды 30..37 для текста, 40..47 для фона, дефолтные коды 39 и 49 для текста и фона соответственно (см. таблицу из предыдущей заметки (копия)).

Коды для яркости текста (90..97) и фона (100..107) расширение стандарта и поддерживаются не всеми терминалами. Для текста есть способ увеличить яркость — включить полужирный режим: семь цветов плюс полужирный с расчётом на то, что это давно уже яркость текста.

Совместимые цвета и стили

Итого, получаем вот такую таблицу совместимых цветов:

# Название цвета Код цвета текста Код цвета фона
0 Default (По умолчанию) 39 49
1 Black (Черный) 30 40
2 DarkRed (Темно-красный) 31 41
3 DarkGreen (Зеленый) 32 42
4 DarkYellow (Темно-желтый) 33 43
5 DarkBlue (Синий) 34 44
6 DarkMagenta (Темно-фиолетовый) 35 45
7 DarkCyan (Темный аквамарин) 36 46
8 Gray (Серый) 37 47
9 DarkGray (Темно-серый) 1;30
10 Red (Красный) 1;31
11 Green (Ярко-зеленый) 1;32
12 Yellow (Желтый) 1;33
13 Blue (Голубой) 1;34
14 Magenta (Фиолетовый) 1;35
15 Cyan (Аквамарин) 1;36
16 White (Белый) 1;37

Код сброса: \x1b[0m — сбрасывает настройки консоли (цвет текста, фона и стиль) к значению по умолчанию. Он работает нормально.

Заодно уж выбросил из таблицы стилей «мигающий» и «невидимый», которые объективно не работают:

Код стиля Стиль текста
0 Default (По умолчанию)
1 Bold (Жирный/яркость текста)
4 Understrike (Подчеркнутый)
7 Inversing (Инверсия), цвет фона и текста меняются местами

Модифицируем скрипт

Массивы с кодами цветов теперь выглядят так (массив с именами показан для лучшего понимания):

NAMES=(Default Black DarkRed DarkGreen DarkYellow DarkBlue DarkMagenta DarkCyan Gray DarkGray Red Green Yellow Blue Magenta Cyan White)
FGROUND=("39" "30" "31" "32" "33" "34" "35" "36" "37" "1;30" "1;31" "1;32" "1;33" "1;34" "1;35" "1;36" "1;37")
BGROUND=(49 40 41 42 43 44 45 46 47)

И подправляем вывод:

echo -e "Foreground color:\tBackground color:"

for N in {0..16}; do
    if [ $N -eq 1 ];then #foreground
	echocn "$N - ${NAMES[$N]}" $N 4
    else
	echocn "$N - ${NAMES[$N]}" $N
    fi
    echo -e -n "\t\t"
    
    if [ $N -le 8 ];then
	if [ $N -gt 1 ];then
	    echoc " ${NAMES[$N]} " 1 $N #background
	else
	    echoc " ${NAMES[$N]} " 0 $N
	fi
    else
	echo
    fi
done
echo
echocn "Default" 0 0 0; echo -n " "
echocn "Bold" 0 0 1; echo -n " "
echocn "Understrike" 0 0 4; echo -n " "
echocn "Inversing" 0 0 7; echo -n " "
echo
echo

Что получилось

Вывод в терминал:

Вывод в файл:

./esccolorscomp >test.txt

Замечание #3. Об использовании tput

Я задал вопрос, а не проще ли вместо ESC-кодов использовать tput, о чем я уже писал (копия). Ответ был таким: Он требует установленого ncurses, в общем и целом — никто не гарантирует его наличия.

Готовый скрипт

На GitHub

Электронная книга Dexp M8 Prudentia, драйвера для Windows 7.

Немала баба клопоту, купила порося, в смысле немал клопоту я, но повелся на скидку и связался с дерьмоконторой DNS и ее клоном DEXP. Прошлая книжка у меня была Амазон Киндл, и я ее еще в Киеве купил, впрочем, так бы ей и пользовался, если бы на нее жопой не села бухгалтерша. Напрягать тетку не стал, выбрал чего подешевле. Естественно, задача была перекинуть книжки с той на эту, и если эту у меня винда прекрасно видела, то видеть эту наотрез отказалась.

На сайте говно-DNS, дерьмо-DEXP и в сраной инструкции естественно, «это ж хуй, я вопрос отгадала», т.е. не драйверов, ни того, где их искать. Т.е контора просто пиздец клиентоориентированная. Кроме флешек вообще лучше ничего у них не покупать. Правда, кнопочные телефоны DEXP еще хорошие, у правильного дядюшки Ляо заказывают, кирпич неубиваемый от слова «даже об голову Кивы».

Пришлось для простейшего подключения андроидной железяки включать мозг и заниматься детективным расследованием, правда, довольно простым.

Железка под Андроидом 8.1 и на чипе Rockchip PX30, так что подошли драйвера Rockchip 4.4

На всякий случай забэкапил

Rockchip Driver Assitant v4.4 на Mega.NZ (10 Mb, RAR)

Как проверить, вызван ли скрипт из терминала, или вывод скрипта перенаправлен в поток.

Как проверить, вызван ли скрипт из терминала, или вывод скрипта перенаправлен в поток.

Преамбула

А зачем? Это логическое продолжение темы (копия) про покраску текста в терминале. Если использовать ESC-последовательности, то они, что логично, попадут в файл, если пользователь перенаправит туда вывод скрипта, и получится бяка:

Потому, надо проверить, вызвали ли скрипт из терминала, или вывод скрипта перенаправлен в поток.

Решение

По итогам обсуждения с [info]ketmar@ljr и [info]grusha@ljr решение нашлось:

if [ -t 1 ];then
    echo -e "\x1b[32;1mRun in terminal\x1b[0m"
else
    echo "Run in pipe"
fi

Проверка

Вызов из терминала:
./testpipe
Run in terminal

Вызов в потоке:
./testpipe >test.txt

Содержимое файла test.txt:
Run in pipe

Тестовый скрипт

на GitHub

Цветной текст в консоли #2

Преамбула

Мы уже красили консоль при помощи tput (копия), но есть лучший способ, при помощи эскейп-последовательностей, там немного сложнее и запутаннее синтаксис, но зато нормальная поддержка 16 цветов и стилей.

ESC-последовательности

ESC-последовательность это код, который вставляется в вызов команды echo или printf перед, после или прямо посреди текста, который мы собираемся выводить.

Синтаксис кода такой: \x1b[???m, где вместо ??? надо вставить код цвета текста, фона или стиля текста. Коды можно перечислять через точку с запятой: \x1b[???;???;???m или несколько кодов подряд: \x1b[???m\x1b[???m\x1b[???m. 1b — это код символа ASCII 27, который соответствует коду клавиши ESC (откуда и название).

Коды цвета и фона

# Название цвета Код цвета текста Код цвета фона
0 Default (По умолчанию) 39 49
1 Black (Черный) 30 40
2 DarkRed (Темно-красный) 31 41
3 DarkGreen (Зеленый) 32 42
4 DarkYellow (Темно-желтый) 33 43
5 DarkBlue (Синий) 34 44
6 DarkMagenta (Темно-фиолетовый) 35 45
7 DarkCyan (Темный аквамарин) 36 46
8 Gray (Серый) 37 47
9 DarkGray (Темно-серый) 90 100
10 Red (Красный) 91 101
11 Green (Ярко-зеленый) 92 102
12 Yellow (Желтый) 93 103
13 Blue (Голубой) 94 104
14 Magenta (Фиолетовый) 95 105
15 Cyan (Аквамарин) 96 106
16 White (Белый) 97 107

Код сброса: \x1b[0m — сбрасывает настройки консоли (цвет текста, фона и стиль) к значению по умолчанию.

Коды стиля текста

Код стиля Стиль текста
0 Default (По умолчанию)
1 Bold (Жирный)
4 Understrike (Подчернкутый)
5 Blinking (Мигающий), не работает, получается серый текст на темно-сером фоне
7 Inversing (Инверсия), цвет фона и текста меняются местами
8 Invisible (Невидимый), не работает

Тестовый скрипт

1. Проще всего покласть названия цветов, а также коды цвета и фона в массивы:

NAMES=(Default Black DarkRed DarkGreen DarkYellow DarkBlue DarkMagenta DarkCyan Gray DarkGray Red Green Yellow Blue Magenta Cyan White)
FGROUND=(39 30 31 32 33 34 35 36 37 90 91 92 93 94 95 96 97)
BGROUND=(49 40 41 42 43 44 45 46 47 100 101 102 103 104 105 106 107)

2. Создадим функцию echoc(), принимающую три параметра, цвет текста, цвет фона и стиль:

echoc() #Text, color, background, attributes
{
    ...
         Тут будет код
    ...
}

Внутри функции:

if [ -z "$2" ];then
	echo "$1" 
	return 
fi

Если второго параметра нет, просто вызываем echo и выходим из функции.

E__="\x1b[${FGROUND[$2]}m"

Второй параметр, номер кода цвета текста в массиве, формируем ESC-последовательность с ним во временную переменную.

if [ -n "$3" ];then
	E__="$E__\x1b[${BGROUND[$3]}m"
fi

Если есть третий параметр — добавляем ESC-последовательность для цвета фона.

if [ -n "$4" ];then
	E__="$E__\x1b[$4""m"
fi

Если есть четвертый — добавляем код для стиля текста (1, 4, 5, 7, 8), см. таблицу выше.

echo -e "$E__$1\x1b[0m"

Выводим текст:

-e — параметр, позволяющий команде echo обрабатывать ESC-последовательности.
$E__ — переменная, в которой сформирована ESC-последовательность.
$1 — выводимый текст.
\x1b[0m — после текста вставляем код сброса.

3. Создаем функцию echocn(), которая от функции echoc() отличается одной строчкой:

echo -e -n "$E__$1\x1b[0m"

где -n — вывести текст без перевода строки

4. Выводим в цикле названия цветов, и примеры цвета и фона:

echo -e "Foreground color:\tBackground color:"

for N in {0..16}; do
    if [ $N -eq 1 ];then #foreground
	echocn "$N - ${NAMES[$N]}" $N "16"
    else
	echocn "$N - ${NAMES[$N]}" $N
    fi
    echo -e -n "\t\t\t"
    
    if [ $N -gt 1 ];then
	echoc " ${NAMES[$N]} " 1 $N #background
    else
	echoc " ${NAMES[$N]} " 0 $N
    fi
done

5. И тестируем стили:

echo
echocn "Bold" 0 0 1; echo -n " "
echocn "Understrike" 0 0 4; echo -n " "
echocn "Blinking" 0 0 5; echo -n " "
echocn "Inversing" 0 0 7; echo -n " "
echocn "Invisible" 0 0 8; echo -n " "
echo
echo

Результат — в скрине в начале поста

Готовый скрипт

На GitHub

По мотивам

Как изменить цвет текста в терминале Linux

Отключение проверки сертификатов в curl

Преамбула

При использовании скрипта 0x0.sh, из предыдущего поста (копия), внезапно напоролся на ошибку curl: (60) SSL certificate problem: certificate has expired.

Грешным делом подумал, что у меня в системе протухли корневые сертификаты, поскольку слаку я триста лет не обновлял, уже лет 5 без переустановки стоит, даже пошел, и нашел как их вроде бы стандартным способом обновить. Недопомогло. Потом думаю, если бы сертификаты все совсем были старые и просроченные, у меня бы ничего не работало, ни curl, ни wget, ни браузеры, ни ютупчик. А тут вроде как всего один сайтик, что-то тут не то, или я не так делаю, или на сайте косяк. Неделю проебавшись, пошел спросил у более знающего юзера [info]ketmar@ljr. Да отключи ты их к лешему, или опциями командной строки, или на уровне конфига, ответил он.

Отключение проверки сертификатов в curl на уровне пользовательского конфига.

curl, перед проверкой параметров командной строки, заглядывает в свой конфиг в каталоге пользователя, так что в нем можно установить локальные (относительно пользователя) параметры по умолчанию. Нас интересует опция отключения проверки сертификатов.

1. Заходим в свой домашний каталог (/users/<ваше_имя пользователя>/)
2. Создаем файл .curlrc
3. Прописываем в нем одну строчку: insecure

Отключение проверки сертификатов в curl в скрипте

Достаточно добавить параметр -k или --insecure до параметров -F "file=@<имя файла>", если вы curl‘ом что-то отправляете, или до адреса URL, если вы curl‘ом что-то получаете.

Например, я модифицировал код скрипта 0x0.sh:

Было:
...
url=$(curl ${curl_opts} -F "file=@${file}" "${host}")
...

Стало:
...
url=$(curl ${curl_opts} --insecure -F "file=@${file}" "${host}")
...

Было:
...
shortened=$(curl ${curl_opts} -F "shorten=${url}" "${host}")
...

Стало:
...
shortened=$(curl ${curl_opts} --insecure -F "shorten=${url}" "${host}")
...

Было:
...
uploaded=$(curl ${curl_opts} -F "url=${url}" "${host}")
...

Стало:
...
uploaded=$(curl ${curl_opts} --insecure -F "url=${url}" "${host}")
...

Заработало!

smallwolfie@wolfshanze:/tmp# 0x0.sh -f 332068.jpg
uploading "332068.jpg"...
######################################################################## 100.0%
https://0x0.st/o4_0.jpg

Котик

Конечно же котролирующий передачу, развертку по горизонтали и вертикали, и держащий под котролем изображение и звук.

Ну и пропатченный скрипт

На GitHub

Скрипт для постинга на файл-хостинг 0x0.st

Есть прикольный файл-хостинг 0x0.st, но постить на него можно только скриптом. Мопед не мой, просто оставлю его здесь.

На GitHub

Copyright 2016-2018 Kylie McClain <kylie@somas.is>

Краткая справка по использованию скрипта

Использование: 0x0.sh [-f <file>] [-s <url>] [-u <url>] [file]
Если файл не указан, скрипт загружает поток stdin

-f <file> - загрузить <файл>
-s <url> - шортинг адреса <url> (В настоящее время не поддерживается сервисом!)
-u <url> - загрузка содержимого по адресу <url>

Цветной текст в консоли Linux #1

Преамбула

Захотел я как-то украсить скрипт, ну чтоб он не был таким скучным, и подумал — в DOS можно было красить консоль, а можно ли в Linux? Можно!

Красим с помощью tput

tput — команда, в основном предназначающаяся для управления консольным курсором, но покрасить она тоже может, хоть и довольно хреново.

Общий синтаксис:

tput <команда> <параметры>

В нашем случае, интересуют команды, изменяющие цвет или стиль текста.

Для удобства сведу их в таблицу:

Команда tput Действие
bold Жирный текст, после вызова команды
smul Начало подчеркнутого текста
rmul Конец подчеркнутого текста
rev Реверс текста и фона, т.е. они меняются местами
blink Мигающий текст (не на одной консоли не сработал)
invis Невидимый текст (у меня не сработало)
smso Некий «выдающийся» (standout) режим, отличий при выводе не заметил
rmso Отключить «выдающийся» режим
setaf <код_цвета> Установить цвет текста
setab <код_цвета> Установить цвет фона
sgr0 Сбросить настройки терминала к значениям по умолчанию.

Коды цвета

tput, на самом деле, плох для окраски текста консоли, но зато хорош в синтаксисе. Не надо сочинять дополнительных функций для ESC-последовательностей (о них в следующей заметке), но он поддерживает только 7 основных цветов, а на некоторых консолях не срабатывает и белый цвет. Вот таблица цветов для текста и фона (значения одинаковые и для того, и для другого):

Код цвета Цвет
0 Черный (Black)
1 Красный (Red)
2 Зеленый (Green)
3 Желтый (Yellow)
4 Голубой (Blue)
5 Фиолетовый (Magenta)
6 Светло-голубой (Cyan)
7 Белый (White), у меня почему-то не сработал.
8 Не используется
9 Возврат к цвету по умолчанию

Как использовать

Я написал тестовый скрипт, где последовательно перебираю цвета текста и цвета фона:

tput setaf <код_цвета>, для текста
tput setab <код_цвета>, для фона
потом echo -n "некий текст", где некий текст — наименование цветов в массиве, см. исходник.

А потом вызываю tput sgr0, чтобы сбросить консоль.

Стили текста:

echo "Text style:"
tput bold; echo "Bold"; tput sgr0
tput smul; echo "Underlined"; tput rmul
tput rev; echo "Reversed"; tput sgr0
tput blink; echo "Blinking"; tput sgr0
tput invis; echo "Invisible"; tput sgr0
tput smso; echo "Standout"; tput rmso

tput sgr0

Что получилось

Исходник на GitHub

Смотреть здесь

Источник

tput, на буржуйском. Копия в PDF

Утечки DNS, что это такое, как справиться, как проверить, чем грозит.

Преамбула

Крошка юзер пришел к админу, и спросила кроха — VPN себе купил, все равно, бля банят.
Практически реальная история одного юзера, т.е. он купил себе малоизвестный, потому и неизвестный роскомкозлам VPN, пошел почитать kasparov.ru, а получил вот это:

Стали разбираться, VPN абсолютно не российский, сделанный двумя бразильскими рэперами-анархистами, логов не ведет, не является сторонним сервисом, поставляющим чужие услуги, просто пропуская трафик через себя, русских нод выхода нет. Значит, утечка DNS, т.е. VPN-провайдер позволяет использовать другие (кроме локального для провайдера VPN) DNS, а у провайдера прописан глобальный DNS-сервер. У Говнотелекома именно так.

Что такое DNS, объясняю по рабоче-крестьянски.

DNS расшифровывается как Сервер доменных имен. Один хрен, непонятно. Если совсем просто — это телефонный справочник. Или справочная служба. Например, вам хочется позвонить Вербицкому Михаилу Сергеевичу в Москве по такому-то адресу, но номера вы не знаете. Звоните в справочную службу 018, и вам говорят номер.

Сейчас, конечно, нет телефонных служб и телефонных справочников, но представьте себе свой мобильник, мама у вас записана, как «Мамочка», жена, как «Любимка», брат, как «Саня Мелкий», а любовница, как «Иван Михалыч», а рядом с их именем отображается номер телефона.

Интернет изначально не предполагал, что вообще будут какие-то имена сайтов, типа google.com (и вообще он выйдет за границы военного ведомства США), и компьютеры получали IP-адреса, состоящие из цифр с точкой, например google.com имеет IP-адрес 142.251.36.14

Когда интернеты таки вылезли за границы DARPA и стали гражданской технологией, всем стало понятно, что юзверю неудобно набирать кучу цифири в адресной строке, т.е. 142.251.36.14 вместо google.com умные люди придумали систему DNS, т.е. браузер сначала обращается к специальному серверу, который сопоставляет имя сайта, например, того же google.com с его IP-адресом, и все должно заверте…

Дыры в DNS

Минус системы DNS в том, что запросы к DNS изначально не шифруются, соответственно, перехватить запрос и узнать, к какому сайту вы обращаетесь, или даже подменить запрос, и перенаправить на фишинговый сайт может любой, кто знает ваш IP и адрес DNS-сервера. Вторым способом, кстати, провайдеры осуществляли блокировку доступа к забаненным говнокомнадзором сайтам, ну и сейчас, как видите, осуществляют.

Потом, конечно, фатальный недостаток постарались исправить, навешав на старый протокол DNSSEC, который тоже всей беды не решает, DOH или DoT, но один черт, не все сервера поддерживают новые расширения протокола, так что до конца эта беда по-прежнему не решена.

Проверка на утечки DNS (DNS-leaks)

Существует множество онлайн-сервисов, проверяющих утечки DNS, их реально очень много, практически у каждого крупного VPN-провайдера такой есть, есть и не у VPN-провайдеров, а сами по себе. Один из самых популярных https://www.dnsleaktest.com/

Включаете JavaScript в браузере (если выключен) и нажимаете кнопку Extended Test:

Вот, что у меня получилось:

Утекает, но на Запад, что хотя бы не так страшно.

Пробуем другой сервис, например, берем самый первый из запроса «тест утечки DNS», у меня это https://whoer.net/ru/dns-leak-test.

Как и выше, тестирую на офисной машине в своем офисе:

Иерархия запросов DNS

Звучит страшно, но на самом деле все просто, DNS-запрос сначала обрабатывает ОС, установленная на данном компьютере, а потом, все вышеследующие системы по соединению.

Например, представим ситуацию:

1. У вас есть локальный компьютер в квартире.
2. В квартире есть роутер или даже домашний сервер.
3. На сервере подключен VPN-провайдер.

При запросе к сайту (любому), система сначала будет обращаться к локальным (т.е. компьютера) настройкам DNS, если доступ есть, то DNS-запрос будет отправлен на тот адрес, который будет указан в настройках. Если локальные настройки DNS не указаны прямо или не получаются автоматически, то система обратится к соединению с сервером/роутером, и получит настройки от него. Аналогично и сам сервер/роутер — он обратится к DNS-серверу нужного провайдера, конечно, если все настроено правильно.

Соответственно, большинство утечек решаются правильной настройкой DNS на нужных устройствах, на крайний случай, обращением к провайдеру услуг. Если добросовестный, то поправит.

Стандартные варианты конфигурации DNS и шлюза в Windows 7

Можно посмотреть в графическом интерфейсе, и схонфигурировать нужную конфигурацию для Windows 7.

Нужно зайти в Сеть и Интернет —> Сетевые подключения а потом найти основной адаптер, а потом протокол IPv4, и посмотреть как настроено (открыть пункт Протокол Интернета версии 4), теперь нажимаем Свойства и смотрим:

Ага, тут DNS выбирается автоматически.

А вот, как сделано на рабочей машине:

Т.е на иллюстрации видно, что DNS и шлюз не прописаны. Такая конфигурация используется для локального (корпоративного) VPN, где сервер доступен вам из локальной сети, а рабочая станция вообще не может обратиться к Интернету, если соединение с VPN «упадет».

Есть и третий вариант конфигурации — оставляем основной шлюз, например, основного провайдера, но DNS не прописываем. Не самый безопасный вариант, но используется, если VPN-провайдер вне локальной сети, т.е. компьютер связывается с провайдером VPN в Интернете, а тот уже сам назначит DNS-сервера, создав отдельное соединение, а в соединении с основным провайдером, DNS-сервера просто не будут указаны:

Посмотреть конфигурации DNS для всех существующих соединений

Как я уже говорил выше, вышестоящее сетевое соединение (например VPN) может переопределить DNS, потому можно посмотреть DNS для всех существующих соединений через консоль:

ipconfig /all|more

А вот и утечка!

...
Адаптер PPP lainserexp:

   DNS-суффикс подключения . . . . . :
   Описание. . . . . . . . . . . . . : lainserexp
   Физический адрес. . . . . . . . . :
   DHCP включен. . . . . . . . . . . : Нет
   Автонастройка включена. . . . . . : Да
   IPv4-адрес. . . . . . . . . . . . : 172.16.1.122(Основной)
   Маска подсети . . . . . . . . . . : 255.255.255.255
   Основной шлюз. . . . . . . . . : 0.0.0.0
   DNS-серверы. . . . . . . . . . . : 8.8.8.8
                                       10.x.x.x
   NetBios через TCP/IP. . . . . . . . : Включен

Внутренний корпоративный VPN оказался криво настроен — первым DNS-сервером выдает гуглевский 8.8.8.8, а локальный вторым. Звоним администратору, пусть меняет конфигурацию.

Настройки DNS в Linux

Настройки DNS в Linux хранятся в файле /etc/resolv.conf, который представляет собой обычный текстовый файл, потому посмотреть и отредактировать его можно любым удобным текстовым редактором.

Содержимое файла /etc/resolv.conf в котором, например, указаны публичные DNS-серверы Google:

nameserver 8.8.8.8
nameserver 8.8.4.4

Просмотр DNS в Linux

В Linux DNS также может быть изменен сетевым соединением, и тоже есть возможность это проверить.

1. С помощью команды dig

dig google.com

Вывод (оставил только значимый результат):

...
;; ANSWER SECTION:
google.com. 300 IN A 142.251.36.14

;; Query time: 44 msec
;; SERVER: 10.10.0.1#53(10.10.0.1)
;; WHEN: Sat Jul 09 11:57:58 AKDT 2022
;; MSG SIZE rcvd: 55

В строке SERVER указан использованный сервер DNS (10.10.0.1) и порт (53), заодно, можно увидеть и IP-адрес сайта (142.251.36.14)

2. Командой nslookup:

nslookup google.com

Вывод:

Server:         10.10.0.1
Address:        10.10.0.1#53

Non-authoritative answer:
Name:   google.com
Address: 142.251.36.14

Так же виден адрес используемого DNS-сервера и его порт и адрес сайта, к которому обратилась команда.

Потом расскажу, как сделать локальный DNS-сервер в сети или на локальной машине.

Источники

1. Как скрыть Реальный DNS и почему его видно
2. Как мне узнать, какой DNS-сервер использовать?
3. Как узнать IP DNS сервера в Linux

Копии источников в одном архиве (RAR, PDF)

Отключение обновления Foxit PDF Reader (v. 8.3.2.25013)

Преамбула

Когда-то писал о том, что в новых версиях Foxit Reader пропал PDF-принтер и Foxit PDF Creator (копия). Так вот, новая гадость пришла откуда не ждали, теперь он сносит PDF-принтер при обновлениях.

Штатного способа отключить обновления нет

Решение

Сама программа обновления имеется в двух экземплярах:

В каталоге Foxit:
C:\Program Files (x86)\Foxit Software\Foxit Reader\FoxitUpdater.exe

И в каталоге Application Data:
C:\Users\<username>\Application Data\Foxit Software\Addon\Foxit Reader\FoxitReaderUpdater.exe, вместо <username> — ваше имя пользователя.

Просто снести два экзешника не получится, точнее получится, но Foxit Reader будет при каждом запуске ругаться, что не нашел свой обновлятор. Зато не будет ругаться, если обновлятор (оба файла) просто заменить на экзешник, который ничего не делает, а такой я уже делал (копия), правда по другому поводу. Сделал еще и версию на MASM

Написал патч на NSIS

И для себя, если винды переустанавливать, и для клиентов, на всякий случай.

Репозиторий на GitHub
Исходник NSIS
Копия (без дополнительных файлов) на PasteBin
Скачать готовый патч

Дополнительно

В принципе, исходник достаточно простой, оставлю только ссылку на получение MD5-суммы файла в NSIS: NSIS: контрольная сумма (MD5), сравнение файлов. (копия).

Примечание: почему-то MD5-сумма, получаемая NSIS-плагином (md5dll.dll) отличается от MD5-суммы, полученной средствами Windows (копия). Почему, пока не разобрался. Может, позже напишу.

Windows, CMD/BAT: получить MD5 и другие хэш-суммы для файлов.

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

Windows 7 и выше

В Windows 7 присутствует стандартная утилита certutil, предназначенная для работы с сертификатами и хранилищами сертификатов, но она умеет вычислять и хэш-суммы файлов.

certutil -hashfile <путь_до_файла>

По умолчанию утилита генерирует хэш SHA1

Чтобы сгенерировать хэш-сумму по другому алгоритму, нужно вызвать утилиту так:

certutil -hashfile <путь_до_файла> <алгоритм>

где <алгоритм> — один из поддерживаемых алгоритмов (регистр символов в названии алгоритма значения не имеет)

Поддерживаемые алгоритмы:

— MD2
— MD4
— MD5
— SHA1
— SHA256
— SHA384
— SHA512

Например, чтобы получить MD5-хэш надо вызвать утилиту со следующими параметрами:

certutil -hashfile <путь_до_файла> MD5

Проще всего наделать батников для каждого (или нужных) алгоритмов, да положить их в один из PATH-каталогов, например, для получения MD5-хэша можно создать MD5.BAT со следующим кодом:

@certutil -hashfile %1 MD5

Впрочем, я для вас заморочился. Тут можно взять батник для каждого алгоритма, или скачать SFX-архив для самых ленивых. Распакуется в директорию Windows.

Улучшаем BAT-файлы

Вообще, оригинальный вывод содержит много лишнего, утилита выводит лишнюю строку, сообщая о том, что обрабатывает указанный файл, потом выводит хэш, где каждый байт хэш-суммы через пробел, а потом еще и уведомляет нас, что операция успешно завершена (нет, бля, мы не заметили):

N:\BatTest\win7\simple>certutil -hashfile MD5.BAT MD5
MD5 хеш файла MD5.BAT:
9b e2 27 09 ed 09 0a 23 9e 55 52 6b 44 04 a5 33
CertUtil: -hashfile - команда успешно выполнена.

Делаем так, чтобы батник отображал только строку с хэшем и без всяких пробелов.

1. Поскольку, язык BAT/CMD беден на операции со строками, нам придется скачать стороннюю, заимствованную из Linux утилиту awk, и добавить специальную команду, чтоб утилита оставила нам только вторую строку в выводе:

certutil -hashfile MD5.BAT MD5 | awk NR==2
b9 cb 1e 4b 57 f7 77 dd 67 ee a1 61 2e c4 32 20

Скачать утилиту awk для Windows можно здесь.

2. Удалить пробелы можно тоже с помощью awk:

awk "{ gsub(/ /,//); print }"

Весь батник целиком:

@certutil -hashfile %1 MD5|awk NR==2|awk "{ gsub(/ /,//); print }"

Вывод:

N:\BatTest\win7\ one-hash>MD5.bat MD5.bat
b310116e1fa1241e916717515212c1a01f116913e147144

Готовые .BAT-файлы на GitHub
SFX-архив (распаковывается в директорию Windows, awk в комплекте)

Windows XP и выше

В Windows XP утилиты certutil нет, потому придется пользоваться сторонними программами. Их множество, но, например, можно воспользоваться утилитой hash.exe

Она поддерживает хэш-суммы:

— MD5
— SHA1
— SHA256
— SHA512

Параметры запуска:

hash.exe <алгоритм> <путь_до_файла>

Например:

Hash.exe md5 Hash.exe

выдаст MD5-хэш самой hash.exe:

Hash.exe 126399821fc56f045cef5af1d09e832b

Утилита использует библиотеки OpenSSL (DLL есть в комплекте) для получения хэш-функций.

Внимание! Утилита дубовая от слова ой, Древние! Внутреннего хелпа у нее нет, на любые ошибки (нет параметров, параметры перепутаны местами, файл недоступен) она просто выдаст пустую строку в выводе.

Опять же, наделал батников (на GitHub)

И SFX-архив для ленивых (hash.exe и DLL в комплекте)

Консольный hello, world на MASM32. Трактат с подробным разбором, лирическими отступлениями и дополнениями

Преамбула

Итак, обещал рассказать, как все-таки написать консольный Hello, world на ассемблере, и выбрал для этого MASM, потому что TASM’овский компилятор довольно давно полумертв, и не умеет из коробки некоторых базовых вещей, например, не умеет указывать подсистему (это изменение одного поля в заголовке PE-файла), в которой должна работать программа под Win32. Подсистем есть несколько, но нас пока интересуют две: WINDOWS и CONSOLE. Первая, для оконных приложений, а вторая — для консольных. Если ОС будет видеть, что приложение консольное, она проверит, открыта ли для него консоль уже (если мы запускаем приложение через cmd, или Far manager, например), и откроет для него консоль, если мы запускаем приложение из оконной среды, щелкая по экзешнику мышкой. Это избавляет нас от геморроя, вручную контролировать консоль, открывать ее, закрывать, освобождать. Хотя, принципиальных ограничений нет — консольное приложение спокойно может открыть, как стандартное диалоговое окно, так и вообще создать полноценную форму, а оконное приложение — открыть консоль.
Далее под катом…

MASM32: Ошибки structure improperly initialized, syntax error : in structure и т.д. в windows.inc

И вообще их куча подобных вылезает, что аж компилятор отказывается анализировать: fatal error A1012: error count exceeds 100; stopping assembly

Решение

Скорее всего, в основной программе вы забыли указать конструкцию:option casemap:none

Эта опция говоpит MASM сделать имена (функций, меток, констант и т.д)чувствительными к pегистpам, например, ExitProcess и exitprocess — это pазличные имена.

Вообще лучше всегда указывать option casemap:none перед подкдючением внешних .inc файлов и библиотек (.LIB):

.386
.model flat, stdcall
option casemap:none

include windows.inc
include kernel32.inc
includelib kernel32.lib

...

MASM32: .386 .model, STDCALL, что это такое.

Совсем краткое пояснение. Как театр начинается с вешалки, так программа на ассемблере MASM начинается с указания набора инструкций:

.386

Это ассемблеpная диpектива, говоpящая ассемблеpу использовать набоp опеpаций для пpоцессоpа 80386. Вы также можете использовать .486, .586, но самый безопасный выбоp — это указывать .386. Также есть два пpактически идентичных выбоpа для каждого ваpианта CPU. .386/.386p, .486/.486p. Эти «p»-веpсии необходимы только когда ваша пpогpамма использует пpивилигиpованные инстpукции, то есть инстpукции, заpезеpвиpованные пpоцессоpом/опеpационной системой в защищенном pежиме. Они могут быть использованны только в защищенном коде, напpимеp, дpайвеpами. Как пpавило, ваши пpогpаммы будут pаботать в непpивилигиpованном pежиме, так что лучше использовать не-«p» веpсии. (Из мануала Iczelion’а)

.model flat

.model — модель памяти, используемая вашей программой. Для DOS, например, были модели tiny, small, compact, flat, lagre и т.д. — они выбирались в зависимости от типа программы. По ограничениям DOS сегмент кода не мог занимать пространство, больше размера одного сегмента в памяти. Чтоб это обойти, как раз и использовалась сегментация. Tiny и flat могли быть использованы для оригинальных DOS-программ, с расширением .com, которые могли занимать чуть меньше одного сегмента (64 Кб), на код и данные, и представляли собой просто кусок кода вместе с данными, можно сказать RAW-формат исполняемого файла — просто откомпилированный байткод, даже без всякого заголовка. Для EXE формата, код и данные могли занимать несколько сегментов.

В Win32 сегментация памяти не нужна, во-первых, размер адреса 32-битный, что больше, чем в DOS, во-вторых, менеджментом памяти занимается ОС, потому программа видит все нужные ей внешние библиотеки и функции из них, как если бы они были загружены в адресное пространство программы. Таким образом, программа под Win32 изнутри представляет такой себе очень большой .COM-файл, потому используется только одна модель памяти — flat.

.model flat, stdcall

У директивы .model есть несколько важных параметров, самый главный из них, указание на передачу параметров функций (обычно внешних, из DLL, но никто не мешает для своих функций использовать). Его и указываем через запятую (stdcall).

Есть три способа передачи параметров:
C (си) способ: вызывающая, т.е. наша программа, должна положить в стек нужные параметры, причем, в обратном порядке. Например, если функция описывается так:

SomeFunction (Argument1, Argument2, Argument3)

То на ассемблере она вызывается так:

push Argument3
push Argument2
push Argument1
call SomeFunction

А далее, вызывающая программа должна почистить стэк (по-научному это называется «уравнять»), push уменьшает значение регистра стека на размер операнда (2 или 4 байта), пусть будет 4, тогда получается, что надо увеличить значение стека на 3x4=12 байт.

add SP, 12

C-поpядок полезен, когда вы не знаете, как много паpаметpов будут пеpеданны функции

PASCAL — это C соглашение наоборот, параметры передаются в прямой последовательности, т.е. первый параметр кладется в стек первым, а со стеком должна разбираться сама вызываемая функция.

STDCALL — это гибрид C и PASCAL соглашения, параметры передаются в обратном порядке, но со стеком разбирается вызываемая функция.

Win32 использует практически исключительно STDCALL соглашение для своего API, исключая функцию wsprintf(), потому что она не знает, сколько ей будет передано параметров. При ее вызове следует использовать C-соглашение.

Ошибка в windows.inc (MASM)

Если вы используете include-файл windows.inc в MASM, и при компиляции происходит ошибка windows.inc(78) : error A2119: language type must be specified, значит, забыли указать параметр stdcall в директиве .model

Скрипты NppExec для MASM

Компиляция консольного приложения

npp_save
cd "$(CURRENT_DIRECTORY)"
G:\masm32\bin\ml.exe /c /coff /IG:\masm32\include\ $(FILE_NAME)
if $(EXITCODE) !=0 goto exit

G:\masm32\bin\link.exe $(NAME_PART).obj /SUBSYSTEM:CONSOLE /LIBPATH:G:\masm32\lib\
:exit

Компиляция и запуск консольного приложения

Не всегда корректно работает, как сделать, пока не разобрался.

npp_save
cd "$(CURRENT_DIRECTORY)"
G:\masm32\bin\ml.exe /c /coff /IG:\masm32\include\ $(FILE_NAME)
if $(EXITCODE) !=0 goto exit

G:\masm32\bin\link.exe $(NAME_PART).obj /SUBSYSTEM:CONSOLE /LIBPATH:G:\masm32\lib\
if $(EXITCODE) !=0 goto exit

$(NAME_PART).exe

:exit

Компиляция оконного приложения Windows

npp_save
cd "$(CURRENT_DIRECTORY)"
G:\masm32\bin\ml.exe /c /coff /IG:\masm32\include\ $(FILE_NAME)
if $(EXITCODE) !=0 goto exit

G:\masm32\bin\link.exe $(NAME_PART).obj /SUBSYSTEM:WINDOWS /LIBPATH:G:\masm32\lib\
:exit

Компиляция и запуск оконного приложения Windows

npp_save
cd "$(CURRENT_DIRECTORY)"
G:\masm32\bin\ml.exe /c /coff /IG:\masm32\include\ $(FILE_NAME)
if $(EXITCODE) !=0 goto exit

G:\masm32\bin\link.exe $(NAME_PART).obj /SUBSYSTEM:WINDOWS /LIBPATH:G:\masm32\lib\
if $(EXITCODE) !=0 goto exit

$(NAME_PART).exe

:exit

На GitHub

masm-compile-console.txt
masm-compile-console-and-run.txt
masm-compile-windows.txt
masm-compile-windows-and-run.txt

На PasteBin

masm-compile-console.txt
masm-compile-console-and-run.txt
masm-compile-windows.txt
masm-compile-windows-and-run.txt

Другие копии

Архив на Mega.NZ
Архив на Google.Drive

Как забэкапить макросы Notepad++ И как перенести макрос на другой комп.

Преамбула

Да, пока показывал школьникам ассемблер, записал пару макросов, которые создают шаблон программы, а то лень писать .386, model flat и т.д., но, поскольку, делал это в основном на своем компьютере, встал вопрос — а нельзя ли макросы перенести на другой комп, ну и забэкапить для верности. Оказывается, можно.

Backup

Бэкап делается просто. Макросы хранятся в файле C:\Users\<username>\AppData\Roaming\Notepad++\shortcuts.xml для Windows 7. В остальных системах ищите shortcuts.xml, а где он находится у вас — не ведаю.

Перенос

Если надо перенести макрос с одного компьютера на другой, открываем файл shortcuts.xml в любом текстовом редакторе.

Макросы находятся между XML-тегами <Macros> </Macros>, а конкретный макрос между тегами <Macro ...> </Macro> где, в первом, открывающем теге, указаны параметры макроса: имя (name=), и комбинация клавиш для вызова (Ctrl="no" Alt="no" Shift="no" Key="0").

Если необходимо перенести макрос с одного компьютера на другой, просто скопируйте строки, начинающиеся с <Macro name="ваш_макрос"> до </Macro> включительно, и вставьте макрос на целевом компьютере в файл shortcuts.xml между тегами <Macros> </Macros>

Примеры

Макрос для создания «болванки» исходника для TASM32 на PasteBin
Макрос для создания «болванки» исходника для TASM32 на GitHub

Макрос для создания «болванки» исходника для MASM32 на PasteBin
Макрос для создания «болванки» исходника для MASM32 на GitHub

Копия shortcuts.xml на mega.nz

О формате объектных файлов и библиотек COFF и OMF, и об опасности их смешения.

На рассвете цивилизации ПК и примерно до того времени, когда появились инструменты программирования Microsoft Win32, почти все компиляторы для ПК создавали объектные файлы с использованием стандарта Intel Object Module Format (OMF). Позже Intel представила процессоры 386 и 32-разрядный защищенный режим, после чего они также расширили спецификацию OMF для 32-разрядных систем, что привело к появлению «OMF-386», который стал стандартом для большинства сред защищенного режима ПК. Примерно в это же время исходная группа разработчиков Windows NT также разрабатывала код не только для процессоров Intel, но и для поддержки процессоров других производителей. Команда Microsoft NT выбрала более переносимый формат объектных модулей, известный как Common Object File Format (COFF), производный от официального формата объектного кода для UNIX System V. Объектные модули COFF позже стали стандартом де-факто для всех инструментов разработки Microsoft Win32 и получили преимущество в том, что он намного ближе по формату к переносимым исполняемым файлам (PE) — собственному исполняемому формату для Win32 (компоновщику формата COFF требуется гораздо меньше усилий для создания 32-разрядного EXE или DLL из файла COFF, чем из файла формата OMF).

Помимо объектных файлов форматов OMF и COFF (.obj), существуют также файлы библиотек форматов OMF и COFF (.lib). Библиотеки, к счастью, в основном представляют собой просто набор объектных файлов вместе с заголовочной информацией, которая позволяет компоновщику определить, какие объектные файлы из библиотеки использовать. Однако, чтобы усложнить ситуацию, и OMF, и COFF используют одни и те же расширения имен файлов, .obj и .lib, для ссылки на два разных типа форматов файлов объектов и библиотек (из-за этого вы не можете просто посмотреть на расширение имени файла чтобы узнать, является ли объектный модуль или файл библиотеки OMF или COFF).

Проблема со смешиванием объектных файлов и файлов библиотек от разных производителей компиляторов заключается в том, что одни поставщики поддерживают COFF, другие используют OMF, а некоторые могут работать и с тем, и с другим. Borland, например, по-прежнему использует объектные файлы и библиотеки OMF, тогда как 32-разрядные компиляторы Microsoft создают файлы формата COFF. Watcom C/C++ v11.0, по-видимому, предпочитает COFF при компиляции и компоновке приложений Windows, но создает объектные файлы OMF для использования с 32-разрядным DOS-расширителем защищенного режима DOS4GW. Microsoft MASM 6.13 по умолчанию создает файлы OMF, но параметр командной строки /coff указывает компилятору, что он должен создавать объектные файлы COFF.

Когда приходится связывать файлы разных форматов, разные компоновщики делают разные вещи. Например, компоновщик Microsoft Visual C/C++ предназначен для объектных файлов и библиотек формата COFF, но при необходимости попытается преобразовать объектные файлы OMF в файлы COFF. В некоторых случаях это работает, но, к сожалению, Microsoft LINK не поддерживает все типы записей OMF, поэтому во многих ситуациях компоновщик может дать сбой при работе с объектными файлами формата OMF. Кроме того, хотя Microsoft LINK пытается поддерживать объектные файлы OMF, он отказывается обрабатывать любые библиотеки формата OMF. Другие компоновщики, такие как TLINK от Borland, предназначены для объектных файлов OMF и аналогичным образом отказываются работать с объектными или библиотечными файлами формата COFF. Некоторые поставщики расширителей DOS и встраиваемых систем, такие как Phar Lap, предоставляют свои собственные компоновщики, поддерживающие как OMF, так и COFF, что дает вам возможность выбора.

Проблема в том, что смешение OMF и COFF типов объектных файлов и файлов библиотек может привести к хаосу. Вдобавок появляются загадочные сообщения об ошибках от компоновщиков, которые только вносят еще большее непонимание. Если ваш компоновщик не поддерживает определенный формат, вам следует придерживаться рекомендуемого формата объекта и библиотеки для вашего компилятора/компоновщика/платформы и избегать смешивания файлов OMF и COFF.

Перевод: Leha Silent для tolik-punkoff.com
Оригинальный текст (англ., TXT) предоставил Jiang Yap из WeChat
Копия перевода в TXT

Assembler: проверка условий и переходы (jump)

Небольшая шпаргалка по условным и безусловным переходам.

Безусловный переход: выполняется командой JMP <метка>, может использоваться, как для перехода вперед, пропуская некоторые команды в коде, так и для возврата назад, для повторного выполнения инструкций:

1.

	...
	какой-то код
	...
	JMP	label1
	...
	какой-то код
	...
label1:
	...
	другой код
	выполняется после срабатывания
	инструкции JMP
	...


2.

	...
	какой-то код
	...
labelret:
	...
	какой-то код
	...
	JMP	labelret

Условный переход: Выполняется, если выполнено какое-либо условие, переход осуществляется командой Jxx <метка>, где xx — мнемоника, указывающая на проверяемое условие.

Инструкция CMP

Инструкция CMP сравнивает два операнда, в основном вычитая один операнд из другого для сравнения, равны ли операнды или нет, не изменяя целевой или исходный операнд. Инструкция CMP используется вместе с инструкцией условного перехода для принятия решения. CMP изменяет регистр флагов, который потом проверяет соответствующая инструкция условного перехода, и осуществляет (не осуществляет) переход по соответствующему адресу (метке).

Синтаксис:

CMP целевой_операнд, исходный_операнд

CMP сравнивает два числа. В качестве целевого операнда может использоваться значение в регистре или в памяти. Исходный операнд может быть константой (EQU), непосредственно числом, значением в регистре или памяти. Так же, оба операнда не могут быть одновременно значениями в памяти.

Правильно Неправильно Ошибка (MASM)
cmp eax, ecx MYVALUE1 dd 2
MYVALUE2 dd 5

cmp MYVALUE1, MYVALUE2
invalid instruction operands
cmp eax, 0 cmp 0, eax immediate operand not allowed
ERROR_FLAG EQU 16h

cmp eax, ERROR_FLAG
ERROR_FLAG EQU 16h

cmp ERROR_FLAG, eax
immediate operand not allowed
MYVALUE dd ?

cmp eax, MYVALUE
MYVALUE dd ?

cmp MYVALUE, eax
MYVALUE dd ?

cmp MYVALUE, 0
MYVALUE dd ?

cmp 0, MYVALUE
immediate operand not allowed
MYVALUE dd ?
ERROR_FLAG EQU 16h

cmp MYVALUE, ERROR_FLAG
MYVALUE dd ?
ERROR_FLAG EQU 16h

cmp ERROR_FLAG, MYVALUE
immediate operand not allowed
cmp 0, 1 immediate operand not allowed
CONST1 equ 1
CONST2 equ 2

cmp CONST1, CONST2
immediate operand not allowed

Также нужно быть внимательным при сравнении значения в памяти и регистре, если их размерность будет не совпадать, это приведет к ошибке компиляции. Например, при сравнении регистра EAX, имеющего разрядность двойное слово (DWORD) с переменной, разрядность которой установлена, как байтовая (DB):

...
MYVALUE db 1
...
cmp eax, MYVALUE
...
;Ошибка: invalid instruction operands

Условные переходы

Результаты арифметических операции для знаковых чисел

Инструкция Описание Проверяемые флаги
JE/JZ Если значения равны/Если значение 0 ZF
JNE/JNZ Если значения не равны/Если значение не 0 ZF
JG/JNLE Если больше/Если не меньше или равно OF SF ZF
JGE/JNL Если больше или равно/Если не меньше OF SF
JL/JNGE Если меньше/Если не больше или равно OF SF
JLE/JNG Если меньше или равно/Если не больше OF SF ZF

Результаты арифметических операции для беззнаковых чисел или логических операций

Инструкция Описание Проверяемые флаги
JE/JZ Если значения равны/Если значение 0 ZF
JNE/JNZ Если значения не равны/Если значение не 0 ZF
JA/JNBE Если больше/Если не меньше или равно CF ZF
JAE/JNB Если больше или равно/Если не меньше CF
JB/JNAE Если меньше/Если не больше или равно CF
JBE/JNA Если меньше или равно/Если не больше AF CF

Прочие инструкции для условных переходов

Эти инструкции имеют специальное применение и проверяют значения отдельных флагов во флаговом регистре.

Инструкция Описание Проверяемые флаги
JXCZ Если значение в регистре CX равно 0 Нет
JC Если произошел перенос в результате арифметической операции CF
JNC Перенос не произошел CF
JO Произошло переполнение OF
JNO Переполнение не произошло OF
JP/JPE Число единичных бит четное PF
JNP/JPO Число единичных бит нечетное PF
JS Число со знаком (отрицательное) SF
JNS Число без знака (положительное) SF

Ссылки

Регистр флагов с описанием значений флагов (копия)

Assembler, компиляторы и туториалы Iczelion’а

Очередная ссылочная.

Компиляторы:

TASM/TASM32, компилятор для Windows x86 и DOS (Mega.NZ, ZIP, 4.6 Мб)
MASM for DOS (Mega.NZ, ZIP, 4.6 Мб)
MASM32, компилятор для Windows x86: Официальный сайт (копия на Mega.nz)
IMPORT32.LIB (7z, Mega.NZ) (копия на Google.Drive)

Туториалы Iczelion’а (RUS, перевод WASM.RU).

Довольно неплохое руководство по Win32 API для начинающих программистов на ассемблере. Начиная с простейших примеров и до довольно продвинутых программ, включая описание структур и функций Win32 API, структуры PE EXE-файла, простейших VxD-драйверов.

Перевод Aquila.

В комплекте исходники и бинарники примеров программ.

На Old-DOS
На mega.nz