Слова с нулевым окончанием правило: 100 слов с нулевым окончанием

Содержание

100 слов с нулевым окончанием

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

Как найти нулевое окончание?

На пер­вый взгляд, у неко­то­рых слов нет окон­ча­ния. В таком слу­чае сле­ду­ет про­ве­рить это, изме­нив их по паде­жам, чис­лам, родам, например:

  • поми­дор     — лом­тик чего? поми­дора, лаком­люсь чем? поми­дором, про­чи­таю о чём? о поми­доре;
  • кра­сив    — бере­за кра­сива, лицо кра­сиво, цве­ты кра­сивы.

Значит, в первую оче­редь, выяс­ня­ем, изме­ня­ет­ся ли сло­во. Нулевое окон­ча­ние обя­за­тель­но про­явит себя в дру­гих его формах.

Нулевое окон­ча­ние име­ют сло­ва мно­гих частей речи и их грам­ма­ти­че­ские фор­мы. Рассмотрим это окончание-«невидимку» более подроб­но с примерами.

Примеры слов с нулевым окончанием

Существительные с нулевым окончанием

У суще­стви­тель­ных нуле­вое окон­ча­ние име­ют сло­ва муж­ско­го рода вто­ро­го склонения:

  • при­бой    
  • соля­рий    
  • гер­ба­рий    
  • грач    
  • неуч   
  • овощ    
  • кре­пыш    
  • грош    
  • най­дё­ныш    
  • шарж    
  • мон­таж    
  • пляж    
  • пароль    
  • табель    
  • тюль    ;

жен­ско­го рода тре­тье­го склонения:

  • брешь    
  • гуашь    
  • пустошь    
  • блажь    
  • ложь    
  • течь    
  • пол­ночь    
  • щёлочь    
  • помощь    
  • вещь    ;

1 -2 скло­не­ния в фор­ме роди­тель­но­го и вини­тель­но­го паде­жа (оду­шев­лен­ные суще­стви­тель­ные) мно­же­ствен­но­го числа:

  • ряд (чего?) дач    ;
  • мно­го луж    ;
  • уве­сти с паст­бищ    ;
  • ниже туч    ;
  • пара галош    ;
  • мимо кла­виш    ;
  • несколь­ко депеш    ;
  • пять учи­лищ    ;
  • боль­шин­ство пле­мён    ;

а так­же

вижу (кого?) чудо­вищ    , стра­ши­лищ    , маль­чи­шек    , рыбе­шек    , белок    , вол­чат    .

Прилагательные с нулевым окончанием

Краткая фор­ма каче­ствен­ных при­ла­га­тель­ных муж­ско­го рода:

  • лес дре­муч    ;
  • напи­ток шипуч    ;
  • царе­вич при­гож    ;
  • денёк погож    ;
  • лан­дыш пахуч    ;
  • бен­зин горюч    ;
  • дуб могуч    ;
  • мороз трес­куч    ;
  • чело­век весел    ;
  • ста­рик раз­го­вор­чив    ;

при­тя­жа­тель­ные при­ла­га­тель­ные муж­ско­го рода:

  • дедов     совет;
  • Иванов     дом;
  • рыбачий     поселок;
  • заячий     след,;соболий_ мех;
  • импе­ра­трицын     трон;
  • яще­рицын     хвост,;
  • сестрин     платок;
  • Ильин     день;
  • Наташин     телефон;

Глаголы с нулевым окончанием

Глаголы в фор­ме про­шед­ше­го вре­ме­ни или услов­но­го накло­не­ния муж­ско­го рода:

  • он пел    ;
  • он тан­це­вал    ;
  • он пере­пи­сал    ;
  • он сло­жил    ;
  • он нари­со­вал    ;

а так­же

он успел     бы вовре­мя, отпра­вил     бы пись­мо, посмот­рел     бы фильм.

Стоит толь­ко обра­зо­вать фор­мы жен­ско­го и сред­не­го рода, как в их мор­фем­ном соста­ве сра­зу появит­ся зри­мое окон­ча­ние в виде букв. Сравним:

маль­чик бежал     — девоч­ка бежала, обла­ко бежало.

У гла­го­лов в фор­ме пове­ли­тель­но­го накло­не­ния отме­тим нали­чие нуле­во­го окончания:

  • отрежь    
  • нари­суй    
  • повесь    
  • отправь   
  • рас­смеши    
  • укажи    
  • сложи    

Глагольная фор­ма при­ча­стие в крат­кой фор­ме муж­ско­го рода обла­да­ет нуле­вым окончанием:

  • вход раз­ре­шён    ;
  • маль­чик увле­чен    ;
  • рыбо­лов огор­чён    ;
  • при­мер решён    ;
  • бегун раз­го­ря­чён    ;
  • умыт     дождем,;
  • рас­крыт     настежь;
  • уку­шен     клещом.

Сравните:

под­ход упро­щён     — зада­ча упро­щена, реше­ние упро­щено.

Видеоурок «Слова-названия предметов, у которых нет окончаний»

Скачать ста­тью: PDF

Что такое нулевое окончание? Бывает ли первое, второе и третье окончания?

Начну со второй части вопроса. Первого, второго и третьего окончаний не бывает.
Запомните: первым, вторым и третьим могут быть только склонение у существительных и лицо у глаголов.

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

  • Стол : нулевое окончание    у существительных мужского рода 2 скл.  — это показатель И.п.
  • Стола: окончание а  у неодушевлённых существительных мужского рода 2 скл. — это показатель Р.п.
  • Лошадь : нулевое окончание   у существительных женского рода 3 скл. — это показатель И.п. или В.п.
  • Лошади:окончание и  у существительных женского рода 3 скл. — это показатель Р.п., Д.п. или П.п.

Внимание:

В разных формах одного слова основа будет одной и той же. В наших примерах это основы: стол и лошадь.

Грубой ошибкой является мнение, что у слов стол , лошадь  окончаний нет. Окончаний не бывает только у неизменяемых слов, например, у наречий.  
Последние гласные буквы в наречиях – суффиксы, к примеру: завтра, сверху, слева.

Подробнее о том, для каких грамматических форм характерны нулевые окончания, см. Как устроен наш язык. Глава 4. Морфемика. §3. Виды формообразующих морфем.

 

Смотрите также

— Понравилась статья?:)

Facebook

Twitter

Мой мир

Вконтакте

Одноклассники

Google+

морфология — Нулевое окончание — Русский язык

Я не знаю как объяснить ребенку, ибо у меня подобных проблем не возникало.
Ни у самого, ни с ребенком.

Но компании из 15-ти человек с верхним техническим объясняю легко.

Если на улице нулевая температура, то это не значит, что её нету вообще.
А если у вас «нет температуры», то она далеко не нулевая.

Сдается мне, что нет окончание и нулевое окончание в школьном контексте полные синонимы и нет оснований бороться против одного в силу другого.
наоборот. Если у Пети нет яблок, значит у него их ноль, разве нет? Если у слова нет окончания, то в нём (в окончании) — ноль звуков, нет? Или дети в школе в век компьютеров не знают, что такое «ноль»?

Признаться, идея с носом мне не совсем нравится. Нос-то есть. И он отнюдь не «нулевой». Просто не виден. Это совсем другое. В свое время (класса с пятого, ибо в третьем и четвертом в школе не учился) из-за подобных нестыковок и недомолвок частенько думал, что мне просто целенаправленно морочат голову. )))
Это я в основном не про русский язык, но и с русским случалось недоразумения. Но не смею настаивать.

Элен, отвечаю здесь
//———————-

Вопрос в том, кому и зачем это надо. Может, вы объясните, чем руководствовался автор этой идеи?

Автор этой идеи руководствовался заботой о школьниках.

Простите, но я не спрашивал о школьниках. Вы не поняли. (Или «в толк не взяли»).

Они (ученики) быстрее понимают то, что Вы никак в толк не возьмёте.

Я не могу взять в толк, зачем нужна такая система определений. А школьники понимают, зачем она нужна? Не смешите. Они (так же как и я, кстати, Вы на меня напраслину наговариваете) понимают, что им говорят — но зачем это не понимают ни они, ни я, ни Вы. Если назовете эту цель (аргументировано), то я сразу пойму. Да что-то не получается ни у Вас, ни у Ваших предшественников. Только не надо повторять что «они лучше понимают». Назовите хотя бы что именно они «понимают».

Если опять не поняли. ЖИ и ШИ пишут с И совсем не потому, что они так «лучше понимают». А потому, что так правильно, объяняется традицией и исторической фонетикой.
Вот и аргументируйте, если не трудно, идея «у слова стол флексия нулевая, а у пальто — её нет» правильно, а не просто волюнтаристски задано.

А вот чем руководствуются люди, изобретающие вопросы ЕГЭ, мне непонятно. (Я о вопросе про грамматическую связь в словосочетании «его появление».)

При чем тут ЕГЭ? Но если это вопрос, то они руководствовались не иначе как соображениями типа «они так лучше понимают».

Но вопрос-то на самом деле в другом. А как правильно (логичнее, понятнее — на Ваш выбор), считать, что несклоняемые имена/местоимения не имеют флексий вообще — и, как следствие, путаться во всех формулировках, это понятие использующих («его пальто» — это просто один из примеров) или сделать формулировку универсальной — и снимающей многие нестыковки во всей системе определений.

Вот где собака-то порылась.
А Вы мне — про детский сад и «лучше понимают». А как они «понимают хуже», позвольте спросить? Если есть «лучше», значит и «хуже» должно быть, нет?

1. Нулевое окончание. Слова без окончаний. Алгоритм выделения окончания

 

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

Наверняка ты помнишь, что окончание слова выделяется путём сравнения различных его форм и выделения той части, которая при этом меняется. Например, тишинА и тишинЕ, сумкА и сумкИ, душА и душОЙ.

А теперь попробуй выделить окончание в первом слове каждой группы: дом и домА, снег и снегА, нож и ножИ.

 

Получилось? Наверное, ты заметил, что во втором слове окончание выделяется, а вот в первом — нет, потому что отсутствует необходимая буква. А ведь если есть окончание во втором слове, то оно должно быть и в первом. В данном случае языковеды (учёные, которые изучают язык) пришли к выводу, что такое окончание (материально не выраженное, не имеющее буквенного выражения) следует называть нулевым.

Нулевое окончание — это такое окончание в изменяемом слове, которое не выражается буквами.

Чаще всего нулевое окончание имеют существительные мужского (брат, конь, долг, миг, крик) и женского (лошадь, печь, речь, грусть) родов.

 

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

 

Обрати внимание!

1. Нулевым называется не выраженное буквами окончание.

2. Нулевое окончание следует отличать от отсутствия окончания в словах.

3. Некоторые слова, которые меняют свои формы, могут иметь нулевое окончание, а слова, которые не изменяются, никогда не имеют окончаний.

Выберите слова с нулевым окончанием

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

Как найти нулевое окончание?

На пер­вый взгляд, у неко­то­рых слов нет окон­ча­ния. В таком слу­чае сле­ду­ет про­ве­рить это, изме­няя их по паде­жам, чис­лам, родам, напри­мер:

  • поми­дор — лом­тик чего? поми­дор а , лаком­люсь чем? поми­дор ом , про­чи­таю о чём? о поми­дор е ;
  • кра­сив — бере­за кра­сив а , лицо кра­сив о , цве­ты кра­сив ы .

Значит, в первую оче­редь, выяс­ня­ем, изме­ня­ет­ся ли сло­во. Нулевое окон­ча­ние обя­за­тель­но про­явит себя в дру­гих его фор­мах.

Нулевое окон­ча­ние име­ют сло­ва мно­гих частей речи и их грам­ма­ти­че­ские фор­мы. Рассмотрим это окончание-«невидимку» более подроб­но с при­ме­ра­ми.

Примеры слов с нулевым окончанием

Существительные с нулевым окончанием

У суще­стви­тель­ных нуле­вое окон­ча­ние име­ют сло­ва муж­ско­го рода вто­ро­го скло­не­ния:

жен­ско­го рода тре­тье­го скло­не­ния:

1 -2 скло­не­ния в фор­ме роди­тель­но­го и вини­тель­но­го паде­жа (оду­шев­лен­ные суще­стви­тель­ные) мно­же­ствен­но­го чис­ла:

  • ряд (чего?) дач ;
  • мно­го луж ;
  • уве­сти с паст­бищ ;
  • ниже туч ;
  • пара галош ;
  • мимо кла­виш ;
  • несколь­ко депеш ;
  • пять учи­лищ ;
  • боль­шин­ство пле­мён ;

вижу (кого?) чудо­вищ , стра­ши­лищ , маль­чи­шек , рыбе­шек , белок , вол­чат .

Прилагательные с нулевым окончанием

Краткая фор­ма каче­ствен­ных при­ла­га­тель­ных муж­ско­го рода:

  • лес дре­муч ;
  • напи­ток шипуч ;
  • царе­вич при­гож ;
  • денёк погож ;
  • лан­дыш пахуч ;
  • бен­зин горюч ;
  • дуб могуч ;
  • мороз трес­куч ;
  • чело­век весел ;
  • ста­рик раз­го­вор­чив ;

при­тя­жа­тель­ные при­ла­га­тель­ные муж­ско­го рода:

  • дед ов совет;
  • Иван ов дом;
  • рыбач ий посе­лок;
  • заяч ий след,;соболий_ мех;
  • импе­ра­триц ын трон;
  • яще­риц ын хвост,;
  • сестр ин пла­ток;
  • Иль ин день;
  • Наташ ин теле­фон;

Глаголы с нулевым окончанием

Глаголы в фор­ме про­шед­ше­го вре­ме­ни или услов­но­го накло­не­ния муж­ско­го рода:

  • он пе л ;
  • он тан­це­ва л ;
  • он пере­пи­са л ;
  • он сло­жи л ;
  • он нари­со­ва л ;

он успел бы вовре­мя, отпра­вил бы пись­мо, посмот­рел бы фильм.

Стоит толь­ко обра­зо­вать фор­мы жен­ско­го и сред­не­го рода, как в их мор­фем­ном соста­ве сра­зу появит­ся зри­мое окон­ча­ние в виде букв. Сравним:

маль­чик бежал — девоч­ка бежал а , обла­ко бежал о .

У гла­го­лов в фор­ме пове­ли­тель­но­го накло­не­ния отме­тим нали­чие нуле­во­го окон­ча­ния:

Глагольная фор­ма при­ча­стие в крат­кой фор­ме муж­ско­го рода обла­да­ет нуле­вым окон­ча­ни­ем:

  • вход раз­ре­шён ;
  • маль­чик увле­чен ;
  • рыбо­лов огор­чён ;
  • при­мер решён ;
  • бегун раз­го­ря­чён ;
  • умыт дождем,;
  • рас­крыт настежь;
  • уку­шен кле­щом.

Сравните:

под­ход упро­щён — зада­ча упро­щен а , реше­ние упро­щен о .

Видеоурок «Слова-названия предметов, у которых нет окончаний»

Слова разных частей речи с корнем и нулевым окончанием:

  • юбилей
  • юг
  • юмор
  • язык
  • якорь
  • шашлык
  • шёлк
  • шёпот
  • ширь
  • шоколад
  • шорох
  • шпатель
  • шпингалет
  • щегол
  • щёголь
  • щит
  • част о кол
  • человек
  • что
  • экстракт
  • электр о воз
  • эпиграф
  • эффект
  • улей
  • у шиб
  • тел е фон
  • пад
  • панцирь
  • пассажир
  • патриций
  • пере рыв
  • пере сказ
  • пере ход
  • печать
  • печень
  • пеш е ход
  • пилот
  • плотник
  • по вар
  • по сол
  • прав
  • от крой
  • морозь
  • кабриолет
  • календарь
  • капот
  • карман
  • карниз
  • картофель
  • карусель
  • каспий
  • кило грамм
  • кило метр
  • кисель
  • клей
  • книг о люб
  • ковбой
  • коллектив
  • колодец
  • конец

Слова с корнем, суффиксом и нулевым окончанием:

  • юбил яр
  • юж ан ин
  • юмор ист
  • юн ость
  • языч ок
  • япон ец
  • япон ист
  • яр ость
  • шахмат ист
  • шест и класс ник
  • шип ов ник
  • шкаф чик
  • школь ник
  • щедр ость
  • щен ок
  • чай ник
  • час ов щик
  • человеч ек
  • черн ов ик
  • черн о мор ец
  • черт ёж
  • черт ёж ник
  • чест н ость
  • чит ай
  • чит а л
  • чит а тель
  • экзамен атор
  • эласт ич н ость
  • эссе ист
  • у вид е л
  • у влаж н и тель
  • угол ок
  • удаль
  • тр е нож ник
  • тр е уголь ник
  • свар щик
  • сверх готов н ость
  • себ я люб ец
  • смел ость
  • бесед ник
  • пис ок
  • ста ть
  • ст о балль ник
  • па’ вод ок
  • паль ч ик
  • памят ник
  • пас т ух
  • пас т уш онок
  • пауч ок
  • пе в ец
  • пере лес ок
  • пере ул ок
  • пиан ист
  • побед и тель
  • под вод ник
  • при зыв а л
  • при рожд ённ ость
  • огуреч ик
  • от кры л
  • отлич ник

Смотрите примеры слов с разными морфемами:

Или подберите нужные слова с необходимыми частями слова через поиск слов по морфемам.

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

Что такое окончание

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

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

Так же мы можем, например, изменить слово «мир»: мир-а, мир-е, мир-ом, мир-ы.

Грамматическое и лексическое значение слова

Обратим внимание, что это именно одно и то же слово, так как речь идет об одном и том же явлении действительности, которое одинаково характеризуется. Если бы мы захотели иначе охарактеризовать это явление, мы бы использовали возможности многочисленных аффиксов русского языка: кошечка, кошуня, кошуля, кошуся, кошандра… Добавив в слово эмоцию, оценку, мы образовали новое слово: кошка и кошуся – это разные слова, а не формы одного и того же слова. У этих слов разное лексическое, но одно и то же грамматическое значение: именительный падеж, единственное число. Мы можем образовать и другие формы этих слов: кошек, кошусей. Это разные слова в одной и той же форме, то есть их лексические значения разные (словом «кошка» мы нейтрально указываем на животное, а словом «кошуся» ласково его называем), а грамматические — одинаковые (родительный падеж, множественное число).

Аналогично мы можем поступить со словом «мир». Формы того же самого слова: дом-а, дом-у, дом-ом, дом-ами, дом-ах. Образованные от него слова с другим значением (то же значение плюс выражение нашего отношения или уточнение размера): дом-ик, дом-ин-а, дом-ищ-е.

Словообразующие и формообразующие морфемы

Как можно увидеть, лексическое значение здесь изменяется с помощью суффикса, а грамматическое – с помощью окончания. Но это не значит, что суффикс может менять только лексическое значение. Например, в слове «ходи-л-а» суффикс -л- – это суффикс прошедшего времени глагола «ходить», то есть с его помощью не образуется новое слово, а образуется его форма.

Таким образом, есть такие части слова, с помощью которых образуются новые слова – это словообразующие морфемы, и такие, при помощи которых меняются, образуются формы слова – это формообразующие морфемы. Окончание (флексия) – это формообразующая морфема.

В каких словах может быть окончание

Отсюда мы можем сделать следующий логический вывод. Если окончание – это формообразующая морфема, то есть часть слова, меняющая его формы, значит, оно может быть только в тех словах, которые изменяются. Перебирать случайный ряд слов в поисках слов с окончаниями нерационально. Их нужно искать среди слов определенных категорий, а именно – среди определенных частей речи. Скажем, имена существительные в большинстве своем изменяемые, а значит, у них есть окончания.

Слова без окончания. Примеры

Однако существуют такие слова, которые не меняют своей формы. А значит, это слова без окончания. Примеры нужно искать среди слов определенных грамматических групп. Например, это наречия. Как известно, это неизменяемая часть речи, значит, у наречий нет окончаний: весело, терпеливо, находчиво (собака весело бежала за нами; мама терпеливо слушала дочку; в спорах этот человек всегда находчиво изворачивался).

Наречия следует отличать от кратких форм прилагательных среднего рода: «Это предложение было находчиво и остроумно». Здесь конечное -о является окончанием, указывающим на средний род и единственное число.

Проверка наличия окончания

Доказать, что в кратких прилагательных -о – это окончание, легко. Нужно изменить слово: «Эта реплика была находчива и остроумна». Конечное -о заменилось на конечное -а, которое указывает на женский род. Прилагательное изменило свою форму, чтобы согласоваться в форме рода с существительным.

Соответственно, есть только один способ того, как определить слова без окончания. Если невозможно образовать формы слова, значит, у слова нет окончания.

Нулевое окончание

Так же легко «вычисляются» и слова с нулевым окончанием. Правило здесь простое: если слово имеет формы (изменяется), и на месте «немого» окончания появляется окончание, выраженное звуками, значит, видимое отсутствие флексии – это нулевое окончание.

Допустим, слово «мир» заканчивается согласной корня Р, после нее в слове ничего не звучит. Однако стоит изменить это слово: мира, миры, миром, мирами, как мы видим, что после корня появляется звучащее окончание. Значит, его отсутствие в именительном падеже единственного числа мнимое, на самом деле вместо произносимых звуков там есть пустое окно, пустая клетка, которая в любой момент может заполниться. Более того, именно по тому, что она не заполнена, мы и определяем падеж и число. Это пример «минус-знака». Немота окончания в данном случае значима не меньше, чем его определенное звучание.

Примеров таких значимых отсутствий много и в жизни. Скажем, над входом кафе в рабочие часы может зажигаться вывеска с его названием. Тогда, если лампочки не горят (молчат), для потенциальных посетителей это означает, что кафе закрыто. Если не горит зеленый свет светофора, это не значит, что его вообще нет, его «молчание» — значимое.

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

Если вы входите домой и кричите: «Кто дома?», то молчание будет для вас знаком того, что домашние еще отсутствуют. Об этом же может говорить темное окно.

Нулевое окончание и отсутствие окончания

Таким образом, нулевое окончание – это своего рода «выключенная» морфема. Ее выключили, чтобы выразить ее «молчанием» определенное значение. В словах «рук-(-)», «ног-(-)», «голов-(-)», «туч-(-)» это пустое, «негорящее» окно означает родительный падеж множественного числа. В глаголах «ходил-(-)», «говорил-(-)», «пел-(-)» – мужской род единственного числа. Во всех этих словоформах есть окончание, но оно выражено нулем звука.

Поэтому неправильно будет сказать, например, что «рук» – это слово без суффикса и окончания. Суффикса здесь действительно нет, а вот окончание есть. Звучание слова заканчивается звуком «к», а его состав, фактические границы – морфемой, выраженной нулевым звуком.

Отсутствие окончания, в отличие от присутствия нулевого, – это место за границами слова. Оно не противопоставлено «включенному» окончанию, так как грамматическая природа этого слова вообще не предполагает окончания. Хорошо, боязливо, под, с, углубляясь – все это примеры слов без окончания.

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

примеры. Слова с нулевым окончанием

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

Главный критерий

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

Если слова не приспосабливать друг к другу

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

Например, русский малыш может говорить: «Мама баи» («Мама спит»), «Машинка тю-тю» («Машинка уехала», «Машинки нет», «Машинка пропала»), «Киса бах» («Киса упала»). Слова «баи», «тю-тю», «бах» не только не имеют возможности как-то измениться, но и не нуждаются в этом. Они могут с равным успехом сочетаться с существительными разного рода и числа: «Дед баи», «Машинки тю-тю», «Котик бах». Предложения с такими словами не выглядят «неправильными», а воспринимаются как «детские».

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

Изменяемые и неизменяемые слова в детской речи

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

Во втором случае такой универсальной правильной формы у глагола нет. Каждый раз сочетаясь с существительными разного рода и числа, глагол должен как-то измениться, чтобы получилось правильное словосочетание. У глагола есть для этого возможности, так как у него есть окончание: меняясь, оно меняет форму глагола.

Изменяемые и неизменяемые слова во «взрослом» языке

В общем-то, во «взрослом» языке все обстоит приблизительно так же. Одна часть слов, имея окончания, подразумевает свое изменение, чтобы приспосабливаться к другим словам, а другая часть, не имея окончания, не может изменяться, а сочетаясь с другими словами, остается неизменной.

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

А наречие «далеко», напротив, не подразумевает никаких изменений и, образуя словосочетание с глаголами, никак не меняется: «далеко ушла», «далеко выскочил», «далеко убежали», «далеко уйду» и т. д.

Окончания и формы слов

О форме слова принято говорить только тогда, когда оно может ее менять, то есть когда у него есть окончание. У имени прилагательного «симпатичный» ровно столько форм, сколько окончаний. А у наречия «далеко» нет ни окончания, ни форм.

Формы слова, которое изменяется, принято называть словоформами. Все они для одного и того же слова называются парадигмой словоизменения. Это одно и то же слово, но представленное во всем богатстве своих форм, каждая из которых отличается друг от друга грамматическим значением. Например, у словоформы «симпатичный» такое грамматическое значение: именительный падеж, мужской род, единственное число. А словоформы «симпатичными» следующее грамматическое значение: творительный падеж, множественное число. Слова, имеющие нулевое окончание, заведомо являются словоформами, так как любое окончание, в том числе нулевое, призвано образовывать словоформу.

Окончания и грамматическое значение

Формально (зрительно и на слух) эти словоформы отличаются друг от друга именно окончаниями, и именно окончания дают или отбирают у слова то или иное грамматическое значение.

Так, если говорить об окончании «ый» слова «симатичный», то именно оно имеет все перечисленные грамматические значения (как приставка «от» в слове «отбежать» имеет значение «удаления»).

Каждое окончание имеет свое грамматическое значение и может его сообщить словоформе. Однако, разумеется, на это есть жесткие ограничения. Например, окончание «ыми» не может дать значение «творительный падеж, множественное число» существительному «собака», так как у него совсем другая парадигма окончаний.

То же можно сказать про слова с нулевым окончанием. Примеры: нулевое окончания слова «ночь» имеет значение «именительный падеж, единственное число».

Нет звуков, но есть окончание

Если слово изменяемое, значит, у него обязательно есть окончание, абсолютно во всех формах. И неважно, выражено это окончание звуками (буквами) или нет. В большом количестве случаев окончание представлено, как принято говорить, «нулем звука»: после основы нет звуков, однако это не значит, что нет окончания.

Например, в слове «пёс» за корнем не следует никакого звука, однако окончание у этого слова как у изменяемой части речи есть, именно такое окончание называется «нулевым»: пёсØ.

Значение этой словоформы – именительный падеж, единственное число существительного, имеющего мужской род. Нулевое окончание легко «почувствовать», если понять, что именно из-за того, что на месте окончания в данном случае «ноль звука», слово воспринимается как имеющее именно это грамматическое значение. Значит, «ноль звука» здесь имеет значение «именительный падеж, единственное число» существительного мужского рода.

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

Значимое отсутствие

Таким образом, такое отсутствие нельзя назвать отсутствием в собственном смысле слова. Отсутствует окончание у наречия «славно», деепричастия «заевшись», предлога «в», частицы «не». У слова «пёс» окончание не отсутствует, а представлено «нулем звука». А нулевые окончания глаголов образуют форму прошедшего времени единственного числа (нес, вез, мыл), и нельзя говорить, что у этих слов нет окончания.

Само по себе отсутствие здесь является значимым, знаковым. Это можно сравнить с массой чисто бытовых случаев. Например, мы часто договариваемся друг с другом: «Если будет что-то не так, я перезвоню. А если я не позвоню, значит, все в порядке, все идет по плану».

Так же и здесь: если у слова «пёс» окончание представлено «нулем звука», значит, его форма – именительный падеж, единственное число.

Как не спутать «значимое» отсутствие с обычным

Договорившись о том, что, если все в порядке и все идет по плану, нам не перезвонят, мы в назначенное время часто начинаем беспокоиться: а вдруг отсутствие звонка – это не знак того, что все в порядке, а наш партнер просто не может позвонить?

Приблизительно поэтому же часто возникает путаница и с тем, как отличить нулевое окончание от его отсутствия. Как уже говорилось в самом начале статьи, самый главный критерий простой: слова с нулевым окончанием изменяются, а без них – нет.

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

При этом важно внимательно относиться к изменению: нужно изменять именно то же самое слово (то есть менять только грамматическое значение), а не образовывать новые. Так, прилагательное «удобная» – это не форма наречия «удобно». При изменении формы слова его часть речи, разумеется, должна оставаться такой же.

Неизменяемые слова

Для уверенности в том, что перед вами — нулевое окончание или его отсутствие, очень важно ориентироваться в том, слова каких частей речи – неизменяемые.

К неизменяемым словам относятся следующие:

  • Наречия (наречие – это неизменная часть речи, поэтому нельзя говорить, что у наречия есть нулевое окончание). Примеры: устало, удобно, вмиг, радостно, прекрасно, плохо, грустно, около, далеко. Обратите внимание, что наречия далеко не всегда заканчиваются на «о»: недаром, спьяну, сгоряча, поневоле, вчера, весной, чуть-чуть, много, втройне, дважды, вчетвером, сейчас, утром, завтра, днём, позже, погодя, всегда, вечером, ночью, там, вблизи, здесь, налево, вперед, навстречу, сбоку, вплавь, ползком, вперемешку, навзничь…

Коварным является сходство наречий и некоторых форм прилагательных и глаголов: «Мама устало присела на край дивана» (устало — наречие). «Солнце будто устало и очень быстро скрылось за тучами» (устало — глагол).

  • Деепричастия (деепричастие – неизменяемая часть речи, у этих слов также отсутствует нулевое окончание). Примеры: прильнув, взявшись, коснувшись, заработав, прочитывая.
  • Начальная форма глагола (в той научной и методической системе координат, где –ть и –ти считаются суффиксами, а не окончаниями), например: спать, мечтать, воспитывать, слушать, печатать, дрессировать, любить.
  • Сравнительные формы прилагательных и наречий: смышленее, краснее.
  • Все служебные части речи.
  • Все междометия.
  • Все звукоподражательные слова: гав-гав, мяу-мяу. Иногда авторами художественных текстов нарочито обыгрываются подобные слова за счет их изменения: «Все кукареки уже отзвучали, а он еще спал».
  • Несклоняемые имена существительные, например: авто, пальто, барокко, такси, кофе. Правда, есть точка зрения, что у этих слов есть окончания: именно потому, что это существительные (в школьной программе обычно такая точка зрения не рассматривается).
  • Несклоняемые имена прилагательные, например: бордо, хаки.
  • Притяжательные местоимения, которые указывают на принадлежность третьему лицу, например: их, её, его.

Эти группы слов запомнить, в общем-то, несложно, но в сложных случаях или случаях неуверенности дополнительным критерием, как уже говорилось, будет возможность изменить конкретное слово.

нулевые, двойные, в середине и в конце

Для чего служит окончание? И вообще что такое окончание в русском языке? Окончание это отдельная единица русского языка, обычно стоящая в самом конце, указывающая на определенную связь. Также окончание это поддающаяся изменениям часть слова, следующая за корнем или суффиксом, предназначенная для выражения грамматических различий, связующая словосочетания, предложения. Оно выполняет роль сигнализатора, воздействующего на спряжение, склонение.

Таблица окончаний падежей

ПадежНа какой вопроса отвечает?Изменение окончания
ИменительныйКто? Что?Степлер_ / Трава
РодительныйКого? Чего?Степлера / Травы
ДательныйКому? Чему?Степлеру / Траве
ВинительныйКого? Что?Степлер_ / Траву
ТворительныйКем? Чем?Степлером / Травой
ПредложныйО ком? О чем?О степлере / О траве

Образование форм изменяемых слов 

Так все-таки что такое окончание и какие функции выполняет? Окончание, как мы подчеркнули ранее, предполагает образование новых форм слова.

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

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

Какие бывают окончания

  • падежные;
  • двойные;
  • нулевые.

 Отсутствие окончаний у неизменяемых слов 

Не многим известно, но существуют отдельные ответвления слов, не имеющих окончания и слова с нулевым окончанием. Обычно объяснимо подобное явление тем, что данные слова были заимствованы из других языков.

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

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

Различия нулевого окончания и его полного отсутствия

К сожалению, запутаться в данной теме довольно просто. Нередко и у взрослых возникают ошибки в определение нулевого окончания, да даже просто правильного окончания. Видя перед собой документацию, они судорожно пытаются вспомнить «Что такое окончание в русском языке? И как его правильно определить?». Так делать не стоит. Учите весь материал вовремя.

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

Чтобы понять, к какому разряду относится какое-либо слово, необходимо попробовать изменить его, просклонять. Если, воспользовавшись этим способом, вы, например, обнаружили окончание «е» в какой-либо падежной форме, значит, данной слово относится к группе «слова с нулевым окончанием». Если же после разбора оно так и осталось неизменным, следовательно, окончание полностью отсутствует. Старайтесь быть предельно внимательными, когда дело касается этой темы!

Расположение окончания внутри слова

Навряд ли вам приходилось сталкиваться с явлением, когда оно располагается внутри слова, но оно также имеет место быть. Более привычное дело, когда оно находится в самом конце. К тому же большинство слов именно так и сформировано.

Сегодня мы познакомимся со сложными числительными, имеющими целых два корня. Их совсем несложно выявить: от пятидесяти до восьмидесяти и от двухсот до девятисот. Необходимо также отметить, что в двух последних вариациях представлены слова с нулевым окончанием.

Разумеется, крайне непривычно встречать окончание в середине слова. Но забывать про них ни в коем случае нельзя, поскольку, если вдруг аналогичные слова встретятся на экзамене, вы просто растеряетесь. И это совершенно нормальная реакция, так как тема серединных окончаний обычно игнорируется учителями по непонятным причинам. Так что ваша задача — лишь запомнить, что и такие случаи возможны. И спокойно действовать на работе, не волнуясь, не переживая.

Важным моментом также является склонение данных числительных. Когда вы изменяете падежную форму, задействуются оба окончания. И не всегда они совпадают друг с другом. Это тоже стоит отложить в голове на будущее.

Двойное окончание в слове

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

И если вы попробуете изменить их, заметите, что изменения влекут за собой обе части слова. Разумеется, это касается не всех сложных слов. У некоторых все же изменяется только одна часть, поскольку у другой попросту отсутствует окончание в слове.

Про эти правила не стоит забывать, если вы хотите получить хорошую оценку на экзамене. Можете даже выписать их в блокнот, чтобы время от времени повторять. Таким образом, заложив материал на долгие годы. Усердно готовьтесь ко всем экзаменам, чтобы уже после его начала, не возникало вопросов «Что такое окончание?». Удачи!

Строка с завершающим нулем — обзор

5.4.5 Вызов подпрограмм

Указатель стека (), регистр связи () и счетчик программы () вместе с регистрами аргументов участвуют в выполнении вызовов подпрограмм. Вызывающая подпрограмма должна помещать аргументы в регистры аргументов и, возможно, также в стек. Размещение аргументов в их правильных местах известно как маршалинг аргументов. После маршалинга аргументов вызывающая подпрограмма выполняет инструкцию, которая изменяет счетчик программы и регистр связи.Инструкция копирует содержимое программного счетчика в регистр связи, затем загружает программный счетчик с адресом первой инструкции в вызываемой подпрограмме. Затем ЦП получит и выполнит свою следующую инструкцию по адресу в счетчике программ, который является первой инструкцией вызываемой подпрограммы.

Наши первые примеры вызова функции будут включать функцию из стандартной библиотеки C. Поначалу функция может немного сбивать с толку, но это чрезвычайно полезная и гибкая функция для печати форматированного вывода.Первый аргумент — это адрес строки формата , которая является строкой ASCII с завершающим нулем. Функция проверяет строку формата, чтобы определить, сколько других аргументов ей было передано. Строка формата может включать спецификаторы преобразования, которые начинаются с символа.

Для каждого спецификатора преобразования предполагается, что аргумент был передан в правильный регистр или место в стеке. Аргумент извлекается, преобразуется в соответствии с указанным форматом и печатается.Спецификатор формата приводит к тому, что соответствующий аргумент печатается как десятичное число со знаком. Другие спецификаторы включают в себя печать соответствующего аргумента в виде целого числа в шестнадцатеричном формате, печать соответствующего аргумента в виде символа ASCII и печать строки с завершающим нулем. Спецификаторы целых чисел могут включать необязательную спецификацию ширины и заполнения нулями. Например, напечатает целое число в шестнадцатеричном формате, используя восемь символов. Любые ведущие нули будут напечатаны как пробелы. Строка формата также будет печатать целое число в шестнадцатеричном формате с использованием восьми символов, но в этом случае все ведущие нули будут напечатаны как нули.Точно так же может использоваться для печати целого числа по основанию десять с использованием пробелов для заполнения числа до пятнадцати символов, в то время как для печати целого числа по основанию десять с использованием нулей для заполнения до пятнадцати символов.

В листинге 5.21 показан вызов в C. Функция требует один аргумент, но может принимать более одного. В этом случае есть только один аргумент — строка формата. Поскольку строка формата не содержит спецификаторов преобразования, не требует дополнительных аргументов. В листинге 5.22 показан эквивалентный вызов, сделанный на языке ассемблера AArch64.Единственный аргумент (адрес строки формата) загружается в соответствии с соглашением о вызове подпрограммы AArch64.

5.4.5.1 Передача аргументов в регистры

В листинге 5.23 показан вызов в C с четырьмя аргументами. Строка формата — это первый аргумент. Строка формата содержит три спецификатора преобразования, за которыми следуют еще три аргумента. Аргументы сопоставляются со спецификаторами преобразования в соответствии с их положением. Тип каждого аргумента соответствует типу, указанному в спецификаторе преобразования.Первый спецификатор преобразования применяется ко второму аргументу, второй спецификатор преобразования применяется к третьему аргументу, а третий спецификатор преобразования применяется к четвертому аргументу. Спецификаторы преобразования указывают, что аргументы должны интерпретироваться как целые числа и выводиться с десятичным основанием. В листинге 5.24 показан эквивалентный вызов, сделанный на языке ассемблера AArch64. Аргументы загружаются и в соответствии с соглашением о вызове подпрограммы AArch64.

Пока необходимо передать восемь или меньше аргументов, все они могут поместиться в регистры, но когда аргументов больше, все становится немного сложнее.Все оставшиеся аргументы должны быть переданы в стек программы. Необходимо следить за тем, чтобы аргументы помещались в стек в правильном порядке. Кроме того, после вызова функции аргументы должны быть удалены из стека, чтобы указатель стека был восстановлен до исходного значения. Сложность заключается в том, что на процессорах AArch64 стеку разрешено увеличиваться или уменьшаться только с шагом в 16 байт.

5.4.5.2 Передача аргументов в стеке

В листинге 5.25 показан вызов в C, имеющий более восьми аргументов.Строка формата — это первый аргумент. Строка формата содержит десять спецификаторов преобразования, что означает, что за строкой формата должны следовать десять дополнительных аргументов. Аргументы сопоставляются со спецификаторами преобразования в соответствии с их положением. Тип каждого аргумента должен соответствовать типу, указанному в спецификаторе преобразования. Первый спецификатор преобразования применяется ко второму аргументу, второй спецификатор преобразования применяется к третьему аргументу, третий спецификатор преобразования применяется к четвертому аргументу и так далее.Спецификаторы преобразования указывают, что аргументы должны интерпретироваться как целые числа и выводиться с десятичным основанием.

В листинге 5.26 показан эквивалентный вызов, сделанный на языке ассемблера AArch64. Поскольку существует одиннадцать аргументов, последние три должны быть помещены в стек программы. Аргументы загружаются, а затем аргументы сохраняются в стеке в обратном порядке. Несмотря на то, что каждый параметр имеет размер 4 байта, они помещаются в стек, используя восемь байтов каждый. Четыре верхних байта — это заполнители.Обратите внимание, что одиннадцатый аргумент помещается в стек в более высоком месте, чем девятый и десятый аргументы. Строка 10 уменьшает указатель стека на 32 байта, обеспечивая место для четырех 8-байтовых двойных слов. Это необходимо, потому что указатель стека AArch64 должен всегда находиться на границе с 16 байтами. Поскольку у нас есть три 8-байтовых аргумента для отправки, мы должны выделить 32 байта, округляя до следующей 16-байтовой границы. Затем он сохраняет по адресу указателя стека и на восемь байтов выше него.Строка 11 хранит 16 байтов над (уменьшенным) указателем стека. Остальные аргументы загружаются. Обратите внимание, что мы предполагаем, что ранее было определено использование директивы ассемблера или.

В листинге 5.27 показано, как одиннадцатый, десятый и девятый аргументы могут быть помещены в стек с помощью инструкции и инструкции. Это было бы немного эффективнее, чем код, показанный в Листинге 5.26. Одиннадцатый аргумент загружается, десятый аргумент загружается, а девятый аргумент загружается, затем инструкция используется для сохранения в стеке и настройки указателя стека.После сохранения в стеке обратите внимание, что они были размещены в обратном порядке.

Необходимо немного позаботиться о том, чтобы аргументы сохранялись в стеке в правильном порядке. Помните, что инструкция всегда подталкивает первый регистр к младшему адресу, и стек увеличивается вниз. Следовательно, девятый аргумент будет помещен в стек первым. Поскольку используется предварительная индексация, фактически выполняется самый высокий адрес. Используется 64-битная нотация, потому что в противном случае оба регистра будут храниться всего в 8 байтах, а требуется 16 байтов.Кроме того, инструкции не важны остальные биты для каждого типа int, они просто обрабатываются как заполнение в стеке. Более того, регистр имеет нули в старших 32-битных битах, потому что 32-битные операции, такие как обнуление старших битов, если они явно не расширяются по знаку с помощью инструкции вроде Наконец, стек всегда должен быть выровнен по 16 байтам, поэтому он сдвигается вниз на 32 байта вместо 24.

После вызова функции девятый, десятый и одиннадцатый аргументы должны быть извлечены из стека.Если эти значения больше не нужны, их не нужно загружать в регистры. Самый быстрый способ вытащить их из стека — просто вернуть указатель стека к его исходному значению. В этом случае мы поместили в стек три аргумента, используя в общей сложности 32 байта (для каждого аргумента требовалось 8 байтов, но стеку разрешено увеличиваться или уменьшаться только в количестве, кратном 16 байтам). Поэтому все, что нам нужно сделать, это добавить к указателю стека тридцать два, восстановив тем самым его исходное значение.

Что произошло, если мы не добавили ‘\ 0’ в конец строки в C?

Если вы не укажете '\ 0' в конце списка инициализаторов, заключенных в скобки, разделенные запятыми, технически full_name не является строкой , поскольку массив char не завершается нулевым символом в конце.

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

Итак, в случае определения типа

  char full_name [] = {
    'чтобы'
};
  

размер массива равен 4, и в нем 't' , 'o' , 'a' , 'n' .

OTOH, в случае

  char full_name [] = "toan";
  

full_name будет иметь размер 5 и содержать 't' , 'o' , 'a' , 'n' и '\ 0' .

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

В вашем конкретном примере для описателя формата % s с printf () , цитируя стандарт C11 , глава §7.21.6.1, fprintf () Описание функции ( выделено мной )

s
Если модификатор длины l отсутствует, аргумент должен быть указателем на начальный
элемент массива символьного типа. 280) Символы из массива
записывается до (но не включая) завершающего нулевого символа
. Если
указана точность, записывается не более указанного количества байтов. Если
точность не указана или превышает размер массива, массив должен
содержат нулевой символ.

Это означает, что printf () будет искать нулевой ограничитель, чтобы отметить / понять конец массива. В вашем примере отсутствие нулевого терминатора приведет к тому, что printf () выйдет за пределы выделенной памяти ( full_name [3] ) и получит доступ к внеограниченной памяти ( full_name [4] ), что приведет к вызвать УБ.

практик программирования — всегда ли строки C оканчиваются нулем или это зависит от платформы?

Другие исследователи обращались к проблеме, заключающейся в том, что в C строки — это в основном то, что вы из них делаете. Но, похоже, в вашем вопросе есть некоторая путаница. сам терминатор, и, с одной стороны, это может быть то, о чем кто-то в вашем положении беспокоится.

строки C заканчиваются нулем. То есть они заканчиваются нулевым символом NUL .Они не завершаются нулевым указателем NULL , который представляет собой совершенно другой тип значения с совершенно другой целью.

NUL гарантированно будет иметь нулевое целочисленное значение. Внутри строки он также будет иметь размер базового символьного типа, который обычно равен 1.

NULL вообще не гарантирует целочисленного типа. NULL предназначен для использования в контексте указателя и обычно должен иметь тип указателя, который не должен преобразовываться в символ или целое число, если ваш компилятор хоть сколько-нибудь хорош.Хотя определение NULL включает глиф 0 , не гарантируется, что оно действительно будет иметь это значение [1], и если ваш компилятор не реализует константу как односимвольную #define (многие этого не делают, потому что NULL на самом деле не должно иметь смысла в контексте, не являющемся указателем), поэтому не гарантируется, что расширенный код фактически включает нулевое значение (даже если он, как ни странно, включает нулевой глиф).

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

Теперь большинство людей увидят это и подумают: «нулевой указатель — это что-то другое, кроме нулевых битов? Что за чушь», — но подобные предположения безопасны только на распространенных платформах, таких как x86. Поскольку вы явно указали на заинтересованность в нацеливании на другие платформы, вам необходимо принять во внимание эту проблему, поскольку вы явно отделили свой код от предположений о природе взаимосвязи между указателями и целыми числами.

Следовательно, хотя строки C заканчиваются нулем, они заканчиваются не NULL , а NUL (обычно записывается как '\ 0' ). Код, который явно использует NULL в качестве признака конца строки, будет работать на платформах с простой структурой адресов и даже будет компилироваться со многими компиляторами, но это абсолютно неверно C.


[1] фактическое значение нулевого указателя вставляется компилятором при чтении токена 0 в контексте, в котором он будет преобразован в тип указателя.Это не преобразование целого числа в значение 0, и его сохранение не гарантируется, если используется что-либо, кроме самого маркера 0 , например, динамическое значение из переменной; преобразование также необратимо, и нулевой указатель не должен возвращать значение 0 при преобразовании в целое число.

JNI04-J. Не предполагайте, что строки Java оканчиваются нулем — SEI CERT Oracle Coding Standard для Java

Согласно [Советы JNI], раздел «Строки UTF-8 и UTF-16», Java использует строки UTF-16, которые не заканчиваются нулем.Строки UTF-16 могут содержать \ u0000 в середине строки, поэтому необходимо знать длину строки при работе со строками Java в машинном коде.

JNI предоставляет методы, которые работают с измененным UTF-8 (см. [API 2013], Интерфейс DataInput, раздел «Измененный UTF-8»). Преимущество работы с модифицированным UTF-8 заключается в том, что он кодирует \ u0000 как 0xc0 0x80 вместо 0x00. Это позволяет использовать строки в стиле C с завершающим нулем, которые могут обрабатываться строковыми функциями стандартной библиотеки C.Однако нельзя ожидать, что произвольные данные UTF-8 будут правильно работать в JNI. Данные, передаваемые в функцию NewStringUTF () , должны быть в формате Modified UTF-8. Символьные данные, считанные из файла или потока, не могут быть переданы в функцию NewStringUTF () без фильтрации для преобразования символов высокого ASCII в модифицированный UTF-8. Другими словами, символьные данные должны быть нормализованы до Modified UTF-8 перед передачей в функцию NewStringUTF () . (Для получения дополнительной информации о нормализации строк см. IDS01-J.Нормализовать строки перед их проверкой. Обратите внимание, однако, что это правило в основном касается нормализации UTF-16, тогда как здесь вызывает беспокойство модифицируемая нормализация UTF-8.)

Пример несоответствующего кода

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

Соответствующее решение

В этом совместимом решении .. .

Оценка риска

Если символьные данные не нормализованы перед передачей в функцию NewStringUTF () , могут быть получены ошибочные результаты.

4

4 Уровень

07

Вероятный

Правило

Серьезность

Вероятность

Стоимость восстановления

Приоритет

07

Приоритет

07

Средний

P4

L3

Автоматическое обнаружение

Может быть возможно автоматически определить, были ли символьные данные из ненадежных переданных источников в строку 900, нормализованы, прежде чем они будут нормализованы. () функция.

Библиография


В чем смысл строк с завершающим нулем?

Вопрос задан • 06.05.19

Насколько я люблю C и C ++, я не могу не почесать голову при выборе строк с нулевым завершением: * Строки с префиксом длины (например, Pascal) существовали до C * Строки с префиксом длины делают несколько алгоритмов быстрее, обеспечивая постоянную длину уважать.* Строки с префиксом длины затрудняют возникновение ошибок переполнения буфера. * Даже на 32-битной машине, если вы позволяете строке быть размером доступной памяти, строка с префиксом длины будет только на три байта шире, чем строка с завершающим нулем. На 16-битных машинах это один байт. На 64-битных машинах разумным пределом длины строки является 4 ГБ, но даже если вы хотите расширить его до размера машинного слова, 64-битные машины обычно имеют достаточно памяти, что делает дополнительные семь байтов своего рода нулевым аргументом.Я знаю, что исходный стандарт C был написан для безумно плохих машин (с точки зрения памяти), но аргумент эффективности мне здесь не подходит. * Практически любой другой язык (например, Perl, Pascal, Python, Java, C # и т. Д.) используйте строки с префиксом длины. Эти языки обычно превосходят C в тестах обработки строк, потому что они более эффективны со строками. * C ++ немного исправил это с помощью шаблона `std :: basic_string`, но простые символьные массивы, ожидающие строки с завершающим нулем, все еще широко распространены.Это также несовершенно, потому что требует выделения кучи. * Строки с нулевым завершением должны зарезервировать символ (а именно, null), который не может существовать в строке, в то время как строки с префиксом длины могут содержать встроенные нули. позже, чем C, поэтому C было бы разумно не знать о них. Однако некоторые из них были простыми задолго до появления C. Почему строки с нулевым завершением были выбраны вместо явно превосходящего префикса длины? ** РЕДАКТИРОВАТЬ **: Поскольку некоторые запрашивали * факты * (и им не нравились те, которые я уже предоставил) в моей точке эффективности выше, они происходят из несколько вещей: * Concat с использованием строк с завершающим нулем требует временной сложности O (n + m).Для префикса длины часто требуется только O (m). * Длина с использованием строк с завершающим нулем требует временной сложности O (n). Префикс длины — O (1). * Длина и объединение являются наиболее распространенными строковыми операциями. Есть несколько случаев, когда строки с нулевым завершением могут быть более эффективными, но это происходит гораздо реже. Из ответов ниже, это некоторые случаи, когда строки с нулевым завершением более эффективны: * Когда вам нужно обрезать начало строки и вам нужно передать его какому-нибудь методу. Вы не можете сделать это за постоянное время с префиксом длины, даже если вам разрешено уничтожить исходную строку, потому что префикс длины, вероятно, должен соответствовать правилам выравнивания.* В некоторых случаях, когда вы просто просматриваете строку символ за символом, вы можете сохранить регистр процессора. Обратите внимание, что это работает только в том случае, если вы не выделили строку динамически (потому что тогда вам придется освободить ее, что потребует использования сохраненного вами регистра ЦП для хранения указателя, который вы изначально получили от malloc и друзей). приведенные выше почти так же распространены, как length и concat. В приведенных ниже ответах утверждается еще одно: * Вам нужно отрезать конец строки, но это неверно — это такое же количество времени для строк с завершающим нулем и строк с префиксом длины .(Строки с нулевым завершением просто вставляют нуль там, где вы хотите, чтобы новый конец был, префиксы длины просто вычитаются из префикса.)

Картер А.
ответил • 10.05.19

Опытный разработчик программного обеспечения, свободно владеющий объектно-ориентированным C ++

C был первоначально разработан и разработан в Bell Labs как язык для написания UNIX.Оба должны были быть портативными. Как программист на ассемблере в то время я помню, как все время использовал буферы символов с завершающим нулем, потому что программы, которые я модифицировал, уже делали это именно так. C должен был быть близок к ассемблеру, поэтому я подозреваю, что они оставили его таким. Только Керниган или Ричи точно знают, почему это было сделано именно так. автор вопроса, кажется, полагает, что для этого была какая-то логическая причина. Я очень сомневаюсь, что это было так.

Все еще ищете помощь? Получите правильный ответ быстро.

ИЛИ

Найдите онлайн-репетитора сейчас

Выберите эксперта и познакомьтесь онлайн.
Никаких пакетов или подписок, платите только за необходимое время.


¢

£
¥

µ
·

§

SS


«
»
< >




¯

¤
¦
¨
¡
¿
ˆ
˜
°

±
÷

×
ƒ















¬







*


´
¸
ª
º


А
Á
Â
Ã
Ä
Å
Æ
Ç
È
É
Ê
Ë
Я
Я
Я
Я
Ð
Ñ
Ò
Ó
Ô
Õ
Ö
Ø
Œ
Š
Ù
Ú
Û
Ü
Ý
Ÿ
Þ
à
á
â
ã
ä
å
æ
ç
è
é
ê
ë
я
я
я
я
ð
ñ
ò
ó
ô
х
ö
ø
œ
š
ù
ú
û
ü
ý
þ
ÿ
Α
Β
Γ
Δ
Ε
Ζ
Η
Θ
Ι
Κ
Λ
Μ
Ν
Ξ
Ο
Π
Ρ
Σ
Τ
Υ
Φ
Χ
Ψ
Ω
α
β
γ
δ
ε
ζ
η
θ
ι
κ
λ
μ
ν
ξ
ο
π
ρ
ς
σ
τ
υ
φ
χ
ψ
ω

ϖ

ϒ





























CA-Clipper 5.]
[Следующая запись >>]
[Меню]
[О руководстве]


   ЗВОНИТЕ * 
 Выполнить процедуру C или Assembler
-------------------------------------------------- ----------------------------
   Синтаксис 

       CALL  [WITH ] 

   Аргументы 

         - это имя внешней процедуры для CALL.

       WITH <список выражений>  - необязательный список, содержащий до семи выражений
     любой тип данных, передаваемый внешней процедуре. Описание 

     CALL выполняет отдельно скомпилированную или собранную процедуру. В
     процедура должна быть определена как FAR и заканчиваться инструкцией возврата FAR.
     Поместите параметры в стек, используя соглашение о передаче параметров C.
     Каждый параметр состоит из FAR (четырехбайтового) указателя на фактический
     значение параметра. При необходимости вы можете использовать функцию WORD () для передачи
     двухбайтовое двоичное значение в выражении WITH.DX: BX и ES: BX
     регистры также содержат копию первых четырех байтов параметра
     Информация.

     Процедура должна сохранять регистры BP, SS, SI, DI, ES и DS как
     а также снять флаг направления.

     CALL - это команда совместимости, поэтому не рекомендуется. это
     заменен системой Extend, которая предоставляет функции для передачи
     данные в и из CA-Clipper.

   Банкноты 

      .Символьные строки:  Передать символьный аргумент как указатель FAR
        в строку с завершающим нулем (строка с шестнадцатеричным байтом 00 в конце).

      . Числовые значения:  Передавать каждый числовой аргумент как указатель FAR
        в восьмибайтовое значение с плавающей запятой IEEE. Чтобы передать параметр как
        целое число, используйте функцию WORD (). Функция WORD () преобразует
        числовое значение в двухбайтовое двоичное целое число и передает
        целочисленное значение напрямую, а не через указатель.Обратите внимание, что
        WORD () не будет работать для значений вне диапазона # 32,767, так как
        эти значения не могут быть точно представлены как двухбайтовые целые числа.

      . Значения даты:  Передавать каждый аргумент даты как указатель FAR на
        четырехбайтовое (длинное) целое число, содержащее номер дня по юлианскому календарю.

      . Логические значения:  Передавать каждый логический аргумент как указатель FAR
        в двухбайтовое двоичное целое число, содержащее ноль для false (.F.) и один
        для истины (.T.).

      . Компиляция и компоновка:  ВЫЗВАННЫХ программ должны соответствовать
        следующие правила:

          -  Процедуры должны быть в перемещаемом объектном файле INTEL 8086
           формат с расширением файла .OBJ.

          -  Процедуры должны следовать за вызовом C и передачей параметров
           условности.

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

      . Положение на экране:  При использовании оператора CALL для доступа к C или
        Ассемблер, курсор устанавливается в текущую позицию экрана.
        в программе C или Assembler.

      . Microsoft C:  Microsoft C версии 5.0 и выше помещает
        подчеркивание в начале имен функций при их компиляции.Звонить
        их, следовательно, вы должны ВЫЗВАТЬ _ <функция>.

      . dBASE III PLUS:  Для преобразования модуля нагрузки dBASE III PLUS в
        CA-Clipper-совместимый модуль, добавьте следующие операторы в свой
        .asm файл:

        PUBLIC 

        а также

        нажмите ds
        mov ds, dx

       Предупреждение!  Изменение значений параметров может привести к неправильному или
     неожиданные результаты и поэтому настоятельно не рекомендуется. Файлы  Библиотека - CLIPPER.LIB.

 

См. Также:
СЛОВО()*


Эта страница создана ng2html v1.05, руководством Norton по утилите преобразования HTML.
По сценарию Дэйва Пирсона


Написание правил YARA — документация yara 4.1.0

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

Каждое правило в YARA начинается с ключевого слова rule , за которым следует правило
идентификатор.Идентификаторы должны следовать тем же лексическим соглашениям, что и C
язык программирования, они могут содержать любые буквенно-цифровые символы и символы
символ подчеркивания, но первый символ не может быть цифрой. Правило
идентификаторы чувствительны к регистру и не могут превышать 128 символов. Следующие
Ключевые слова зарезервированы и не могут использоваться в качестве идентификатора:

Правила обычно состоят из двух разделов: определение строк и условие.
Раздел определения строк можно опустить, если правило не полагается на какие-либо
строка, но всегда требуется раздел условия.Определение строк
Раздел — это место, где определяются строки, которые будут частью правила. Каждый
строка имеет идентификатор, состоящий из символа $, за которым следует последовательность
буквенно-цифровые символы и символы подчеркивания, эти идентификаторы можно использовать в
раздел condition для ссылки на соответствующую строку. Строки можно определить
в текстовой или шестнадцатеричной форме, как показано в следующем примере:

Текстовые строки заключаются в двойные кавычки, как и в языке C. Шестигранник
строки заключаются в фигурные скобки и состоят из последовательности
шестнадцатеричные числа, которые могут быть смежными или разделенными пробелами.Десятичный
числа не допускаются в шестнадцатеричных строках.

Раздел условий — это то место, где находится логика правила. Этот раздел должен
содержать логическое выражение, указывающее, при каких обстоятельствах файл или процесс
удовлетворяет правилу или нет. Как правило, условие относится к ранее
определенные строки, используя их идентификаторы. В этом контексте строка
идентификатор действует как логическая переменная, которая оценивает значение true, если строка была
найдено в памяти файла или процесса, или false в противном случае.

Струны

В YARA есть три типа строк: шестнадцатеричные строки, текстовые строки и
регулярные выражения. Шестнадцатеричные строки используются для определения необработанных последовательностей
байтов, в то время как текстовые строки и регулярные выражения полезны для определения
части разборчивого текста. Однако текстовые строки и регулярные выражения могут быть
также используется для представления необработанных байтов с помощью управляющих последовательностей, как будет
показано ниже.

Шестнадцатеричные строки

Шестнадцатеричные строки допускают три особые конструкции, которые делают их более
гибкость: подстановочные знаки, прыжки и альтернативы.Подстановочные знаки — это просто заполнители
что вы можете поместить в строку, указав, что некоторые байты неизвестны, и они
должно соответствовать чему угодно. Знак-заполнитель — это вопросительный знак (?). Здесь
у вас есть пример шестнадцатеричной строки с подстановочными знаками:

 правило подстановочного знака Пример
{
    струны:
        $ hex_string = {E2 34 ?? C8 A? FB}

    условие:
        $ hex_string
}
 

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

Подстановочные знаки полезны при определении строк, содержимое которых может варьироваться, но вы знаете
длина переменных блоков, однако, это не всегда так. В некоторых
обстоятельства, вам может потребоваться определить строки с фрагментами переменного содержимого и
длина. В таких ситуациях вы можете использовать прыжки вместо подстановочных знаков:

 правило JumpExample
{
    струны:
        $ hex_string = {F4 23 [4-6] 62 B4}

    условие:
        $ hex_string
}
 

В приведенном выше примере у нас есть пара чисел в квадратных скобках и
разделенные дефисом, это прыжок.Этот скачок означает, что любой произвольный
Последовательность от 4 до 6 байтов может занимать позицию перехода. Любой из
следующие строки будут соответствовать шаблону:

 F4 23 01 02 03 04 62 B4
F4 23 00 00 00 00 00 62 B4
F4 23 15 82 A3 04 45 22 62 B4
 

Любой прыжок [X-Y] должен соответствовать условию 0 <= X <= Y. В предыдущих версиях YARA и X, и Y должны быть меньше 256, но начиная с YARA 2.0 без ограничений для X и Y.

Это действительные прыжки:

 FE 39 45 [0-8] 89 00
FE 39 45 [23-45] 89 00
FE 39 45 [1000-2000] 89 00
 

Это недействительно:

Если нижняя и верхняя границы равны, вы можете написать одно число в скобках.
в скобках, например:

Вышеупомянутая строка эквивалентна обоим из них:

 FE 39 45 [6-6] 89 00
FE 39 45 ?? ?? ?? ?? ?? ?? 89 00
 

Начиная с YARA 2.0 вы также можете использовать неограниченные прыжки:

 FE 39 45 [10-] 89 00
FE 39 45 [-] 89 00
 

Первый означает [10-бесконечный] , второй означает [0-бесконечный] .

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

 Альтернативы правила Пример 1
{
    струны:
        $ hex_string = {F4 23 (62 B4 | 56) 45}

    условие:
        $ hex_string
}
 

Это правило будет соответствовать любому файлу, содержащему F42362B445 или F4235645 .

Но можно выразить и более двух альтернатив. На самом деле нет
ограничивает количество альтернативных последовательностей, которые вы можете предоставить, и ни
их длина.

 правила Альтернативы Пример 2
{
    струны:
        $ hex_string = {F4 23 (62 B4 | 56 | 45 ?? 67) 45}

    условие:
        $ hex_string
}
 

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

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

Как показано в предыдущих разделах, текстовые строки обычно определяются следующим образом:

 Правило TextExample
{
    струны:
        $ text_string = "foobar"

    условие:
        $ text_string
}
 

Это простейший случай: строка в кодировке ASCII с учетом регистра.Тем не мение,
текстовые строки могут сопровождаться некоторыми полезными модификаторами, которые изменяют способ
что строка будет интерпретироваться. Эти модификаторы добавляются в конец
определение строки, разделенное пробелами, как будет описано ниже.

Текстовые строки также могут содержать следующее подмножество управляющих последовательностей
доступно на языке C:

\ " Двойная кавычка
\ Обратная косая черта
\ r Возврат каретки
\ т Горизонтальная вкладка
\ n Новая линия
\ xdd Любой байт в шестнадцатеричной системе счисления

Во всех версиях YARA до 4.1.0 текстовые строки, принимающие любые типы Unicode
символы, независимо от их кодировки. Эти персонажи были интерпретированы
YARA как необработанные байты, поэтому конечная строка фактически определялась
формат кодирования, используемый вашим текстовым редактором. Это никогда не должно было быть функцией,
исходное намерение всегда заключалось в том, что строки YARA должны быть только ASCII, а YARA
4.1.0 начал выдавать предупреждения о не-ASCII символах в строках. Этот
ограничение не распространяется на строки в разделе метаданных или в комментариях.Видеть
подробнее [здесь] (https://github.com/VirusTotal/yara/wiki/Unicode-characters-in-YARA)

Строки без учета регистра

Текстовые строки в YARA по умолчанию чувствительны к регистру, однако вы можете
строка в режим без учета регистра, добавив модификатор nocase в конце
определения строки в той же строке:

 правило CaseInsensitiveTextExample
{
    струны:
        $ text_string = "foobar" нет

    условие:
        $ text_string
}
 

С модификатором nocase строка foobar будет соответствовать Foobar , FOOBAR ,
и фоБар .Этот модификатор можно использовать вместе с любым модификатором,
кроме base64 и base64wide .

Строки широких символов

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

Например, если строка «Borland» отображается в кодировке как два байта на
(например, B \ x00o \ x00r \ x00l \ x00a \ x00n \ x00d \ x00 ), то будет соответствовать следующее правило:

 правило WideCharTextExample1
{
    струны:
        $ wide_string = ширина "Borland"

    условие:
        $ wide_string
}
 

Однако имейте в виду, что этот модификатор просто чередует коды ASCII
символы в строке с нулями, он действительно не поддерживает UTF-16
строки, содержащие неанглийские символы.Если вы хотите искать строки
как в ASCII, так и в широкой форме, вы можете использовать модификатор ascii вместе
с шириной , независимо от того, в каком порядке они появляются.

 правило WideCharTextExample2
{
    струны:
        $ wide_and_ascii_string = "Borland" широкий ascii

    условие:
        $ wide_and_ascii_string
}
 

Модификатор ascii может появляться отдельно, без сопровождающего его шириной
модификатор, но писать его необязательно, так как при отсутствии шириной
По умолчанию предполагается, что строка является ASCII.

строки XOR

Модификатор xor может использоваться для поиска строк с помощью однобайтовой операции XOR.
применяется к ним.

Следующее правило будет искать каждый байт XOR, примененный к строке
«Эта программа не может» (включая строку открытого текста):

 правило XorExample1
{
    струны:
        $ xor_string = "Эта программа не может" xor

    условие:
        $ xor_string
}
 

Вышеупомянутое правило логически эквивалентно:

 правило XorExample2
{
    струны:
        $ xor_string_00 = "Эта программа не может"
        $ xor_string_01 = "Uihr! qsnfs`l! b`oonu"
        $ xor_string_02 = "Vjkq \" rpmepco \ "acllmv"
        // Повторяем для каждого байта XOR
    условие:
        любой из них
}
 

Вы также можете комбинировать модификатор xor с шириной и ascii
модификаторы.Например, для поиска версий wide и ascii
строка после применения каждого байта XOR, которую вы должны использовать:

 правило XorExample3
{
    струны:
        $ xor_string = "Эта программа не может" xor широкий ascii
    условие:
        $ xor_string
}
 

Модификатор xor применяется после каждого второго модификатора. Это значит, что
использование xor и wide вместе приводит к тому, что XOR применяется к
чередуются нулевые байты.Например, следующие два правила логически
эквивалент:

 правило XorExample4
{
    струны:
        $ xor_string = "Эта программа не может" xor wide
    условие:
        $ xor_string
}

правило XorExample4
{
    струны:
        $ xor_string_00 = "T \ x00h \ x00i \ x00s \ x00 \ x00p \ x00r \ x00o \ x00g \ x00r \ x00a \ x00m \ x00 \ x00c \ x00a \ x00n \ x00n \ x00o \ x00t \ x00"
        $ xor_string_01 = "U \ x01i \ x01h \ x01r \ x01! \ x01q \ x01s \ x01n \ x01f \ x01s \ x01` \ x01l \ x01! \ x01b \ x01` \ x01o \ x01o \ x01n \ x01u \ x01"
        $ xor_string_02 = "V \ x02j \ x02k \ x02q \ x02 \" \ x02r \ x02p \ x02m \ x02e \ x02p \ x02c \ x02o \ x02 \ "\ x02a \ x02c \ x02l \ x0m2l \ x02c \ x02l \ x0m2l \ x0"
        // Повторить для каждой отдельной байтовой операции XOR.условие:
        любой из них
}
 

Начиная с YARA 3.11, если вам нужен больший контроль над диапазоном байтов, используемых с модификатором xor , используйте:

 правило XorExample5
{
    струны:
        $ xor_string = "Эта программа не может" xor (0x01-0xff)
    условие:
        $ xor_string
}
 

В приведенном выше примере байты от 0x01 до 0xff включительно будут применяться к
строка при поиске. Общий синтаксис: xor (минимум-максимум) .

Строки Base64

Модификатор base64 может использоваться для поиска строк, которые были base64
закодировано.Хорошее объяснение техники находится по адресу:

.

https://www.leeholmes.com/blog/2019/12/10/searching-for-content-in-base-64-strings-2/

Следующее правило будет искать три перестановки base64 строки
«Эта программа не может»:

 правило Base64Example1
{
    струны:
        $ a = "Эта программа не может" base64

    условие:
        $ а
}
 

Это заставит YARA искать эти три перестановки:

VGhpcyBwcm9ncmFtIGNhbm5vd

RoaXMgcHJvZ3JhbSBjYW5ub3

UaGlzIHByb2dyYW0gY2Fubm90

Модификатор base64wide работает так же, как модификатор base64 , но результаты
модификатора base64 преобразуются в широкие.

Взаимодействие между base64 (или base64wide ) и wide и
ascii , как и следовало ожидать. wide и ascii применяются к
сначала строка, а затем применяются модификаторы base64 и base64wide .
Ни в коем случае не является открытым текстом версий ascii или wide
строки, включенные в поиск. Если вы хотите также включить те, которые вы можете поместить
их во вторичной строке.& * () {} []., | ABCDEFGHIJ \ x09LMNOPQRSTUVWXYZabcdefghijklmnopqrstu «)

условие:
$ а
}

Длина алфавита должна составлять 64 байта.

Модификаторы base64 и base64wide поддерживаются только с текстом
струны. Использование этих модификаторов с шестнадцатеричной строкой или регулярным выражением
вызовет ошибку компилятора. Кроме того, xor , fullword и nocase
модификаторы, используемые в сочетании с base64 или base64wide , вызовут
ошибка компилятора.

Из-за того, что YARA удаляет начальные и конечные символы после
кодировка base64, одна из кодировок base64 «Dhis program cannow» и
«Эта программа не может» идентичны. Аналогичным образом, используя ключевое слово base64 на
одиночные символы ASCII не рекомендуются. Например, «а» с
base64 ключевое слово соответствует «», «b», «c», «!», «\ XA1» или «\ xE1» после base64
кодировка, и не будет соответствовать, где кодировка base64 соответствует
[GWm2] [EFGH] регулярное выражение.

Поиск полных слов

Другой модификатор, который можно применить к текстовым строкам, — это полное слово . Этот
модификатор гарантирует совпадение строки только в том случае, если она присутствует в файле
разделены не буквенно-цифровыми символами. Например строка домен , если
определяется как fullword , не соответствует www.mydomain.com , но соответствует
www.my-domain.com и www.domain.com .

Регулярные выражения

Регулярные выражения — одна из самых мощных функций YARA.Они есть
определены так же, как и текстовые строки, но вместо этого заключены в косую черту
двойных кавычек, как в языке программирования Perl.

 правило RegExpExample1
{
    струны:
        $ re1 = / md5: [0-9a-fA-F] {32} /
        $ re2 = / состояние: (вкл | выкл) /

    условие:
        $ re1 и $ re2
}
 

За регулярными выражениями также может следовать nocase , ascii , wide ,
и модификаторы fullword , как и в текстовых строках. Семантика этих
модификаторы одинаковы в обоих случаях.

В предыдущих версиях YARA использовались внешние библиотеки, такие как PCRE и RE2.
для сопоставления регулярных выражений, но начиная с версии 2.0 YARA использует
собственный механизм регулярных выражений. Этот новый движок реализует большинство функций
найдены в PCRE, за исключением некоторых из них, таких как группы захвата, символ POSIX
классы и обратные ссылки.

Регулярные выражения

YARA распознают следующие метасимволы:

\ Процитировать следующий метасимвол
^ Соответствует началу файла
$ Соответствует концу файла
| Чередование
() Группировка
[] Класс символов в квадратных скобках

Также распознаются следующие количественные показатели:

* Совпадение 0 или более раз
+ Совпадение 1 или более раз
? Совпадение 0 или 1 раз
{n} Совпадение ровно n раз
{n,} Совпадение не менее n раз
{, m} Совпадение не более m раз
{n, m} Сопоставьте n и m раз

Все эти квантификаторы имеют нежадный вариант, за которым следует вопрос
марка (?):

*? Соответствует 0 или более раз, нежадный
+? Соответствует 1 или более раз, нежадный
?? Совпадение 0 или 1 раз, нежадное
{n}? Совпадение ровно n раз, нежадный
{n,}? Совпадение не менее n раз, нежадное
{, м}? Соответствует не более m раз, нежадный
{n, m}? Сопоставьте n с m раз, нежадный

Распознаются следующие escape-последовательности:

\ t Вкладка (HT, TAB)
\ n Новая линия (LF, NL)
\ r Возврат (CR)
\ f Подача формы (FF)
\ а Сигнальный звонок
\ xNN Символ, порядковый номер которого является заданным шестнадцатеричным числом

Это признанные классы символов:

\ w Соответствует слов символов (буквенно-цифровой плюс «_»)
\ Вт Соответствует символу, отличному от слова
\ с Соответствует пробельному символу
\ S Соответствует непробельному символу
\ d Соответствует символу десятичной цифры
\ D Соответствует нецифровому символу

Начиная с версии 3.3.0 эти утверждения нулевой ширины также распознаются:

\ b Соответствует границе слова
\ B Совпадение без границы слова

Частные строки

Все строки в YARA могут быть помечены как private , что означает, что они никогда не будут
входит в вывод YARA. Они везде рассматриваются как обычные струны
else, так что вы все равно можете использовать их по своему усмотрению в условии, но они будут
никогда не отображаться с флагом -s или отображаться в обратном вызове YARA, если вы используете
C API.

 правило PrivateStringExample
{
    струны:
        $ text_string = "foobar" частный

    условие:
        $ text_string
}
 

Сводка модификаторов строк

Следующие модификаторы строки обрабатываются в следующем порядке, но применимы только
к перечисленным типам строк.

Модификаторы текстовой строки
Ключевое слово Типы строк Резюме Ограничения
nocase Текст, регулярное выражение Игнорировать случай Невозможно использовать с xor , base64 или base64wide
широкий Текст, регулярное выражение Эмуляция UTF16 путем чередования нулевых (0x00) символов Нет
ascii Текст, регулярное выражение Также соответствует символам ASCII, требуется, только если используется ширина Нет
xor Текст Текстовая строка XOR с однобайтовыми ключами Невозможно использовать с nocase , base64 или base64wide
base64 Текст Преобразовать в 3 строки в кодировке base64 Невозможно использовать с nocase , xor или fullword
base64wide Текст Преобразовать в 3 строки в кодировке base64, затем чередовать нулевые символы, например, шириной Невозможно использовать с nocase , xor или fullword
полное слово Текст, регулярное выражение Соответствию не предшествует и не следует буквенно-цифровой символ Невозможно использовать с base64 или base64wide
частный Шестнадцатеричный, текст, регулярное выражение Совпадение не включается в вывод Нет

Условия

Условия — это не что иное, как логические выражения, такие как те, которые можно найти
на всех языках программирования, например, в операторе if . ) можно использовать в числовых выражениях.

Целые числа всегда имеют длину 64 бита, даже результаты таких функций, как uint8 ,
uint16 и uint32 повышены до 64-битных. Это то, что ты должен взять
во внимание, особенно при использовании побитовых операторов (например, ~ 0x01 не
0xFE, но 0xFFFFFFFFFFFFFFFE).

В следующей таблице перечислены приоритеты и ассоциативность всех операторов. В
таблица отсортирована в порядке убывания приоритета, что означает, что перечисленные операторы
в верхней строке списка сгруппированы предыдущие операторы, перечисленные в следующих строках
под этим.Операторы в одной строке имеют одинаковый приоритет, если они появляются
вместе в выражении ассоциативность определяет, как они сгруппированы.

Приоритет Оператор Описание Ассоциативность
1

[]

.

Побитовое исключающее ИЛИ Слева направо
8 | Побитовое ИЛИ Слева направо
9

<

<=

>

> =

Менее

Меньше или равно

Больше

Больше или равно

Слева направо
10

==

! =

содержит

иконы

начинается с

istartswith

оканчивается на

iendswith

совпадений

Равно

Не равно

Строка содержит подстроку

Подобно содержит, но без учета регистра

Строка начинается с подстроки

Как начинается с, но без учета регистра

Строка заканчивается подстрокой

То же, что и заканчивается, но без учета регистра

Строка соответствует регулярному выражению

Слева направо
11 не Логическое НЕ Справа налево
12 и логическое И Слева направо
13 или Логическое ИЛИ Слева направо

Строковые идентификаторы также могут использоваться в условии, действуя как логическое значение
переменные, значение которых зависит от наличия или отсутствия связанной строки
в файле.

 Пример правила
{
    струны:
        $ a = "text1"
        $ b = "текст2"
        $ c = "text3"
        $ d = "text4"

    условие:
        ($ a или $ b) и ($ c или $ d)
}
 

Счетные строки

Иногда нам нужно знать не только, присутствует ли определенная строка,
но сколько раз строка появляется в памяти файла или процесса. Номер
вхождений каждой строки представлена ​​переменной, имя которой
строковый идентификатор, но с символом # вместо символа $.Например:

 Счетчик правил Пример
{
    струны:
        $ a = "dummy1"
        $ b = "dummy2"

    условие:
        #a == 6 и #b> 10
}
 

Это правило соответствует любому файлу или процессу, содержащему строку $ a, ровно шесть раз,
и более десяти вхождений строки $ b.

Смещения строки или виртуальные адреса

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

 правило AtExample
{
    струны:
        $ a = "dummy1"
        $ b = "dummy2"

    условие:
        $ a по цене 100 и $ b по цене 200
}
 

Выражение $ a по адресу 100 в приведенном выше примере истинно, только если строка $ a
найдено по смещению 100 в файле (или по виртуальному адресу 100, если применяется к
запущенный процесс). Строка $ b должна появиться по смещению 200.Пожалуйста, обрати внимание
что оба смещения являются десятичными, однако шестнадцатеричные числа могут быть записаны
добавление префикса 0x перед числом, как в языке C, что очень
удобно при написании виртуальных адресов. Также обратите внимание на более высокий приоритет
оператор на вместо и .

В то время как оператор at позволяет искать строку с некоторым фиксированным смещением в
файл или виртуальный адрес в пространстве памяти процесса, оператор в
позволяет искать строку в диапазоне смещений или адресов.

 правило InExample
{
    струны:
        $ a = "dummy1"
        $ b = "dummy2"

    условие:
        $ a в (0..100) и $ b в (100..filesize)
}
 

В приведенном выше примере строка $ a должна быть найдена со смещением от 0 до
100, а строка $ b должна иметь смещение от 100 до конца файла.
Опять же, числа по умолчанию являются десятичными.

Вы также можете получить смещение или виртуальный адрес i-го вхождения строки
$ a с помощью @a [i]. Индексы отсчитываются от единицы, поэтому первое вхождение будет
@a [1] второй @a [2] и так далее.Если вы укажете индекс больше, чем
количество вхождений строки, результатом будет NaN (не число)
значение.

Длина совпадения

Для многих регулярных выражений и шестнадцатеричных строк, содержащих переходы, длина
совпадение варьируется. Если у вас есть регулярное выражение / fo * / строки
«fo», «foo» и «fooo» могут совпадать, все они имеют разную длину.

Вы можете использовать длину совпадений как часть вашего условия, используя
персонаж ! перед строковым идентификатором аналогичным образом вы используете @
символ для смещения.! a [1] — длина первого совпадения $ a,! a [2]
— длина второго совпадения и т. д. ! a — это сокращенная форма
! а [1].

Размер файла

Строковые идентификаторы — не единственные переменные, которые могут появляться в условии.
(на самом деле правила могут быть определены без какого-либо строкового определения, как будет показано ниже).
ниже), можно использовать и другие специальные переменные. Один из
эти специальные переменные — px , которые, как видно из названия,
размер сканируемого файла.20. Оба постфикса можно использовать только с десятичными константами.

Использование размера px имеет смысл только тогда, когда правило применяется к файлу. Если
правило применяется к запущенному процессу, которому никогда не будет соответствовать, потому что
px не имеет смысла в этом контексте.

Исполняемая точка входа

Другая специальная переменная, которую можно использовать в правиле, — это точка входа . Если
файл представляет собой Portable Executable (PE) или Executable and Linkable Format (ELF),
эта переменная содержит необработанное смещение точки входа исполняемого файла на случай, если мы
сканируют файл.Если мы сканируем запущенный процесс, точка входа будет
содержать виртуальный адрес точки входа основного исполняемого файла. Типичное использование
эта переменная предназначена для поиска некоторого шаблона в точке входа для обнаружения пакеров
или простые файловые инфекторы.

 правило EntryPointExample1
{
    струны:
        $ a = {E8 00 00 00 00}

    условие:
        $ a в точке входа
}

правило EntryPointExample2
{
    струны:
        $ a = {9C 50 66 A1 ?? ?? ?? 00 66 A9 ?? ?? 58 0F 85}

    условие:
        $ a в (точка входа..entrypoint + 10)
}
 

Наличие в правиле переменной entrypoint означает, что только PE или
Файлы ELF могут удовлетворять этому правилу. Если файл не является PE или ELF, любое правило, использующее
эта переменная принимает значение false.

Предупреждение

Переменная точки входа устарела, следует использовать
эквивалент pe.entry_point из модуля PE. Запуск
с YARA 3.0 вы получите предупреждение, если используете точку входа , и это будет
полностью удален в будущих версиях.

Доступ к данным в заданной позиции

Есть много ситуаций, в которых вы можете захотеть написать условия, зависящие от
на данных, хранящихся по определенному смещению файла или адресу виртуальной памяти, в зависимости от
если мы сканируем файл или запущенный процесс. В таких ситуациях вы можете использовать
одна из следующих функций для чтения данных из файла по заданному смещению:

 int8 (<смещение или виртуальный адрес>)
int16 (<смещение или виртуальный адрес>)
int32 (<смещение или виртуальный адрес>)

uint8 (<смещение или виртуальный адрес>)
uint16 (<смещение или виртуальный адрес>)
uint32 (<смещение или виртуальный адрес>)

int8be (<смещение или виртуальный адрес>)
int16be (<смещение или виртуальный адрес>)
int32be (<смещение или виртуальный адрес>)

uint8be (<смещение или виртуальный адрес>)
uint16be (<смещение или виртуальный адрес>)
uint32be (<смещение или виртуальный адрес>)
 

Функции intXX читают 8-, 16- и 32-битные целые числа со знаком из
<смещение или виртуальный адрес>, а функции uintXX читают беззнаковые целые числа.И 16-, и 32-битные целые числа считаются прямым порядком байтов. если ты
хотите прочитать целое число с прямым порядком байтов, используйте соответствующую функцию, заканчивающуюся
в быть . Параметр <смещение или виртуальный адрес> может быть любым выражением, возвращающим
целое число без знака, включая возвращаемое значение одной из функций uintXX
сам. В качестве примера рассмотрим правило различения файлов PE:

 правило IsPE
{
    условие:
        // Подпись MZ со смещением 0 и ...
        uint16 (0) == 0x5A4D и
        //... Подпись PE по смещению, хранящемуся в заголовке MZ в 0x3C
        uint32 (uint32 (0x3C)) == 0x00004550
}
 

Наборы струн

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

 правило OfExample1
{
    струны:
        $ a = "dummy1"
        $ b = "dummy2"
        $ c = "dummy3"

    условие:
        2 из ($ a, $ b, $ c)
}
 

Это правило требует, чтобы по крайней мере две строки в наборе ($ a, $ b, $ c)
должны присутствовать в файле, но неважно, какие два.Конечно, когда
при использовании этого оператора число перед ключевым словом из должно быть меньше или
равно количеству струн в наборе.

Элементы набора могут быть явно пронумерованы, как в предыдущем
пример, или можно указать с помощью подстановочных знаков. Например:

 правило OfExample2
{
    струны:
        $ foo1 = "foo1"
        $ foo2 = "foo2"
        $ foo3 = "foo3"

    условие:
        2 из ($ foo *) // эквивалент 2 из ($ foo1, $ foo2, $ foo3)
}

правило OfExample3
{
    струны:
        $ foo1 = "foo1"
        $ foo2 = "foo2"

        $ bar1 = "bar1"
        $ bar2 = "bar2"

    условие:
        3 из ($ foo *, $ bar1, $ bar2)
}
 

Вы даже можете использовать ($ *) для ссылки на все строки в вашем правиле или написать
эквивалентное ключевое слово вместо для большей разборчивости.

 правило OfExample4
{
    струны:
        $ a = "dummy1"
        $ b = "dummy2"
        $ c = "dummy3"

    условие:
        1 из них // эквивалент 1 из ($ *)
}
 

Во всех приведенных выше примерах количество строк задано
числовая константа, но можно использовать любое выражение, возвращающее числовое значение.
Также можно использовать ключевые слова любые и все .

 all of them // все строки в правиле
любой из них // любая строка в правиле
all of ($ a *) // все строки, идентификатор которых начинается с $ a
any of ($ a, $ b, $ c) // любое из $ a, $ b или $ c
1 из ($ *) // то же, что "любой из них"
 

Применение одного и того же условия ко многим строкам

Есть еще один оператор, очень похожий на из , но еще более мощный,
для..оператора . Синтаксис:

 для выражения набора_строк: (логическое_выражение)
 

И его значение: из тех строк в string_set по крайней мере выражение
из них должно удовлетворять boolean_expression .

Другими словами: boolean_expression оценивается для каждой строки в
string_set и должно быть не менее выражений из них, возвращающих
Правда.

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

 для любого из ($ a, $ b, $ c): ($ at pe.entry_point)
 

Символ $ в логическом выражении не привязан к какой-либо конкретной строке,
это будет $ a, а затем $ b, а затем $ c в трех последовательных вычислениях
выражения.

Может быть, вы уже поняли, что оператор из — это частный случай
для..из . Следующие выражения совпадают:

 любой из ($ a, $ b, $ c)
для любого из ($ a, $ b, $ c): ($)
 

Вы также можете использовать символы #, @ и! сделать ссылку на количество
вхождений, первое смещение и длина каждой строки соответственно.

 для всех: (#> 3)
для всех ($ a *): (@> @b)
 

Использование анонимных строк с

из и для .. из

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

 правило AnonymousStrings
{
    струны:
        $ = "dummy1"
        $ = "dummy2"

    условие:
        1 из них
}
 

Итерация по вхождению строки

Как видно в строковых смещениях или виртуальных адресах, смещения или виртуальные адреса, в которых заданы
строка появляется в файле, или к адресному пространству процесса можно получить доступ
используя синтаксис: @a [i], где i — индекс, указывающий, какое вхождение
строки $ a, о которой вы говорите.(@a [1], @a [2], …).

Иногда вам нужно перебрать некоторые из этих смещений и гарантировать
они удовлетворяют заданному условию. Например:

 Правило Вхождений
{
    струны:
        $ a = "dummy1"
        $ b = "dummy2"

    условие:
        для всех i в (1,2,3): (@a [i] + 10 == @b [i])
}
 

Предыдущее правило гласит, что первые три вхождения $ b должны быть 10
байтов от первых трех вхождений $ a.

То же условие можно записать также как:

 для всех i в (1..3): (@a [i] + 10 == @b [i])
 

Обратите внимание, что мы используем диапазон (1–3) вместо перечисления индекса.
значения (1,2,3). Конечно, мы не обязаны использовать константы для указания диапазона
границ, мы также можем использовать выражения, как в следующем примере:

 для всех i в (1 .. # a): (@a [i] <100)
 

В этом случае мы перебираем каждое вхождение $ a (помните, что #a
представляет количество вхождений $ a). Это правило указывает, что каждый
вхождение $ a должно быть в пределах первых 100 байтов файла.

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

 для любого i в (1 .. # a): (@a [i] <100)
для 2 i в (1 .. # a): (@a [i] <100)
 

Таким образом, синтаксис этого оператора:

 для идентификатора выражения в индексах: (логическое_выражение)
 

Итераторы

В YARA 4.0 оператор for..of был улучшен и теперь его можно использовать для
перебирать не только целочисленные перечисления и диапазоны (например,г: 1,2,3,4 и 1..4),
но также над любыми типами повторяемых данных, такими как массивы и словари
определяется модулями YARA. Например, следующее выражение действительно в
ЯРА 4.0:

 для любого раздела в pe.sections: (section.name == ".text")
 

Это эквивалент:

 для любого i в (0..pe.number_of_sections-1): (pe.sections [i] .name == ".text")
 

Новый синтаксис более естественный и понятный, поэтому рекомендуется
способ выражения этого типа условий в новых версиях YARA.

При итерации словарей вы должны указать два имени переменных, которые будут
удерживайте ключ и значение для каждой записи в словаре, например:

 для любых k, v в some_dict: (k == "foo" и v == "bar")
 

В общем случае оператор for..of имеет вид:

 для   в : (<некоторое условие с использованием переменных цикла>)
 

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

Ссылки на другие правила

При написании условия для правила вы также можете ссылаться на
ранее определенное правило способом, который напоминает вызов функции
традиционные языки программирования. Таким образом вы можете создавать правила, которые
зависеть от других. Давайте посмотрим на пример:

 правило Правило1
{
    струны:
        $ a = "dummy1"

    условие:
        $ а
}

Правило Правило2
{
    струны:
        $ a = "dummy2"

    условие:
        $ a и Правило1
}
 

Как видно из примера, файл удовлетворяет Правилу 2, только если он содержит
строка «dummy2» и удовлетворяет Правилу 1.Обратите внимание, что строго необходимо
определить вызываемое правило перед тем, которое будет вызывать.

Подробнее о правилах

Некоторые аспекты правил YARA еще не рассмотрены, но
все еще очень важно. Это: глобальные правила, частные правила, теги и
метаданные.

Глобальные правила

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

 глобальное правило SizeLimit
{
    условие:
        размер файла <2 МБ
}
 

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

Частные правила

Частные правила - очень простая концепция. Это просто правила, которых нет
сообщает YARA, когда они совпадают в данном файле.Правила, о которых не сообщается
на первый взгляд может показаться бесплодным, но в сочетании с возможностью
предложенный YARA ссылки одного правила из другого (см.
Ссылаясь на другие правила) они становятся полезными. Частные правила могут служить
строительные блоки для других правил, и в то же время предотвращают загромождение
Вывод YARA с неактуальной информацией. Чтобы объявить правило частным
просто добавьте ключевое слово private перед объявлением правила.

 частное правило PrivateRuleExample
{
    ...
}
 

К правилу можно применить модификаторы private и global , в результате
глобальное правило, о котором не сообщает YARA, но которое должно выполняться.

Неопределенные значения

Модули

часто оставляют переменные в неопределенном состоянии, например, когда
переменная не имеет смысла в текущем контексте (подумайте о pe.entry_point
при сканировании файла, отличного от PE). YARA обрабатывает неопределенные значения таким образом, чтобы
правило, чтобы сохранить его осмысленность.Взгляните на это правило:

 импорт "пэ"

Правило Тест
{
    струны:
        $ a = "какая-то строка"

    условие:
        $ a и pe.entry_point == 0x1000
}
 

Если отсканированный файл не является PE, вы не ожидаете, что это правило будет соответствовать файлу,
даже если он содержит строку, потому что оба условия (наличие
строка и правильное значение для точки входа) должны быть удовлетворены. Тем не мение,
если условие меняется на:

 $ a или pe.entry_point == 0x1000
 

Можно ожидать, что в этом случае правило будет соответствовать, если файл содержит строку,
даже если это не PE-файл.Именно так ведет себя YARA. Логика такова
следует:

  • Если выражение в условии не определено, оно будет преобразовано в
    false , и правило не будет соответствовать.
  • Логические операторы и и или будут обрабатывать неопределенные операнды как false ,
    Это означает, что:

    • undefined и true - это false
    • undefined и false is false
    • не определено или верно равно верно
    • undefined или false is false
  • Все остальные операторы, включая оператор , а не , возвращают значение undefined.
    если какой-либо из их операндов не определен.

В приведенном выше выражении pe.entry_point == 0x1000 будет неопределенным для не-PE
файлы, потому что pe.entry_point не определено для этих файлов. Это означает, что
$ a или pe.entry_point == 0x1000 будет true тогда и только тогда, когда $ a будет true .

Если условие - pe.entry_point == 0x1000 , оно будет оцениваться как false
для файлов, отличных от PE, и так будет pe.entry_point! = 0x1000 и
не пе.entry_point == 0x1000 , поскольку ни одно из этих выражений не имеет смысла для не-PE
файлы.

Внешние переменные

Внешние переменные позволяют определять правила, которые зависят от предоставленных значений.
снаружи. Например, вы можете написать следующее правило:

 правило ExternalVariableExample1
{
    условие:
        ext_var == 10
}
 

В этом случае ext_var - внешняя переменная, значение которой присваивается
время выполнения (см. параметр -d инструмента командной строки и параметр externals для
компилирует и соответствует методам в yara-python).Внешние переменные могут быть
типов: целое, строковое или логическое; их тип зависит от присвоенного значения
им. Целочисленная переменная может заменять любую целочисленную константу в
Условные и логические переменные могут занимать место логических выражений.
Например:

 правило ExternalVariableExample2
{
    условие:
        bool_ext_var или размер файла 

Внешние переменные типа string могут использоваться с операторами: содержит ,
начинается с , оканчивается на и их аналоги без учета регистра: icontains ,
istartswith и iendswith`.Их можно использовать также со спичками
оператор, который возвращает истину, если строка соответствует заданному регулярному выражению.

 правило ContainsExample
{
    условие:
        string_ext_var содержит «текст»
}

правило CaseInsensitiveContainsExample
{
    условие:
        string_ext_var icontains "текст"
}

правило StartsWithExample
{
    условие:
        string_ext_var начинается с префикса
}

правило EndsWithExample
{
    условие:
        string_ext_var оканчивается на "суффикс"
}

Правило СоответствуетПример
{
    условие:
        string_ext_var соответствует / [a-z] + /
}
 

Вы можете использовать модификаторы регулярного выражения вместе с оператором match ,
например, если вы хотите, чтобы регулярное выражение из предыдущего примера
для нечувствительности к регистру можно использовать / [a-z] + / i .Обратите внимание на i после
регулярное выражение в стиле Perl. Вы также можете использовать модификатор s
для однострочного режима точка соответствует всем символам, включая
разрывы строк. Конечно, оба модификатора можно использовать одновременно, как в
следующий пример:

 правило ExternalVariableExample5
{
    условие:
        / * однострочный режим без учета регистра * /
        string_ext_var соответствует / [a-z] + / равно
}
 

Имейте в виду, что каждая внешняя переменная, используемая в ваших правилах, должна быть определена
во время выполнения, либо с помощью параметра -d инструмента командной строки, либо с помощью
предоставление параметра externals соответствующему методу в
яра-питон .

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *