From 8626fc113aac072b123ecc76141c516260a26515 Mon Sep 17 00:00:00 2001 From: "Victor M. Alvarez" Date: Tue, 23 Dec 2008 11:54:43 +0000 Subject: [PATCH] Lots of changes for version 1.1 --- ChangeLog | 9 +- Makefile | 28 +- config.h | 6 +- configure | 20 +- configure.ac | 2 +- doc/YARA User's Manual.pdf | Bin 129255 -> 131096 bytes extra/TextMate-bundle.zip | Bin 0 -> 4412 bytes .../Preferences/Typing Pairs.tmPreferences | 35 - extra/YARA.tmbundle/Snippets/rule.tmSnippet | 21 - extra/YARA.tmbundle/Syntaxes/MDL.tmLanguage | 132 ---- extra/YARA.tmbundle/info.plist | 16 - libyara/Makefile | 40 +- libyara/ast.c | 75 +- libyara/ast.h | 5 +- libyara/config.h | 6 +- libyara/configure | 20 +- libyara/configure.ac | 2 +- libyara/error.c | 4 - libyara/eval.c | 20 + libyara/eval.h | 1 + libyara/grammar.c | 652 ++++++++++-------- libyara/grammar.h | 97 +-- libyara/grammar.y | 127 ++-- libyara/lex.c | 523 ++++++++------ libyara/lex.l | 109 ++- libyara/libtool | 18 +- libyara/libyara.tmproj | 372 ++++++++-- libyara/scan.c | 301 +++++--- libyara/sizedstr.h | 33 + libyara/yara.h | 14 +- yara.c | 84 ++- 31 files changed, 1619 insertions(+), 1153 deletions(-) create mode 100644 extra/TextMate-bundle.zip delete mode 100644 extra/YARA.tmbundle/Preferences/Typing Pairs.tmPreferences delete mode 100644 extra/YARA.tmbundle/Snippets/rule.tmSnippet delete mode 100644 extra/YARA.tmbundle/Syntaxes/MDL.tmLanguage delete mode 100644 extra/YARA.tmbundle/info.plist create mode 100644 libyara/sizedstr.h diff --git a/ChangeLog b/ChangeLog index 5faa25db..915e335f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ version 1.0 (24/09/2008) - * first release \ No newline at end of file + * first release + +version 1.1 + * added support for strings containing null (\x00) chars + * added syntactic construct "x of them" + * regular expressions syntax changed + * now regular expressions can begin with any character + diff --git a/Makefile b/Makefile index f4f7a9e1..14693f06 100644 --- a/Makefile +++ b/Makefile @@ -86,11 +86,11 @@ DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print -ACLOCAL = ${SHELL} /Users/plusvic/Projects/yara/missing --run aclocal-1.10 -AMTAR = ${SHELL} /Users/plusvic/Projects/yara/missing --run tar -AUTOCONF = ${SHELL} /Users/plusvic/Projects/yara/missing --run autoconf -AUTOHEADER = ${SHELL} /Users/plusvic/Projects/yara/missing --run autoheader -AUTOMAKE = ${SHELL} /Users/plusvic/Projects/yara/missing --run automake-1.10 +ACLOCAL = ${SHELL} /Users/plusvic/Projects/yara/trunk/missing --run aclocal-1.10 +AMTAR = ${SHELL} /Users/plusvic/Projects/yara/trunk/missing --run tar +AUTOCONF = ${SHELL} /Users/plusvic/Projects/yara/trunk/missing --run autoconf +AUTOHEADER = ${SHELL} /Users/plusvic/Projects/yara/trunk/missing --run autoheader +AUTOMAKE = ${SHELL} /Users/plusvic/Projects/yara/trunk/missing --run automake-1.10 AWK = awk CC = gcc CCDEPMODE = depmode=gcc3 @@ -112,24 +112,24 @@ LDFLAGS = LIBOBJS = LIBS = -lpcre -lpcre -lpcre -lpcre LTLIBOBJS = -MAKEINFO = ${SHELL} /Users/plusvic/Projects/yara/missing --run makeinfo +MAKEINFO = ${SHELL} /Users/plusvic/Projects/yara/trunk/missing --run makeinfo MKDIR_P = ./install-sh -c -d OBJEXT = o PACKAGE = yara PACKAGE_BUGREPORT = vmalvarez@hispasec.com PACKAGE_NAME = yara -PACKAGE_STRING = yara 1.0 +PACKAGE_STRING = yara 1.1 PACKAGE_TARNAME = yara -PACKAGE_VERSION = 1.0 +PACKAGE_VERSION = 1.1 PATH_SEPARATOR = : SET_MAKE = SHELL = /bin/sh STRIP = -VERSION = 1.0 -abs_builddir = /Users/plusvic/Projects/yara -abs_srcdir = /Users/plusvic/Projects/yara -abs_top_builddir = /Users/plusvic/Projects/yara -abs_top_srcdir = /Users/plusvic/Projects/yara +VERSION = 1.1 +abs_builddir = /Users/plusvic/Projects/yara/trunk +abs_srcdir = /Users/plusvic/Projects/yara/trunk +abs_top_builddir = /Users/plusvic/Projects/yara/trunk +abs_top_srcdir = /Users/plusvic/Projects/yara/trunk ac_ct_CC = gcc am__include = include am__leading_dot = . @@ -148,7 +148,7 @@ host_alias = htmldir = ${docdir} includedir = ${prefix}/include infodir = ${datarootdir}/info -install_sh = $(SHELL) /Users/plusvic/Projects/yara/install-sh +install_sh = $(SHELL) /Users/plusvic/Projects/yara/trunk/install-sh libdir = ${exec_prefix}/lib libexecdir = ${exec_prefix}/libexec localedir = ${datarootdir}/locale diff --git a/config.h b/config.h index 4cd40c07..e8b7bcef 100644 --- a/config.h +++ b/config.h @@ -14,13 +14,13 @@ #define PACKAGE_NAME "yara" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "yara 1.0" +#define PACKAGE_STRING "yara 1.1" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "yara" /* Define to the version of this package. */ -#define PACKAGE_VERSION "1.0" +#define PACKAGE_VERSION "1.1" /* Version number of package */ -#define VERSION "1.0" +#define VERSION "1.1" diff --git a/configure b/configure index d962000c..17bc86e7 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.61 for yara 1.0. +# Generated by GNU Autoconf 2.61 for yara 1.1. # # Report bugs to . # @@ -574,8 +574,8 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='yara' PACKAGE_TARNAME='yara' -PACKAGE_VERSION='1.0' -PACKAGE_STRING='yara 1.0' +PACKAGE_VERSION='1.1' +PACKAGE_STRING='yara 1.1' PACKAGE_BUGREPORT='vmalvarez@hispasec.com' ac_subst_vars='SHELL @@ -1167,7 +1167,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures yara 1.0 to adapt to many kinds of systems. +\`configure' configures yara 1.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1233,7 +1233,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of yara 1.0:";; + short | recursive ) echo "Configuration of yara 1.1:";; esac cat <<\_ACEOF @@ -1316,7 +1316,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -yara configure 1.0 +yara configure 1.1 generated by GNU Autoconf 2.61 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @@ -1330,7 +1330,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by yara $as_me 1.0, which was +It was created by yara $as_me 1.1, which was generated by GNU Autoconf 2.61. Invocation command line was $ $0 $@ @@ -2020,7 +2020,7 @@ fi # Define the identity of the package. PACKAGE='yara' - VERSION='1.0' + VERSION='1.1' cat >>confdefs.h <<_ACEOF @@ -3973,7 +3973,7 @@ exec 6>&1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by yara $as_me 1.0, which was +This file was extended by yara $as_me 1.1, which was generated by GNU Autoconf 2.61. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -4026,7 +4026,7 @@ Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ -yara config.status 1.0 +yara config.status 1.1 configured by $0, generated by GNU Autoconf 2.61, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" diff --git a/configure.ac b/configure.ac index bf8e2d4e..cdbd92f5 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -AC_INIT([yara], [1.0], [vmalvarez@hispasec.com]) +AC_INIT([yara], [1.1], [vmalvarez@hispasec.com]) AM_INIT_AUTOMAKE([-Wall -Werror]) AC_PROG_CC #AC_CHECK_LIB(yara,compile_rules,,AC_MSG_ERROR(yara not found)) diff --git a/doc/YARA User's Manual.pdf b/doc/YARA User's Manual.pdf index c7faf055310a05cea624819c6e2f76512c87f825..b1dab2da4a3f3028a455344d7ef2b4d23294e971 100644 GIT binary patch delta 92413 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 delta 90820 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 z zMwK+c`@Ic5rSf$Y=qZ$uMn_sL7UHku=vvt5t$3@*Q<|s_0f^X45Ut1G^%YQ^mIcd; zp~PA~_iQnA%hGMzg9{L5oqtsB9aPXK=mq^vx4@O5C|@eOZb8NsQ8vD7!>yWZn{%dV zSwY=~O%#FHo6C7Ph`OUk^o@EiaN z%w;O2ixQUra3^SLTSyyFiI|V;yJS3-ObLmZGu5tgqiwj0@|kcR)c_5%aMh}r! zd1h~CJoU)|PE#(K_jI*cGe6+=QRZ3bnG>p3+DdH+UEF*Qn}umP)mk9xOq-_GtzV*$ zns4Qc?&-I8YieZDIj(B60=ngwgvjf2hlwc0faMmdf|{c&#uRo#gW4J)QDX0?aI1Zv2L*oUq^&H`Imw(W5#ed53nq4~V%TJLG?Aiei0*({{f+I8h!^O= zkZ9{lkziPpUCjXy$)IpL7JO*#1RjJ7KpSjfjW`3vG7odw9B4!4c(5vaXaRwS_K4lb z(q-XP{6rh|h@jW^_vd3a0-4w|mYSH#zGAJJm3UzxA_UXu>Y``B;$ZR1-&NlqYqS@L z=dW?O73L{{{l@!?@gj?@X?R`m?yBAP8f&nw6kfmmx@xfD4R+o{)idVW05IoY0GJ#o z5fm8)-b05Ku2PDh|4GBFN&RIq>OZ?SmhYVyL)Ry2TM8x^CF`L?dLRlK6MIaY1q z4@k_Io7x2=utyg&7L5T^M?f$)HQ9z_;QT_W8vOgnS@ocoeMZfz4+Dd}t&@`S8!AMN zRf0(5rUr6#qBV1vJb#YJLmZqbpg3WfEe#J`)`N-n5SqXP3sbQKUS7d)t80s>i^PVV zUC~DJ3?6L-@(IO#??;0&AxeWCF~)oG6B+la;n^jah!P<7X^|dEGB-c6#X*4=6iU#z zOnUUQMcUJT&Q)*I>X%V=feRUT{JktTN^YC2zRO=gY`&X5K8j|F1-2Ru2(AdIEZ3ds zVY=?ot*M?Za_|h6ijQr^qQ-(sTc)Fve654&FbLYK72{D*FZ>d^VSKjG5%kb)*jSJS z?N1()cHrzK+9-}(Tw0xtZqCoT&}223yQ#@Cb&YQ9r}4^hh7+4&lMs-|gcn_3=>e8L zDnYU`M`G#n?)^aBi`{7l$N{HJprzA?M#K7eHqfk8M1(@vH_t_e-&jr7Hg(C|G=0Z|I!Y$gxZ%4H6fuu8kYweD`A*jnoq z$Ue%_BsZo2z2$Z2UjAX%BUL#gQwx=sB9_I&(b)!r-kD0_$7?wR;Drrt;x!Y+nusYY zeJVrv&>mdTF`$c#JZiCI9-A4w+{DX7!LD`JSUG^(_~>@G7Emp^Q0CTxx?74!ZX5fu9+ClO0MK({-<>(bsYs|5L2{pJGhyZEa>PyRdX; z%RbbYImKm3!ySOIe!7O;c7)z(SN&a84Vrjd2{0O!GiL@G1_Hk~SE(V4N^n>|(A*BY zVi(fZ3H3$l;rb_ic;4cOxyz6`TSoRmipseKP7Dv-*}sm0sMCwC%>(dFJ25yr;sll@ z)ovS6#(!umZDqi(BUDqR{wNZ%;vi}*i@h_)8IT(_`6ewnLTKIIVSS&9uKNDT_qV88)3_{6J4%jhyMf zgw{GOvdJCd1i;M6>*Aw`>_lu#|FufO{KrQ5A4g?!wS?4vZIs2Bl2U+Coo$EX31t6s zO}7|u5@6)nzh|pL1Qw926KB-8yjn!vA%SUD*{D$~N-G=9+25=0X*pN8)Qe^0o5?fN z6Kc)X)mJN(ve&4eiT)-*^PpdUxU<~}i|I_PskBrZ^0h|i_8qvg9kDF4-~Yl2r(I*MOn`i8Jz;&Tu_`uw_&#g227Bb`@!;?=n#_Fo}|cL-oY-l1}xs@@wwqU z^Bdoz{Q;vLO#84HqX9Wlat&POnzSB20#Bf0z16rJ)@{=!Q*{DOo|;PgG#Cjc<5E(j zf-^~2AUz5|q`)`jF3LT<)7jNWh5oMz^=tk?#VkFPEmGo&u;hS~c7?EV&!@aLS&VIb z?irc!AJO(>(!cjPym9Pm6n+dvbmqAe1Ir|w_Np4~*?$yRfCDL=Gr*VywBcgAEX1Ve zKn>T`#m`t=i)bH+%b3e038lVQ#jx7{N-=R^%5M4I}ficdXX2ZsAw>bgw~Ybv2Y z1P`4%NY`vWEY|?ZXRsS=GOAkaCo&8vtAueH8c>I_dFH$-u}zly>$5EN7?%ErNIa2O z&RFodG%Q+L|GXqClvCmOBnO_&x;iLcxWxI5fd3PneJDZ~m&jcc5D1M_;hJc*Z* zt$}&})3D!6b6@>~QjQ1aT~3Y3EwMP&m>&h)lbMicMz{f3HKe!Ps<>=ev4lkBQu;0! z!0t+Qy`%)04ELmLsuCpNlJLH>8vDzK%lmJ+sAuvn*Qb1w6_$M&YCi$@<~{wR?@fFDo?ttbRO60U8bhGom1t`cKQ%h_pMu|mL-88W=@!yq2x4}9*K~de3W74IL z8lj<6g&IDB)&RzDhmYW~v*ojPD5soFsKr{hluU!)>X~_1Nz^Hdq$-TaX;q!YUDdXE zXD2UUVQLs}OK+HRqzANkt6p#vTFF0C-}?D1G)ZS|8J{n;N602FvZIqxMWJ zC`NDW-xX~2;qh1>^Yer!*9P$g&N45nkL#bhsHeoM4f90KM_#Sm-4*!mO@{QFJ_n3} zKzdR|k!G+owcCpuIMp8DqypRlv!bL3r=D1V?R>Z(3<3xbvxr^8NFp936M;di5M1Lp zJ9rDc;Q+m1eY*LgGVFxY(%J|XPWhFiTAeBd{Ci+7FCU50Qy0>8RDf9-NpZ8kpkNQz z?KG2waE8-aOeu|bYU%{?NyHpHCFK~C5RQzp6gRVf{@Z~^jy8b3ZD z8%)cy8~icIG72WwTVZ-##p8VxnXoe-N(kxEW{EUTnNJE^+!gAZ+Qezpzf&)GIhG_T zp=D~Dn@h>4Q75fzucU53iHI{@=wcV;%OO*$WFdoV5v8wW1Xzn$W`ZFrok$HLkHpfJ zH;7^&sX3ME{(|;dvUved-^r?(D(w_dWe2Rvp-Kl!Pnz?U6(mr{a6d^Vka-QBZQ z7hRTf3~PCvIOIq+DFrr7MAuCRk%#ymI)EAQASLnx3Ws8U-cX) zL?mY1&DC;&B@N4xHXP&b0RYs)@&ca4d1vz1t64pI?X@>qX#FjBYxcf~X*jrkTqLL9>Re<3)c&$5r& zyo6eJP-`rd=h=XUp%9k`5LrU2P?xmN3z{rCN~<$P)Y7hYx?4pjehhXT(yinRMO5uL zDol_HH3@qyqYsex!z-vf{jMuvqPbSm2GxS=ZC1W|hp>nnB}A8qY+nF`q%nFg(Il!T zRX9TEm>!Z>a_-KJk7DSUVl!ybYGIpK!7g!obmUi}{)K%S(+zx*HyQ0-noe%<_qn8! zGRP@sOkk?u<8rR{n8b`iM+?Qoihk4yE4i7x0l1<^%HI4jpn^rl;iyLmP=-Z24ZY~& zcrz=w9N#Wi#&)%SSjqsn)*Gj6v2LT_<~I3O;|Yx!G^7i3+qCBXLgSpE<27$x14dXm zhu6f|kk{a+XO}o$`_Lwve0&A$a|C#k@y>Xu0;GV~299LCJ>*4caX@IDvtn5KoJ$Z{ zH#sM2qocsg?c|rCyep|2t8W_XuwFy-C_a3Gp<~uIrgeFz{30M^0Q%8}>2vQbJ_6+x z8+uGk6uf^E2~*WHCN9KEvI_sG4r3AglRLxw{brrB84&O$AH8qrUqovjD1-9#7`gW; z=c`juNW>Ay>Fs_1FFQ3^v4+aQpzUP0Oouyw^7fTfoN?({1GwwAU2t+FoAi6$6*MiQ%!Xz3?-!Om|DU{{L2zpWv2n+%TGHrPktQ*`3_-f+ZoFk(%{*KEAb?_#t z<2w((z6CIu@x07ML}cbmrPPCZ?}6EGIb;xcpFTj*k^%5~(k;mB^U*gL=%0Xjmjn<8 zkAZMa_1Y!DA$Q&3XiFTXCq{(&E!bI^^{Z7$gJJew&3L1vNJ*7tbX*Jyz+W|bwa9aQYv7VX2p(gB zjjrJocmRfd)cNN*t;X%-T~aVV`%My{{|-E`LZCFQ&yljEl2_2HBDFp?EBgyW^b)G` z<*G##z=upAs=$4Ge9&Y)8#(%af56~GG7hy*?K zJG2?j%=xdoEhfMPd-*Z&6O4bB7Jlms#~^n^n*uQ1Q1gZP|1_5Sb7M?Kw)V<1&yKXh z1f-~HbX*Uh{i)Occa5V;fAvdX{lNj(?+CoNdG4axh8f=$IIt_+e~NW9x5<5I0kfW} z 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 C;w@1C literal 0 HcmV?d00001 diff --git a/extra/YARA.tmbundle/Preferences/Typing Pairs.tmPreferences b/extra/YARA.tmbundle/Preferences/Typing Pairs.tmPreferences deleted file mode 100644 index 73e7cdc8..00000000 --- a/extra/YARA.tmbundle/Preferences/Typing Pairs.tmPreferences +++ /dev/null @@ -1,35 +0,0 @@ - - - - - name - Typing Pairs - settings - - highlightPairs - - - " - " - - - { - } - - - smartTypingPairs - - - " - " - - - { - } - - - - uuid - A9DBD3EB-C900-46BD-BFC6-1B663B04D53F - - diff --git a/extra/YARA.tmbundle/Snippets/rule.tmSnippet b/extra/YARA.tmbundle/Snippets/rule.tmSnippet deleted file mode 100644 index a13e6449..00000000 --- a/extra/YARA.tmbundle/Snippets/rule.tmSnippet +++ /dev/null @@ -1,21 +0,0 @@ - - - - - content - rule ${1:identifier} -{ - strings: - $3 - - condition: - $0 -} - name - rule - tabTrigger - rule - uuid - 37D903E5-F98B-48C3-AED3-A79518607E49 - - diff --git a/extra/YARA.tmbundle/Syntaxes/MDL.tmLanguage b/extra/YARA.tmbundle/Syntaxes/MDL.tmLanguage deleted file mode 100644 index f1ab8a90..00000000 --- a/extra/YARA.tmbundle/Syntaxes/MDL.tmLanguage +++ /dev/null @@ -1,132 +0,0 @@ - - - - - fileTypes - - foldingStartMarker - /\*\*|\{\s*$ - foldingStopMarker - \*\*/|^\s*\} - name - YARA - patterns - - - begin - /\* - captures - - 0 - - name - punctuation.definition.comment.yara - - - end - \*/ - name - comment.block.yara - - - begin - // - beginCaptures - - 0 - - name - punctuation.definition.comment.yara - - - end - $\n? - name - comment.line.yara - patterns - - - match - (?>\\\s*\n) - name - punctuation.separator.continuation.yara - - - - - match - \b(true|false|private|rule|strings|condition|and|or|not|filesize|in|at|rva|of|nocase|regexp|fullword|widechar|entrypoint)\b - name - keyword.yara - - - match - \b(0(x|X)[0-9a-fA-F]+)(MB|KB)?\b - name - constant.numeric.yara - - - match - (\$|#)[a-zA-Z0-9_]+\b - name - variable.other.yara - - - begin - " - beginCaptures - - 0 - - name - punctuation.definition.string.begin.yara - - - end - " - endCaptures - - 0 - - name - punctuation.definition.string.end.yara - - - name - string.quoted.double.yara - patterns - - - include - #string_escaped_char - - - - - repository - - string_escaped_char - - patterns - - - match - \\(\\|[t"]|[4-7]\d?|x[a-fA-F0-9]{,2}) - name - constant.character.escape.yara - - - match - \\. - name - invalid.illegal.unknown-escape.yara - - - - - scopeName - source.yara - uuid - B2FCEE68-87FA-45BA-BCAB-72EB9C9A0C3F - - diff --git a/extra/YARA.tmbundle/info.plist b/extra/YARA.tmbundle/info.plist deleted file mode 100644 index 8745d80b..00000000 --- a/extra/YARA.tmbundle/info.plist +++ /dev/null @@ -1,16 +0,0 @@ - - - - - name - YARA - ordering - - B2FCEE68-87FA-45BA-BCAB-72EB9C9A0C3F - A9DBD3EB-C900-46BD-BFC6-1B663B04D53F - 37D903E5-F98B-48C3-AED3-A79518607E49 - - uuid - 1E30D5ED-9687-4F4E-8755-1B8D7403F549 - - diff --git a/libyara/Makefile b/libyara/Makefile index a6e1fa0c..f626823c 100644 --- a/libyara/Makefile +++ b/libyara/Makefile @@ -31,8 +31,8 @@ POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -build_triplet = i386-apple-darwin9.5.0 -host_triplet = i386-apple-darwin9.5.0 +build_triplet = i386-apple-darwin9.6.0 +host_triplet = i386-apple-darwin9.6.0 subdir = . DIST_COMMON = README $(am__configure_deps) $(include_HEADERS) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ @@ -97,12 +97,12 @@ DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print -ACLOCAL = ${SHELL} /Users/plusvic/Projects/yara/libyara/missing --run aclocal-1.10 -AMTAR = ${SHELL} /Users/plusvic/Projects/yara/libyara/missing --run tar +ACLOCAL = ${SHELL} /Users/plusvic/Projects/yara/trunk/libyara/missing --run aclocal-1.10 +AMTAR = ${SHELL} /Users/plusvic/Projects/yara/trunk/libyara/missing --run tar AR = ar -AUTOCONF = ${SHELL} /Users/plusvic/Projects/yara/libyara/missing --run autoconf -AUTOHEADER = ${SHELL} /Users/plusvic/Projects/yara/libyara/missing --run autoheader -AUTOMAKE = ${SHELL} /Users/plusvic/Projects/yara/libyara/missing --run automake-1.10 +AUTOCONF = ${SHELL} /Users/plusvic/Projects/yara/trunk/libyara/missing --run autoconf +AUTOHEADER = ${SHELL} /Users/plusvic/Projects/yara/trunk/libyara/missing --run autoheader +AUTOMAKE = ${SHELL} /Users/plusvic/Projects/yara/trunk/libyara/missing --run automake-1.10 AWK = awk CC = gcc CCDEPMODE = depmode=gcc3 @@ -139,27 +139,27 @@ LIBS = -lpcre -lpcre -lpcre -lpcre LIBTOOL = $(SHELL) $(top_builddir)/libtool LN_S = ln -s LTLIBOBJS = -MAKEINFO = ${SHELL} /Users/plusvic/Projects/yara/libyara/missing --run makeinfo +MAKEINFO = ${SHELL} /Users/plusvic/Projects/yara/trunk/libyara/missing --run makeinfo MKDIR_P = ./install-sh -c -d OBJEXT = o PACKAGE = libyara PACKAGE_BUGREPORT = vmalvarez@hispasec.com PACKAGE_NAME = libyara -PACKAGE_STRING = libyara 1.0 +PACKAGE_STRING = libyara 1.1 PACKAGE_TARNAME = libyara -PACKAGE_VERSION = 1.0 +PACKAGE_VERSION = 1.1 PATH_SEPARATOR = : RANLIB = ranlib SET_MAKE = SHELL = /bin/sh STRIP = strip -VERSION = 1.0 +VERSION = 1.1 YACC = bison -y YFLAGS = -d -abs_builddir = /Users/plusvic/Projects/yara/libyara -abs_srcdir = /Users/plusvic/Projects/yara/libyara -abs_top_builddir = /Users/plusvic/Projects/yara/libyara -abs_top_srcdir = /Users/plusvic/Projects/yara/libyara +abs_builddir = /Users/plusvic/Projects/yara/trunk/libyara +abs_srcdir = /Users/plusvic/Projects/yara/trunk/libyara +abs_top_builddir = /Users/plusvic/Projects/yara/trunk/libyara +abs_top_srcdir = /Users/plusvic/Projects/yara/trunk/libyara ac_ct_CC = gcc ac_ct_CXX = g++ ac_ct_F77 = @@ -169,10 +169,10 @@ am__quote = am__tar = ${AMTAR} chof - "$$tardir" am__untar = ${AMTAR} xf - bindir = ${exec_prefix}/bin -build = i386-apple-darwin9.5.0 +build = i386-apple-darwin9.6.0 build_alias = build_cpu = i386 -build_os = darwin9.5.0 +build_os = darwin9.6.0 build_vendor = apple builddir = . datadir = ${datarootdir} @@ -180,15 +180,15 @@ datarootdir = ${prefix}/share docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} dvidir = ${docdir} exec_prefix = ${prefix} -host = i386-apple-darwin9.5.0 +host = i386-apple-darwin9.6.0 host_alias = host_cpu = i386 -host_os = darwin9.5.0 +host_os = darwin9.6.0 host_vendor = apple htmldir = ${docdir} includedir = ${prefix}/include infodir = ${datarootdir}/info -install_sh = $(SHELL) /Users/plusvic/Projects/yara/libyara/install-sh +install_sh = $(SHELL) /Users/plusvic/Projects/yara/trunk/libyara/install-sh libdir = ${exec_prefix}/lib libexecdir = ${exec_prefix}/libexec localedir = ${datarootdir}/locale diff --git a/libyara/ast.c b/libyara/ast.c index 706c65c2..803ef7ce 100644 --- a/libyara/ast.c +++ b/libyara/ast.c @@ -158,7 +158,7 @@ int new_rule(RULE_LIST* rules, char* identifier, int flags, TAG* tag_list_head, return result; } -int new_hex_string(char* charstr, unsigned char** hexstr, unsigned char** maskstr, unsigned int* length) +int new_hex_string(SIZED_STRING* charstr, unsigned char** hexstr, unsigned char** maskstr, unsigned int* length) { int i; int skip_lo; @@ -178,7 +178,7 @@ int new_hex_string(char* charstr, unsigned char** hexstr, unsigned char** maskst //assert(charstr && hexstr && maskstr && length); - len = (int) strlen(charstr); + len = (int) charstr->length; //assert(charstr[0] == '{' && charstr[len - 1] == '}'); @@ -199,7 +199,7 @@ int new_hex_string(char* charstr, unsigned char** hexstr, unsigned char** maskst while (i < len - 1) { - c = toupper(charstr[i]); + c = toupper(charstr->c_string[i]); if (c >= 'A' && c <= 'F') { @@ -273,7 +273,7 @@ int new_hex_string(char* charstr, unsigned char** hexstr, unsigned char** maskst nibble_count = 0; - closing_bracket = strchr(charstr + i + 1, ']'); + closing_bracket = strchr(charstr->c_string + i + 1, ']'); if (closing_bracket == NULL) { @@ -293,7 +293,7 @@ int new_hex_string(char* charstr, unsigned char** hexstr, unsigned char** maskst /* only decimal digits and '-' are allowed between brackets */ - for (s = charstr + i + 1; s < closing_bracket; s++) + for (s = charstr->c_string + i + 1; s < closing_bracket; s++) { if ((*s != '-') && (*s < '0' || *s > '9')) { @@ -302,7 +302,7 @@ int new_hex_string(char* charstr, unsigned char** hexstr, unsigned char** maskst } } - skip_lo = atoi(charstr + i + 1); + skip_lo = atoi(charstr->c_string + i + 1); if (skip_lo < 0 || skip_lo > MASK_MAX_SKIP) { @@ -312,7 +312,7 @@ int new_hex_string(char* charstr, unsigned char** hexstr, unsigned char** maskst skip_exact = 1; - s = strchr(charstr + i + 1, '-'); + s = strchr(charstr->c_string + i + 1, '-'); if (s != NULL && s < closing_bracket) { @@ -339,7 +339,7 @@ int new_hex_string(char* charstr, unsigned char** hexstr, unsigned char** maskst *mask++ = (unsigned char) skip_hi; } - i = (int) (closing_bracket - charstr + 1); + i = (int) (closing_bracket - charstr->c_string + 1); } else if (c == ' ') @@ -361,7 +361,7 @@ int new_hex_string(char* charstr, unsigned char** hexstr, unsigned char** maskst *mask++ = MASK_END; - /* wildcards or skip instructions are not allowed at the first two bytes of the string */ + /* wildcards or skip instructions are not allowed at the first position the string */ if ((*maskstr)[0] != 0xFF || (*maskstr)[1] != 0xFF) { @@ -384,46 +384,8 @@ int new_hex_string(char* charstr, unsigned char** hexstr, unsigned char** maskst return result; } -int validate_regexp(char* regexp) -{ - int i = 0; - char* s = regexp; - - while (*s != '\0' && i < 2) - { - if (*s == '\\') /* scaped char */ - { - s += 2; - } - else - { - switch(*s) - { - case '(': - case ')': - case '[': - case ']': - case '{': - case '}': - case '.': - case '*': - case '+': - case '|': - case '$': - case '?': - return ERROR_INVALID_BEGINING_FOR_REGEXP; - } - - s++; - } - - i++; - } - - return ERROR_SUCCESS; -} -int new_text_string(char* charstr, int flags, unsigned char** hexstr, pcre** regexp, unsigned int* length) +int new_text_string(SIZED_STRING* charstr, int flags, unsigned char** hexstr, pcre** regexp, unsigned int* length) { const char *error; int erroffset; @@ -432,8 +394,16 @@ int new_text_string(char* charstr, int flags, unsigned char** hexstr, pcre** reg //assert(charstr && hexstr && regexp && length); - *length = (int) strlen(charstr); - *hexstr = (unsigned char*) strdup(charstr); + *length = charstr->length; + *hexstr = malloc(charstr->length); + + if (*hexstr == NULL) + { + return ERROR_INSUFICIENT_MEMORY; + } + + memcpy(*hexstr, charstr->c_string, charstr->length); + if (flags & STRING_FLAGS_REGEXP) { @@ -448,7 +418,7 @@ int new_text_string(char* charstr, int flags, unsigned char** hexstr, pcre** reg if (*regexp != NULL) { - result = validate_regexp((char*) *hexstr); + result = ERROR_SUCCESS; } else /* compilation failed */ { @@ -465,7 +435,7 @@ int new_text_string(char* charstr, int flags, unsigned char** hexstr, pcre** reg return result; } -int new_string(char* identifier, char* charstr, int flags, STRING** string) +int new_string(char* identifier, SIZED_STRING* charstr, int flags, STRING** string) { STRING* new_string; int result = ERROR_SUCCESS; @@ -661,6 +631,7 @@ RULE_LIST* alloc_rule_list() rule_list->head = NULL; rule_list->tail = NULL; + rule_list->non_hashed_strings = NULL; memset(rule_list->hash_table, 0, sizeof(rule_list->hash_table)); diff --git a/libyara/ast.h b/libyara/ast.h index 4e0afca1..b2bc1c73 100644 --- a/libyara/ast.h +++ b/libyara/ast.h @@ -18,6 +18,7 @@ GNU General Public License for more details. #define _AST_H #include "yara.h" +#include "sizedstr.h" #define MASK_EXACT_SKIP 0xCC #define MASK_RANGE_SKIP 0xDD @@ -49,7 +50,7 @@ GNU General Public License for more details. #define TERM_TYPE_FILESIZE 22 #define TERM_TYPE_ENTRYPOINT 23 #define TERM_TYPE_RULE 24 - +#define TERM_TYPE_OF_THEM 25 typedef struct _TERM_CONST @@ -90,7 +91,7 @@ typedef struct _TERM_STRING int new_rule(RULE_LIST* rules, char* identifier, int flags, TAG* tag_list_head, STRING* string_list_head, TERM* condition); -int new_string(char* identifier, char* charstr, int flags, STRING** string); +int new_string(char* identifier, SIZED_STRING* charstr, int flags, STRING** string); int new_simple_term(int type, TERM** term); diff --git a/libyara/config.h b/libyara/config.h index b4509385..81ef169c 100644 --- a/libyara/config.h +++ b/libyara/config.h @@ -44,19 +44,19 @@ #define PACKAGE_NAME "libyara" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "libyara 1.0" +#define PACKAGE_STRING "libyara 1.1" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "libyara" /* Define to the version of this package. */ -#define PACKAGE_VERSION "1.0" +#define PACKAGE_VERSION "1.1" /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Version number of package */ -#define VERSION "1.0" +#define VERSION "1.1" /* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a `char[]'. */ diff --git a/libyara/configure b/libyara/configure index 48be4134..f9dca0a5 100755 --- a/libyara/configure +++ b/libyara/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.61 for libyara 1.0. +# Generated by GNU Autoconf 2.61 for libyara 1.1. # # Report bugs to . # @@ -728,8 +728,8 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='libyara' PACKAGE_TARNAME='libyara' -PACKAGE_VERSION='1.0' -PACKAGE_STRING='libyara 1.0' +PACKAGE_VERSION='1.1' +PACKAGE_STRING='libyara 1.1' PACKAGE_BUGREPORT='vmalvarez@hispasec.com' # Factoring default headers for most tests. @@ -1396,7 +1396,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures libyara 1.0 to adapt to many kinds of systems. +\`configure' configures libyara 1.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1466,7 +1466,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of libyara 1.0:";; + short | recursive ) echo "Configuration of libyara 1.1:";; esac cat <<\_ACEOF @@ -1573,7 +1573,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -libyara configure 1.0 +libyara configure 1.1 generated by GNU Autoconf 2.61 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @@ -1587,7 +1587,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by libyara $as_me 1.0, which was +It was created by libyara $as_me 1.1, which was generated by GNU Autoconf 2.61. Invocation command line was $ $0 $@ @@ -2277,7 +2277,7 @@ fi # Define the identity of the package. PACKAGE='libyara' - VERSION='1.0' + VERSION='1.1' cat >>confdefs.h <<_ACEOF @@ -20232,7 +20232,7 @@ exec 6>&1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by libyara $as_me 1.0, which was +This file was extended by libyara $as_me 1.1, which was generated by GNU Autoconf 2.61. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -20285,7 +20285,7 @@ Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ -libyara config.status 1.0 +libyara config.status 1.1 configured by $0, generated by GNU Autoconf 2.61, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" diff --git a/libyara/configure.ac b/libyara/configure.ac index b54cd014..a8aff010 100644 --- a/libyara/configure.ac +++ b/libyara/configure.ac @@ -1,4 +1,4 @@ -AC_INIT([libyara], [1.0], [vmalvarez@hispasec.com]) +AC_INIT([libyara], [1.1], [vmalvarez@hispasec.com]) AM_INIT_AUTOMAKE([-Wall -Werror foreign]) AC_PROG_CC AC_PROG_YACC diff --git a/libyara/error.c b/libyara/error.c index 652f27b4..66a5297c 100644 --- a/libyara/error.c +++ b/libyara/error.c @@ -93,10 +93,6 @@ void show_last_error() case ERROR_INVALID_REGULAR_EXPRESSION: yyerror(last_error_extra_info); break; - case ERROR_INVALID_BEGINING_FOR_REGEXP: - sprintf(errmsg, "invalid regular expression in string \"%s\": first two characters of regular expressions must be strictly defined", last_error_extra_info); - yyerror(errmsg); - break; } } diff --git a/libyara/eval.c b/libyara/eval.c index 11084ed5..1b5ecf3b 100644 --- a/libyara/eval.c +++ b/libyara/eval.c @@ -23,6 +23,8 @@ unsigned int evaluate(TERM* term, EVALUATION_CONTEXT* context) unsigned int i; unsigned int offs, hi_bound, lo_bound; + STRING* string; + TERM_CONST* term_const = ((TERM_CONST*) term); TERM_BINARY_OPERATION* term_binary = ((TERM_BINARY_OPERATION*) term); TERM_STRING* term_string = ((TERM_STRING*) term); @@ -161,6 +163,24 @@ unsigned int evaluate(TERM* term, EVALUATION_CONTEXT* context) return (i == 0); + case TERM_TYPE_OF_THEM: + + i = evaluate(term_binary->op1, context); + + string = context->rule->string_list_head; + + while (string != NULL && i > 0) + { + if (string->flags & STRING_FLAGS_FOUND) + { + i--; + } + + string = string->next; + } + + return (i == 0); + default: return 0; } diff --git a/libyara/eval.h b/libyara/eval.h index 41e2fec1..4eb5ffb6 100644 --- a/libyara/eval.h +++ b/libyara/eval.h @@ -23,6 +23,7 @@ typedef struct _EVALUATION_CONTEXT { unsigned int file_size; unsigned int entry_point; + RULE* rule; } EVALUATION_CONTEXT; diff --git a/libyara/grammar.c b/libyara/grammar.c index 1e12a65e..8d277390 100644 --- a/libyara/grammar.c +++ b/libyara/grammar.c @@ -66,9 +66,9 @@ _UNKNOWN_ = 268, _TEXTSTRING_ = 269, _HEXSTRING_ = 270, - _WIDE_ = 271, - _NOCASE_ = 272, - _REGEXP_ = 273, + _REGEXP_ = 271, + _WIDE_ = 272, + _NOCASE_ = 273, _FULLWORD_ = 274, _AT_ = 275, _SIZE_ = 276, @@ -78,22 +78,23 @@ _FILE_ = 280, _IN_ = 281, _OF_ = 282, - _SECTION_ = 283, - _MZ_ = 284, - _PE_ = 285, - _DLL_ = 286, - _TRUE_ = 287, - _FALSE_ = 288, - _OR_ = 289, - _AND_ = 290, - _NOT_ = 291, - _IS_ = 292, - _NEQ_ = 293, - _EQ_ = 294, - _GE_ = 295, - _GT_ = 296, - _LE_ = 297, - _LT_ = 298 + _THEM_ = 283, + _SECTION_ = 284, + _MZ_ = 285, + _PE_ = 286, + _DLL_ = 287, + _TRUE_ = 288, + _FALSE_ = 289, + _OR_ = 290, + _AND_ = 291, + _NOT_ = 292, + _IS_ = 293, + _NEQ_ = 294, + _EQ_ = 295, + _GE_ = 296, + _GT_ = 297, + _LE_ = 298, + _LT_ = 299 }; #endif #define _RULE_ 258 @@ -109,9 +110,9 @@ #define _UNKNOWN_ 268 #define _TEXTSTRING_ 269 #define _HEXSTRING_ 270 -#define _WIDE_ 271 -#define _NOCASE_ 272 -#define _REGEXP_ 273 +#define _REGEXP_ 271 +#define _WIDE_ 272 +#define _NOCASE_ 273 #define _FULLWORD_ 274 #define _AT_ 275 #define _SIZE_ 276 @@ -121,22 +122,23 @@ #define _FILE_ 280 #define _IN_ 281 #define _OF_ 282 -#define _SECTION_ 283 -#define _MZ_ 284 -#define _PE_ 285 -#define _DLL_ 286 -#define _TRUE_ 287 -#define _FALSE_ 288 -#define _OR_ 289 -#define _AND_ 290 -#define _NOT_ 291 -#define _IS_ 292 -#define _NEQ_ 293 -#define _EQ_ 294 -#define _GE_ 295 -#define _GT_ 296 -#define _LE_ 297 -#define _LT_ 298 +#define _THEM_ 283 +#define _SECTION_ 284 +#define _MZ_ 285 +#define _PE_ 286 +#define _DLL_ 287 +#define _TRUE_ 288 +#define _FALSE_ 289 +#define _OR_ 290 +#define _AND_ 291 +#define _NOT_ 292 +#define _IS_ 293 +#define _NEQ_ 294 +#define _EQ_ 295 +#define _GE_ 296 +#define _GT_ 297 +#define _LE_ 298 +#define _LT_ 299 @@ -151,34 +153,10 @@ #include "ast.h" #include "error.h" #include "compile.h" +#include "sizedstr.h" #define YYERROR_VERBOSE -/* Global variables */ - -STRING* current_rule_strings; - -/* Function declarations */ - -void reduce_rule_declaration(char* identifier, int flags, TAG* tag_list_head, STRING* string_list_head, TERM* condition); -TAG* reduce_tags(TAG* tag_list_head, char* identifier); - -STRING* reduce_string_declaration(char* identifier, char* str, int flags); -STRING* reduce_strings(STRING* string_list_head, STRING* string); - -TERM* reduce_string(char* identifier); -TERM* reduce_string_at(char* identifier, TERM* offset); -TERM* reduce_string_in_range(char* identifier, TERM* lower_offset, TERM* upper_offset); -TERM* reduce_string_in_section_by_name(char* identifier, char* section_name); -TERM* reduce_string_count(char* identifier); - -TERM* reduce_filesize(); -TERM* reduce_entrypoint(); -TERM* reduce_term(int type, TERM* op1, TERM* op2); -TERM* reduce_constant(unsigned int constant); -TERM* reduce_rule(char* identifier); -TERM* reduce_boolean_expression_list(TERM* boolean_expression_list_head, TERM* boolean_expression); - /* Enabling traces. */ @@ -195,16 +173,19 @@ TERM* reduce_boolean_expression_list(TERM* boolean_expression_list_head, TERM* b #endif #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) -#line 97 "grammar.y" -typedef union YYSTYPE { - unsigned int integer; - char* pchar; - void* string; - void* term; - void* tag; +#line 75 "grammar.y" +typedef union YYSTYPE { + + void* sized_string; + char* c_string; + unsigned int integer; + void* string; + void* term; + void* tag; + } YYSTYPE; /* Line 190 of yacc.c. */ -#line 208 "grammar.c" +#line 189 "grammar.c" # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 @@ -213,10 +194,39 @@ typedef union YYSTYPE { /* Copy the second part of user declarations. */ +#line 89 "grammar.y" + + +/* Global variables */ + +STRING* current_rule_strings; + +/* Function declarations */ + +void reduce_rule_declaration(char* identifier, int flags, TAG* tag_list_head, STRING* string_list_head, TERM* condition); +TAG* reduce_tags(TAG* tag_list_head, char* identifier); + +STRING* reduce_string_declaration(char* identifier, SIZED_STRING* str, int flags); +STRING* reduce_strings(STRING* string_list_head, STRING* string); + +TERM* reduce_string(char* identifier); +TERM* reduce_string_at(char* identifier, TERM* offset); +TERM* reduce_string_in_range(char* identifier, TERM* lower_offset, TERM* upper_offset); +TERM* reduce_string_in_section_by_name(char* identifier, SIZED_STRING* section_name); +TERM* reduce_string_count(char* identifier); + +TERM* reduce_filesize(); +TERM* reduce_entrypoint(); +TERM* reduce_term(int type, TERM* op1, TERM* op2); +TERM* reduce_constant(unsigned int constant); +TERM* reduce_rule(char* identifier); +TERM* reduce_boolean_expression_list(TERM* boolean_expression_list_head, TERM* boolean_expression); +TERM* reduce_n_of_them(TERM* n); + /* Line 213 of yacc.c. */ -#line 220 "grammar.c" +#line 230 "grammar.c" #if ! defined (yyoverflow) || YYERROR_VERBOSE @@ -318,20 +328,20 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 2 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 159 +#define YYLAST 161 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 58 +#define YYNTOKENS 59 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 16 /* YYNRULES -- Number of rules. */ -#define YYNRULES 61 +#define YYNRULES 62 /* YYNRULES -- Number of states. */ -#define YYNSTATES 117 +#define YYNSTATES 119 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 298 +#define YYMAXUTOK 299 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -343,15 +353,15 @@ static const unsigned char yytranslate[] = 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 55, 56, 46, 44, 57, 45, 53, 47, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 50, 2, - 2, 51, 2, 2, 2, 2, 2, 2, 2, 2, + 56, 57, 47, 45, 58, 46, 54, 48, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 51, 2, + 2, 52, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 52, 2, 54, 2, 2, 2, 2, 2, 2, + 2, 53, 2, 55, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 49, 2, 48, 2, 2, 2, 2, + 2, 2, 2, 50, 2, 49, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -368,7 +378,7 @@ static const unsigned char yytranslate[] = 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43 + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44 }; #if YYDEBUG @@ -377,50 +387,51 @@ static const unsigned char yytranslate[] = static const unsigned char yyprhs[] = { 0, 0, 3, 4, 7, 11, 21, 34, 35, 37, - 39, 40, 43, 45, 48, 50, 53, 58, 62, 63, - 66, 68, 70, 72, 74, 76, 78, 80, 82, 86, - 91, 100, 107, 111, 115, 118, 122, 126, 130, 134, - 138, 142, 146, 150, 154, 158, 162, 166, 168, 172, - 174, 176, 178, 182, 186, 190, 194, 198, 200, 202, - 204, 206 + 39, 40, 43, 45, 48, 50, 53, 58, 63, 67, + 68, 71, 73, 75, 77, 79, 81, 83, 85, 89, + 94, 103, 110, 114, 118, 121, 125, 129, 133, 137, + 141, 145, 149, 153, 157, 161, 165, 169, 173, 175, + 179, 181, 183, 185, 189, 193, 197, 201, 205, 207, + 209, 211, 213 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yysigned_char yyrhs[] = { - 59, 0, -1, -1, 59, 60, -1, 59, 1, 48, - -1, 61, 3, 9, 62, 49, 7, 50, 68, 48, - -1, 61, 3, 9, 62, 49, 6, 50, 64, 7, - 50, 68, 48, -1, -1, 4, -1, 5, -1, -1, - 50, 63, -1, 9, -1, 63, 9, -1, 65, -1, - 64, 65, -1, 10, 51, 14, 66, -1, 10, 51, - 15, -1, -1, 66, 67, -1, 16, -1, 17, -1, - 18, -1, 19, -1, 32, -1, 33, -1, 9, -1, - 10, -1, 10, 20, 71, -1, 10, 20, 23, 71, - -1, 10, 26, 52, 71, 53, 53, 71, 54, -1, - 10, 26, 28, 52, 14, 54, -1, 25, 37, 73, - -1, 55, 68, 56, -1, 36, 68, -1, 68, 35, - 68, -1, 68, 34, 68, -1, 68, 37, 68, -1, - 71, 43, 71, -1, 71, 41, 71, -1, 71, 42, - 71, -1, 71, 40, 71, -1, 71, 39, 71, -1, - 71, 37, 71, -1, 71, 38, 71, -1, 72, 27, - 69, -1, 55, 70, 56, -1, 68, -1, 70, 57, - 68, -1, 21, -1, 22, -1, 11, -1, 55, 71, - 56, -1, 71, 44, 71, -1, 71, 45, 71, -1, - 71, 46, 71, -1, 71, 47, 71, -1, 72, -1, - 12, -1, 29, -1, 30, -1, 31, -1 + 60, 0, -1, -1, 60, 61, -1, 60, 1, 49, + -1, 62, 3, 9, 63, 50, 7, 51, 69, 49, + -1, 62, 3, 9, 63, 50, 6, 51, 65, 7, + 51, 69, 49, -1, -1, 4, -1, 5, -1, -1, + 51, 64, -1, 9, -1, 64, 9, -1, 66, -1, + 65, 66, -1, 10, 52, 14, 67, -1, 10, 52, + 16, 67, -1, 10, 52, 15, -1, -1, 67, 68, + -1, 17, -1, 18, -1, 19, -1, 33, -1, 34, + -1, 9, -1, 10, -1, 10, 20, 72, -1, 10, + 20, 23, 72, -1, 10, 26, 53, 72, 54, 54, + 72, 55, -1, 10, 26, 29, 53, 14, 55, -1, + 25, 38, 74, -1, 56, 69, 57, -1, 37, 69, + -1, 69, 36, 69, -1, 69, 35, 69, -1, 69, + 38, 69, -1, 72, 44, 72, -1, 72, 42, 72, + -1, 72, 43, 72, -1, 72, 41, 72, -1, 72, + 40, 72, -1, 72, 38, 72, -1, 72, 39, 72, + -1, 73, 27, 70, -1, 73, 27, 28, -1, 56, + 71, 57, -1, 69, -1, 71, 58, 69, -1, 21, + -1, 22, -1, 11, -1, 56, 72, 57, -1, 72, + 45, 72, -1, 72, 46, 72, -1, 72, 47, 72, + -1, 72, 48, 72, -1, 73, -1, 12, -1, 30, + -1, 31, -1, 32, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const unsigned short int yyrline[] = { - 0, 108, 108, 109, 118, 121, 122, 125, 126, 127, - 130, 131, 134, 144, 156, 166, 178, 189, 202, 203, - 206, 207, 208, 209, 212, 213, 214, 225, 236, 246, - 250, 261, 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 282, 283, 284, 285, 290, 293, 297, 303, - 304, 305, 316, 317, 318, 319, 320, 321, 324, 327, - 328, 329 + 0, 121, 121, 122, 131, 134, 135, 138, 139, 140, + 143, 144, 147, 157, 169, 179, 191, 202, 213, 226, + 227, 230, 231, 232, 235, 236, 237, 248, 259, 269, + 273, 284, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 312, 315, 319, + 325, 326, 327, 338, 339, 340, 341, 342, 343, 346, + 349, 350, 351 }; #endif @@ -432,13 +443,13 @@ static const char *const yytname[] = "$end", "error", "$undefined", "_RULE_", "_PRIVATE_", "_GLOBAL_", "_STRINGS_", "_CONDITION_", "_END_", "_IDENTIFIER_", "_STRING_IDENTIFIER_", "_STRING_COUNT_", "_NUMBER_", "_UNKNOWN_", - "_TEXTSTRING_", "_HEXSTRING_", "_WIDE_", "_NOCASE_", "_REGEXP_", + "_TEXTSTRING_", "_HEXSTRING_", "_REGEXP_", "_WIDE_", "_NOCASE_", "_FULLWORD_", "_AT_", "_SIZE_", "_ENTRYPOINT_", "_RVA_", "_OFFSET_", - "_FILE_", "_IN_", "_OF_", "_SECTION_", "_MZ_", "_PE_", "_DLL_", "_TRUE_", - "_FALSE_", "_OR_", "_AND_", "_NOT_", "_IS_", "_NEQ_", "_EQ_", "_GE_", - "_GT_", "_LE_", "_LT_", "'+'", "'-'", "'*'", "'/'", "'}'", "'{'", "':'", - "'='", "'['", "'.'", "']'", "'('", "')'", "','", "$accept", "rules", - "rule", "rule_modifier", "tags", "tag_list", "strings", + "_FILE_", "_IN_", "_OF_", "_THEM_", "_SECTION_", "_MZ_", "_PE_", "_DLL_", + "_TRUE_", "_FALSE_", "_OR_", "_AND_", "_NOT_", "_IS_", "_NEQ_", "_EQ_", + "_GE_", "_GT_", "_LE_", "_LT_", "'+'", "'-'", "'*'", "'/'", "'}'", "'{'", + "':'", "'='", "'['", "'.'", "']'", "'('", "')'", "','", "$accept", + "rules", "rule", "rule_modifier", "tags", "tag_list", "strings", "string_declaration", "string_modifiers", "string_modifier", "boolean_expression", "boolean_expression_list", "boolean_expressions", "expression", "number", "type", 0 @@ -454,33 +465,33 @@ static const unsigned short int yytoknum[] = 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 43, 45, 42, 47, 125, 123, - 58, 61, 91, 46, 93, 40, 41, 44 + 295, 296, 297, 298, 299, 43, 45, 42, 47, 125, + 123, 58, 61, 91, 46, 93, 40, 41, 44 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const unsigned char yyr1[] = { - 0, 58, 59, 59, 59, 60, 60, 61, 61, 61, - 62, 62, 63, 63, 64, 64, 65, 65, 66, 66, - 67, 67, 67, 67, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 69, 70, 70, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 72, 73, - 73, 73 + 0, 59, 60, 60, 60, 61, 61, 62, 62, 62, + 63, 63, 64, 64, 65, 65, 66, 66, 66, 67, + 67, 68, 68, 68, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 70, 71, 71, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 73, + 74, 74, 74 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const unsigned char yyr2[] = { 0, 2, 0, 2, 3, 9, 12, 0, 1, 1, - 0, 2, 1, 2, 1, 2, 4, 3, 0, 2, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 4, + 0, 2, 1, 2, 1, 2, 4, 4, 3, 0, + 2, 1, 1, 1, 1, 1, 1, 1, 3, 4, 8, 6, 3, 3, 2, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 1, 3, 1, - 1, 1, 3, 3, 3, 3, 3, 1, 1, 1, - 1, 1 + 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, + 1, 1, 1, 3, 3, 3, 3, 3, 1, 1, + 1, 1, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -490,49 +501,49 @@ static const unsigned char yydefact[] = { 2, 0, 1, 0, 8, 9, 3, 0, 4, 0, 10, 0, 0, 12, 11, 0, 13, 0, 0, 0, - 0, 0, 0, 14, 26, 27, 51, 58, 49, 50, - 0, 24, 25, 0, 0, 0, 0, 57, 0, 0, + 0, 0, 0, 14, 26, 27, 52, 59, 50, 51, + 0, 24, 25, 0, 0, 0, 0, 58, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 18, 17, 0, 0, 0, 28, 57, - 0, 0, 59, 60, 61, 32, 33, 52, 36, 35, - 37, 43, 44, 42, 41, 39, 40, 38, 53, 54, - 55, 56, 0, 45, 16, 0, 29, 0, 0, 0, - 47, 0, 20, 21, 22, 23, 19, 6, 0, 0, - 46, 0, 31, 0, 48, 0, 30 + 0, 0, 0, 19, 18, 19, 0, 0, 0, 28, + 58, 0, 0, 60, 61, 62, 32, 33, 53, 36, + 35, 37, 43, 44, 42, 41, 39, 40, 38, 54, + 55, 56, 57, 46, 0, 45, 16, 17, 0, 29, + 0, 0, 0, 48, 0, 21, 22, 23, 20, 6, + 0, 0, 47, 0, 31, 0, 49, 0, 30 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yysigned_char yydefgoto[] = { - -1, 1, 6, 7, 12, 14, 22, 23, 94, 106, - 35, 93, 101, 36, 69, 75 + -1, 1, 6, 7, 12, 14, 22, 23, 96, 108, + 35, 95, 104, 36, 70, 76 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -45 +#define YYPACT_NINF -38 static const short int yypact[] = { - -45, 114, -45, -44, -45, -45, -45, 16, -45, 17, - -4, 40, 2, -45, 58, 72, -45, 70, 100, 82, - 44, 65, 1, -45, -45, 42, -45, -45, -45, -45, - 105, -45, -45, 44, 44, -25, 86, 124, 75, 102, - -45, -5, -27, 67, 116, -32, 66, 44, 44, 44, - -45, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 99, -45, -45, 44, 9, 9, 94, -45, - 103, 9, -45, -45, -45, -45, -45, -45, 116, 116, - -45, 94, 94, 94, 94, 94, 94, 94, 54, 54, - -45, -45, 44, -45, 128, 26, 94, 37, 142, 90, - 36, 92, -45, -45, -45, -45, -45, -45, 104, 106, - -45, 44, -45, 9, 36, 41, -45 + -38, 119, -38, -37, -38, -38, -38, 42, -38, 41, + 1, 51, 19, -38, 76, 74, -38, 22, 36, 82, + 45, 93, -2, -38, -38, -17, -38, -38, -38, -38, + 108, -38, -38, 45, 45, 23, 88, 121, 61, 98, + -38, -5, 15, 32, 117, -34, 64, 45, 45, 45, + -38, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, -9, -38, -38, -38, 45, 9, 9, 106, + -38, 103, 9, -38, -38, -38, -38, -38, -38, 117, + 117, -38, 106, 106, 106, 106, 106, 106, 106, 47, + 47, -38, -38, -38, 45, -38, 81, 81, 48, 106, + 68, 143, 96, 53, 60, -38, -38, -38, -38, -38, + 104, 107, -38, 45, -38, 9, 53, 92, -38 }; /* YYPGOTO[NTERM-NUM]. */ static const short int yypgoto[] = { - -45, -45, -45, -45, -45, -45, -45, 135, -45, -45, - 10, -45, -45, -19, -20, -45 + -38, -38, -38, -38, -38, -38, -38, 136, 95, -38, + -23, -38, -38, -19, -20, -38 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If @@ -542,60 +553,62 @@ static const short int yypgoto[] = #define YYTABLE_NINF -8 static const yysigned_char yytable[] = { - 37, 70, 47, 48, 8, 49, 26, 27, 39, 47, - 48, 21, 49, 37, 37, 46, 28, 29, 66, 9, - 26, 27, 68, 50, 76, 71, 10, 37, 37, 37, - 28, 29, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 44, 45, 37, 11, 96, 97, 13, - 67, 15, 99, 24, 25, 26, 27, 78, 79, 80, - 47, 48, 41, 49, 67, 28, 29, 16, 42, 30, - 47, 48, 37, 49, 107, 95, 31, 32, 17, 18, - 33, 58, 59, 60, 61, 58, 59, 60, 61, 63, - 64, 37, 21, 77, 115, 116, 72, 73, 74, 34, - 60, 61, 100, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 2, 3, 38, -7, 4, 5, - 19, 114, 77, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 58, 59, 60, 61, 58, 59, - 60, 61, 43, 109, 102, 103, 104, 105, 110, 111, - 20, 62, 65, 49, 92, 98, 108, 40, 112, 113 + 37, 47, 48, 41, 49, 39, 26, 27, 21, 42, + 44, 45, 8, 37, 37, 46, 28, 29, 67, 93, + 26, 27, 69, 77, 79, 80, 81, 37, 37, 37, + 28, 29, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 98, 71, 9, 37, 94, 99, 100, + 10, 68, 11, 102, 24, 25, 26, 27, 47, 48, + 13, 49, 73, 74, 75, 68, 28, 29, 72, 15, + 30, 103, 50, 19, 37, 63, 64, 65, 31, 32, + 17, 18, 33, 47, 48, 16, 49, 20, 47, 48, + 116, 49, 21, 37, 60, 61, 117, 109, 105, 106, + 107, 34, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 58, 59, 60, 61, 112, 113, 2, + 3, 78, -7, 4, 5, 78, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 58, 59, 60, + 61, 58, 59, 60, 61, 38, 43, 118, 62, 66, + 111, 58, 59, 60, 61, 49, 101, 110, 40, 114, + 97, 115 }; static const unsigned char yycheck[] = { - 20, 28, 34, 35, 48, 37, 11, 12, 7, 34, - 35, 10, 37, 33, 34, 34, 21, 22, 23, 3, - 11, 12, 41, 48, 56, 52, 9, 47, 48, 49, + 20, 35, 36, 20, 38, 7, 11, 12, 10, 26, + 33, 34, 49, 33, 34, 34, 21, 22, 23, 28, + 11, 12, 41, 57, 47, 48, 49, 47, 48, 49, 21, 22, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 33, 34, 65, 50, 66, 67, 9, - 55, 49, 71, 9, 10, 11, 12, 47, 48, 49, - 34, 35, 20, 37, 55, 21, 22, 9, 26, 25, - 34, 35, 92, 37, 48, 65, 32, 33, 6, 7, - 36, 44, 45, 46, 47, 44, 45, 46, 47, 14, - 15, 111, 10, 56, 113, 54, 29, 30, 31, 55, - 46, 47, 92, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 0, 1, 51, 3, 4, 5, - 50, 111, 56, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 44, 45, 46, 47, 44, 45, - 46, 47, 37, 53, 16, 17, 18, 19, 56, 57, - 50, 27, 50, 37, 55, 52, 14, 22, 54, 53 + 59, 60, 61, 66, 29, 3, 66, 56, 67, 68, + 9, 56, 51, 72, 9, 10, 11, 12, 35, 36, + 9, 38, 30, 31, 32, 56, 21, 22, 53, 50, + 25, 94, 49, 51, 94, 14, 15, 16, 33, 34, + 6, 7, 37, 35, 36, 9, 38, 51, 35, 36, + 113, 38, 10, 113, 47, 48, 115, 49, 17, 18, + 19, 56, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 45, 46, 47, 48, 57, 58, 0, + 1, 57, 3, 4, 5, 57, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 45, 46, 47, + 48, 45, 46, 47, 48, 52, 38, 55, 27, 51, + 54, 45, 46, 47, 48, 38, 53, 14, 22, 55, + 65, 54 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const unsigned char yystos[] = { - 0, 59, 0, 1, 4, 5, 60, 61, 48, 3, - 9, 50, 62, 9, 63, 49, 9, 6, 7, 50, - 50, 10, 64, 65, 9, 10, 11, 12, 21, 22, - 25, 32, 33, 36, 55, 68, 71, 72, 51, 7, - 65, 20, 26, 37, 68, 68, 71, 34, 35, 37, - 48, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 27, 14, 15, 50, 23, 55, 71, 72, - 28, 52, 29, 30, 31, 73, 56, 56, 68, 68, - 68, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 55, 69, 66, 68, 71, 71, 52, 71, - 68, 70, 16, 17, 18, 19, 67, 48, 14, 53, - 56, 57, 54, 53, 68, 71, 54 + 0, 60, 0, 1, 4, 5, 61, 62, 49, 3, + 9, 51, 63, 9, 64, 50, 9, 6, 7, 51, + 51, 10, 65, 66, 9, 10, 11, 12, 21, 22, + 25, 33, 34, 37, 56, 69, 72, 73, 52, 7, + 66, 20, 26, 38, 69, 69, 72, 35, 36, 38, + 49, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 27, 14, 15, 16, 51, 23, 56, 72, + 73, 29, 53, 30, 31, 32, 74, 57, 57, 69, + 69, 69, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 28, 56, 70, 67, 67, 69, 72, + 72, 53, 72, 69, 71, 17, 18, 19, 68, 49, + 14, 54, 57, 58, 55, 54, 69, 72, 55 }; #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) @@ -932,6 +945,26 @@ yydestruct (yymsg, yytype, yyvaluep) switch (yytype) { + case 9: /* _IDENTIFIER_ */ +#line 86 "grammar.y" + { free ((yyvaluep->c_string)); }; +#line 952 "grammar.c" + break; + case 14: /* _TEXTSTRING_ */ +#line 86 "grammar.y" + { free ((yyvaluep->sized_string)); }; +#line 957 "grammar.c" + break; + case 15: /* _HEXSTRING_ */ +#line 86 "grammar.y" + { free ((yyvaluep->sized_string)); }; +#line 962 "grammar.c" + break; + case 16: /* _REGEXP_ */ +#line 86 "grammar.y" + { free ((yyvaluep->sized_string)); }; +#line 967 "grammar.c" + break; default: break; @@ -1236,7 +1269,7 @@ yyreduce: switch (yyn) { case 3: -#line 110 "grammar.y" +#line 123 "grammar.y" { if (last_error != ERROR_SUCCESS) { @@ -1248,44 +1281,44 @@ yyreduce: break; case 5: -#line 121 "grammar.y" - { reduce_rule_declaration((yyvsp[-6].pchar),(yyvsp[-8].integer),(yyvsp[-5].tag),0,(yyvsp[-1].term)); } +#line 134 "grammar.y" + { reduce_rule_declaration((yyvsp[-6].c_string),(yyvsp[-8].integer),(yyvsp[-5].tag),0,(yyvsp[-1].term)); } break; case 6: -#line 122 "grammar.y" - { reduce_rule_declaration((yyvsp[-9].pchar),(yyvsp[-11].integer),(yyvsp[-8].tag),(yyvsp[-4].string),(yyvsp[-1].term)); } +#line 135 "grammar.y" + { reduce_rule_declaration((yyvsp[-9].c_string),(yyvsp[-11].integer),(yyvsp[-8].tag),(yyvsp[-4].string),(yyvsp[-1].term)); } break; case 7: -#line 125 "grammar.y" +#line 138 "grammar.y" { (yyval.integer) = 0; } break; case 8: -#line 126 "grammar.y" +#line 139 "grammar.y" { (yyval.integer) = RULE_FLAGS_PRIVATE; } break; case 9: -#line 127 "grammar.y" +#line 140 "grammar.y" { (yyval.integer) = RULE_FLAGS_GLOBAL; } break; case 10: -#line 130 "grammar.y" +#line 143 "grammar.y" { (yyval.tag) = NULL; } break; case 11: -#line 131 "grammar.y" +#line 144 "grammar.y" { (yyval.tag) = (yyvsp[0].tag); } break; case 12: -#line 134 "grammar.y" +#line 147 "grammar.y" { - (yyval.tag) = reduce_tags(NULL,(yyvsp[0].pchar)); + (yyval.tag) = reduce_tags(NULL,(yyvsp[0].c_string)); if ((yyval.tag) == NULL) { @@ -1297,9 +1330,9 @@ yyreduce: break; case 13: -#line 144 "grammar.y" +#line 157 "grammar.y" { - (yyval.tag) = reduce_tags((yyvsp[-1].tag),(yyvsp[0].pchar)); + (yyval.tag) = reduce_tags((yyvsp[-1].tag),(yyvsp[0].c_string)); if ((yyval.tag) == NULL) { @@ -1311,7 +1344,7 @@ yyreduce: break; case 14: -#line 156 "grammar.y" +#line 169 "grammar.y" { (yyval.string) = reduce_strings(NULL,(yyvsp[0].string)); @@ -1325,7 +1358,7 @@ yyreduce: break; case 15: -#line 166 "grammar.y" +#line 179 "grammar.y" { (yyval.string) = reduce_strings((yyvsp[-1].string),(yyvsp[0].string)); @@ -1339,9 +1372,9 @@ yyreduce: break; case 16: -#line 179 "grammar.y" +#line 192 "grammar.y" { - (yyval.string) = reduce_string_declaration((yyvsp[-3].term), (yyvsp[-1].pchar), (yyvsp[0].integer)); + (yyval.string) = reduce_string_declaration((yyvsp[-3].term), (yyvsp[-1].sized_string), (yyvsp[0].integer)); if ((yyval.string) == NULL) { @@ -1353,9 +1386,23 @@ yyreduce: break; case 17: -#line 190 "grammar.y" +#line 203 "grammar.y" + { + (yyval.string) = reduce_string_declaration((yyvsp[-3].term), (yyvsp[-1].sized_string), (yyvsp[0].integer) | STRING_FLAGS_REGEXP); + + if ((yyval.string) == NULL) + { + show_last_error(); + yynerrs++; + YYERROR; + } + } + break; + + case 18: +#line 214 "grammar.y" { - (yyval.string) = reduce_string_declaration((yyvsp[-2].term), (yyvsp[0].pchar), STRING_FLAGS_HEXADECIMAL); + (yyval.string) = reduce_string_declaration((yyvsp[-2].term), (yyvsp[0].sized_string), STRING_FLAGS_HEXADECIMAL); if ((yyval.string) == NULL) { @@ -1366,50 +1413,45 @@ yyreduce: } break; - case 18: -#line 202 "grammar.y" + case 19: +#line 226 "grammar.y" { (yyval.integer) = 0; } break; - case 19: -#line 203 "grammar.y" + case 20: +#line 227 "grammar.y" { (yyval.integer) = (yyvsp[-1].integer) | (yyvsp[0].integer); } break; - case 20: -#line 206 "grammar.y" + case 21: +#line 230 "grammar.y" { (yyval.integer) = STRING_FLAGS_WIDE; } break; - case 21: -#line 207 "grammar.y" + case 22: +#line 231 "grammar.y" { (yyval.integer) = STRING_FLAGS_NO_CASE; } break; - case 22: -#line 208 "grammar.y" - { (yyval.integer) = STRING_FLAGS_REGEXP; } - break; - case 23: -#line 209 "grammar.y" +#line 232 "grammar.y" { (yyval.integer) = STRING_FLAGS_FULL_WORD; } break; case 24: -#line 212 "grammar.y" +#line 235 "grammar.y" { (yyval.term) = reduce_constant(1); } break; case 25: -#line 213 "grammar.y" +#line 236 "grammar.y" { (yyval.term) = reduce_constant(0); } break; case 26: -#line 215 "grammar.y" +#line 238 "grammar.y" { - (yyval.term) = reduce_rule((yyvsp[0].pchar)); + (yyval.term) = reduce_rule((yyvsp[0].c_string)); if ((yyval.term) == NULL) { @@ -1421,7 +1463,7 @@ yyreduce: break; case 27: -#line 226 "grammar.y" +#line 249 "grammar.y" { (yyval.term) = reduce_string((yyvsp[0].term)); @@ -1435,7 +1477,7 @@ yyreduce: break; case 28: -#line 237 "grammar.y" +#line 260 "grammar.y" { (yyval.term) = reduce_string_at((yyvsp[-2].term), (yyvsp[0].term)); @@ -1448,14 +1490,14 @@ yyreduce: break; case 29: -#line 247 "grammar.y" +#line 270 "grammar.y" { (yyval.term) = NULL; } break; case 30: -#line 251 "grammar.y" +#line 274 "grammar.y" { (yyval.term) = reduce_string_in_range((yyvsp[-7].term), (yyvsp[-4].term), (yyvsp[-1].term)); @@ -1469,9 +1511,9 @@ yyreduce: break; case 31: -#line 262 "grammar.y" +#line 285 "grammar.y" { - (yyval.term) = reduce_string_in_section_by_name((yyvsp[-5].term), (yyvsp[-1].pchar)); + (yyval.term) = reduce_string_in_section_by_name((yyvsp[-5].term), (yyvsp[-1].sized_string)); if ((yyval.term) == NULL) { @@ -1483,106 +1525,111 @@ yyreduce: break; case 32: -#line 272 "grammar.y" +#line 295 "grammar.y" { (yyval.term) = NULL; } break; case 33: -#line 273 "grammar.y" +#line 296 "grammar.y" { (yyval.term) = (yyvsp[-1].term); } break; case 34: -#line 274 "grammar.y" +#line 297 "grammar.y" { (yyval.term) = reduce_term(TERM_TYPE_NOT, (yyvsp[0].term), NULL); } break; case 35: -#line 275 "grammar.y" +#line 298 "grammar.y" { (yyval.term) = reduce_term(TERM_TYPE_AND, (yyvsp[-2].term), (yyvsp[0].term)); } break; case 36: -#line 276 "grammar.y" +#line 299 "grammar.y" { (yyval.term) = reduce_term(TERM_TYPE_OR, (yyvsp[-2].term), (yyvsp[0].term)); } break; case 37: -#line 277 "grammar.y" +#line 300 "grammar.y" { (yyval.term) = reduce_term(TERM_TYPE_EQ, (yyvsp[-2].term), (yyvsp[0].term)); } break; case 38: -#line 278 "grammar.y" +#line 301 "grammar.y" { (yyval.term) = reduce_term(TERM_TYPE_LT, (yyvsp[-2].term), (yyvsp[0].term)); } break; case 39: -#line 279 "grammar.y" +#line 302 "grammar.y" { (yyval.term) = reduce_term(TERM_TYPE_GT, (yyvsp[-2].term), (yyvsp[0].term)); } break; case 40: -#line 280 "grammar.y" +#line 303 "grammar.y" { (yyval.term) = reduce_term(TERM_TYPE_LE, (yyvsp[-2].term), (yyvsp[0].term)); } break; case 41: -#line 281 "grammar.y" +#line 304 "grammar.y" { (yyval.term) = reduce_term(TERM_TYPE_GE, (yyvsp[-2].term), (yyvsp[0].term)); } break; case 42: -#line 282 "grammar.y" +#line 305 "grammar.y" { (yyval.term) = reduce_term(TERM_TYPE_EQ, (yyvsp[-2].term), (yyvsp[0].term)); } break; case 43: -#line 283 "grammar.y" +#line 306 "grammar.y" { (yyval.term) = reduce_term(TERM_TYPE_EQ, (yyvsp[-2].term), (yyvsp[0].term)); } break; case 44: -#line 284 "grammar.y" +#line 307 "grammar.y" { (yyval.term) = reduce_term(TERM_TYPE_NOT_EQ, (yyvsp[-2].term), (yyvsp[0].term)); } break; case 45: -#line 285 "grammar.y" +#line 308 "grammar.y" { (yyval.term) = reduce_term(TERM_TYPE_OF, (yyvsp[-2].term), (yyvsp[0].term)); } break; case 46: -#line 290 "grammar.y" - { (yyval.term) = (yyvsp[-1].term); } +#line 309 "grammar.y" + { (yyval.term) = reduce_n_of_them((yyvsp[-2].term)); } break; case 47: -#line 294 "grammar.y" +#line 312 "grammar.y" + { (yyval.term) = (yyvsp[-1].term); } + break; + + case 48: +#line 316 "grammar.y" { (yyval.term) = reduce_boolean_expression_list(NULL,(yyvsp[0].term)); } break; - case 48: -#line 298 "grammar.y" + case 49: +#line 320 "grammar.y" { (yyval.term) = reduce_boolean_expression_list((yyvsp[-2].term),(yyvsp[0].term)); } break; - case 49: -#line 303 "grammar.y" + case 50: +#line 325 "grammar.y" { (yyval.term) = reduce_filesize(); } break; - case 50: -#line 304 "grammar.y" + case 51: +#line 326 "grammar.y" { (yyval.term) = reduce_entrypoint(); } break; - case 51: -#line 306 "grammar.y" + case 52: +#line 328 "grammar.y" { (yyval.term) = reduce_string_count((yyvsp[0].term)); @@ -1595,33 +1642,33 @@ yyreduce: } break; - case 52: -#line 316 "grammar.y" + case 53: +#line 338 "grammar.y" { (yyval.term) = (yyvsp[-1].term); } break; - case 53: -#line 317 "grammar.y" + case 54: +#line 339 "grammar.y" { (yyval.term) = reduce_term(TERM_TYPE_ADD, (yyvsp[-2].term), (yyvsp[0].term)); } break; - case 54: -#line 318 "grammar.y" + case 55: +#line 340 "grammar.y" { (yyval.term) = reduce_term(TERM_TYPE_SUB, (yyvsp[-2].term), (yyvsp[0].term)); } break; - case 55: -#line 319 "grammar.y" + case 56: +#line 341 "grammar.y" { (yyval.term) = reduce_term(TERM_TYPE_MUL, (yyvsp[-2].term), (yyvsp[0].term)); } break; - case 56: -#line 320 "grammar.y" + case 57: +#line 342 "grammar.y" { (yyval.term) = reduce_term(TERM_TYPE_DIV, (yyvsp[-2].term), (yyvsp[0].term)); } break; - case 58: -#line 324 "grammar.y" + case 59: +#line 346 "grammar.y" { (yyval.term) = reduce_constant((yyvsp[0].integer)); } break; @@ -1629,7 +1676,7 @@ yyreduce: } /* Line 1037 of yacc.c. */ -#line 1633 "grammar.c" +#line 1680 "grammar.c" yyvsp -= yylen; yyssp -= yylen; @@ -1857,7 +1904,7 @@ yyreturn: } -#line 332 "grammar.y" +#line 354 "grammar.y" @@ -1889,11 +1936,11 @@ void reduce_rule_declaration(char* identifier, int flags, TAG* tag_list_head, ST } } -STRING* reduce_string_declaration(char* identifier, char* str, int flags) +STRING* reduce_string_declaration(char* identifier, SIZED_STRING* str, int flags) { char tmp[200]; STRING* string = NULL; - + last_error = new_string(identifier, str, flags, &string); if (last_error == ERROR_INVALID_REGULAR_EXPRESSION) @@ -2043,7 +2090,7 @@ TERM* reduce_string_in_range(char* identifier, TERM* lower_offset, TERM* upper_o return (TERM*) term; } -TERM* reduce_string_in_section_by_name(char* identifier, char* section_name) +TERM* reduce_string_in_section_by_name(char* identifier, SIZED_STRING* section_name) { TERM_STRING* term = NULL; @@ -2055,9 +2102,10 @@ TERM* reduce_string_in_section_by_name(char* identifier, char* section_name) } else { - term->section_name = section_name; + term->section_name = strdup(section_name->c_string); } + free(section_name); free(identifier); return (TERM*) term; } @@ -2105,6 +2153,26 @@ TERM* reduce_boolean_expression_list(TERM* boolean_expression_list_head, TERM* b return boolean_expression; } +TERM* reduce_n_of_them(TERM* n) +{ + STRING* string; + TERM_BINARY_OPERATION* term; + + last_error = new_binary_operation(TERM_TYPE_OF_THEM, n, NULL, &term); + + /* the keyword THEM implicitly references all the strings + on the rule, so let's flag them as referenced */ + + string = current_rule_strings; + + while (string != NULL) + { + string->flags |= STRING_FLAGS_REFERENCED; + string = string->next; + } + + return (TERM*) term; +} diff --git a/libyara/grammar.h b/libyara/grammar.h index 02155425..89ff75fe 100644 --- a/libyara/grammar.h +++ b/libyara/grammar.h @@ -42,9 +42,9 @@ _UNKNOWN_ = 268, _TEXTSTRING_ = 269, _HEXSTRING_ = 270, - _WIDE_ = 271, - _NOCASE_ = 272, - _REGEXP_ = 273, + _REGEXP_ = 271, + _WIDE_ = 272, + _NOCASE_ = 273, _FULLWORD_ = 274, _AT_ = 275, _SIZE_ = 276, @@ -54,22 +54,23 @@ _FILE_ = 280, _IN_ = 281, _OF_ = 282, - _SECTION_ = 283, - _MZ_ = 284, - _PE_ = 285, - _DLL_ = 286, - _TRUE_ = 287, - _FALSE_ = 288, - _OR_ = 289, - _AND_ = 290, - _NOT_ = 291, - _IS_ = 292, - _NEQ_ = 293, - _EQ_ = 294, - _GE_ = 295, - _GT_ = 296, - _LE_ = 297, - _LT_ = 298 + _THEM_ = 283, + _SECTION_ = 284, + _MZ_ = 285, + _PE_ = 286, + _DLL_ = 287, + _TRUE_ = 288, + _FALSE_ = 289, + _OR_ = 290, + _AND_ = 291, + _NOT_ = 292, + _IS_ = 293, + _NEQ_ = 294, + _EQ_ = 295, + _GE_ = 296, + _GT_ = 297, + _LE_ = 298, + _LT_ = 299 }; #endif #define _RULE_ 258 @@ -85,9 +86,9 @@ #define _UNKNOWN_ 268 #define _TEXTSTRING_ 269 #define _HEXSTRING_ 270 -#define _WIDE_ 271 -#define _NOCASE_ 272 -#define _REGEXP_ 273 +#define _REGEXP_ 271 +#define _WIDE_ 272 +#define _NOCASE_ 273 #define _FULLWORD_ 274 #define _AT_ 275 #define _SIZE_ 276 @@ -97,37 +98,41 @@ #define _FILE_ 280 #define _IN_ 281 #define _OF_ 282 -#define _SECTION_ 283 -#define _MZ_ 284 -#define _PE_ 285 -#define _DLL_ 286 -#define _TRUE_ 287 -#define _FALSE_ 288 -#define _OR_ 289 -#define _AND_ 290 -#define _NOT_ 291 -#define _IS_ 292 -#define _NEQ_ 293 -#define _EQ_ 294 -#define _GE_ 295 -#define _GT_ 296 -#define _LE_ 297 -#define _LT_ 298 +#define _THEM_ 283 +#define _SECTION_ 284 +#define _MZ_ 285 +#define _PE_ 286 +#define _DLL_ 287 +#define _TRUE_ 288 +#define _FALSE_ 289 +#define _OR_ 290 +#define _AND_ 291 +#define _NOT_ 292 +#define _IS_ 293 +#define _NEQ_ 294 +#define _EQ_ 295 +#define _GE_ 296 +#define _GT_ 297 +#define _LE_ 298 +#define _LT_ 299 #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) -#line 97 "grammar.y" -typedef union YYSTYPE { - unsigned int integer; - char* pchar; - void* string; - void* term; - void* tag; +#line 75 "grammar.y" +typedef union YYSTYPE { + + void* sized_string; + char* c_string; + unsigned int integer; + void* string; + void* term; + void* tag; + } YYSTYPE; /* Line 1318 of yacc.c. */ -#line 131 "grammar.h" +#line 136 "grammar.h" # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 diff --git a/libyara/grammar.y b/libyara/grammar.y index a7daa572..243b8cd7 100644 --- a/libyara/grammar.y +++ b/libyara/grammar.y @@ -7,34 +7,10 @@ #include "ast.h" #include "error.h" #include "compile.h" +#include "sizedstr.h" #define YYERROR_VERBOSE -/* Global variables */ - -STRING* current_rule_strings; - -/* Function declarations */ - -void reduce_rule_declaration(char* identifier, int flags, TAG* tag_list_head, STRING* string_list_head, TERM* condition); -TAG* reduce_tags(TAG* tag_list_head, char* identifier); - -STRING* reduce_string_declaration(char* identifier, char* str, int flags); -STRING* reduce_strings(STRING* string_list_head, STRING* string); - -TERM* reduce_string(char* identifier); -TERM* reduce_string_at(char* identifier, TERM* offset); -TERM* reduce_string_in_range(char* identifier, TERM* lower_offset, TERM* upper_offset); -TERM* reduce_string_in_section_by_name(char* identifier, char* section_name); -TERM* reduce_string_count(char* identifier); - -TERM* reduce_filesize(); -TERM* reduce_entrypoint(); -TERM* reduce_term(int type, TERM* op1, TERM* op2); -TERM* reduce_constant(unsigned int constant); -TERM* reduce_rule(char* identifier); -TERM* reduce_boolean_expression_list(TERM* boolean_expression_list_head, TERM* boolean_expression); - %} %token _RULE_ @@ -43,13 +19,14 @@ TERM* reduce_boolean_expression_list(TERM* boolean_expression_list_head, TERM* b %token _STRINGS_ %token _CONDITION_ %token _END_ -%token _IDENTIFIER_ +%token _IDENTIFIER_ %token _STRING_IDENTIFIER_ %token _STRING_COUNT_ %token _NUMBER_ %token _UNKNOWN_ -%token _TEXTSTRING_ -%token _HEXSTRING_ +%token _TEXTSTRING_ +%token _HEXSTRING_ +%token _REGEXP_ %token _WIDE_ %token _NOCASE_ %token _REGEXP_ @@ -62,6 +39,7 @@ TERM* reduce_boolean_expression_list(TERM* boolean_expression_list_head, TERM* b %token _FILE_ %token _IN_ %token _OF_ +%token _THEM_ %token _SECTION_ %token _MZ_ @@ -94,14 +72,49 @@ TERM* reduce_boolean_expression_list(TERM* boolean_expression_list_head, TERM* b %type boolean_expression_list %type boolean_expressions -%union { - unsigned int integer; - char* pchar; - void* string; - void* term; - void* tag; -}; +%union { + + void* sized_string; + char* c_string; + unsigned int integer; + void* string; + void* term; + void* tag; +} + +%destructor { free ($$); } _TEXTSTRING_ _HEXSTRING_ _REGEXP_ _IDENTIFIER_ + + +%{ + +/* Global variables */ + +STRING* current_rule_strings; + +/* Function declarations */ + +void reduce_rule_declaration(char* identifier, int flags, TAG* tag_list_head, STRING* string_list_head, TERM* condition); +TAG* reduce_tags(TAG* tag_list_head, char* identifier); + +STRING* reduce_string_declaration(char* identifier, SIZED_STRING* str, int flags); +STRING* reduce_strings(STRING* string_list_head, STRING* string); + +TERM* reduce_string(char* identifier); +TERM* reduce_string_at(char* identifier, TERM* offset); +TERM* reduce_string_in_range(char* identifier, TERM* lower_offset, TERM* upper_offset); +TERM* reduce_string_in_section_by_name(char* identifier, SIZED_STRING* section_name); +TERM* reduce_string_count(char* identifier); + +TERM* reduce_filesize(); +TERM* reduce_entrypoint(); +TERM* reduce_term(int type, TERM* op1, TERM* op2); +TERM* reduce_constant(unsigned int constant); +TERM* reduce_rule(char* identifier); +TERM* reduce_boolean_expression_list(TERM* boolean_expression_list_head, TERM* boolean_expression); +TERM* reduce_n_of_them(TERM* n); + +%} %% @@ -186,6 +199,17 @@ string_declaration : _STRING_IDENTIFIER_ '=' _TEXTSTRING_ string_modifiers YYERROR; } } + | _STRING_IDENTIFIER_ '=' _REGEXP_ string_modifiers + { + $$ = reduce_string_declaration($1, $3, $4 | STRING_FLAGS_REGEXP); + + if ($$ == NULL) + { + show_last_error(); + yynerrs++; + YYERROR; + } + } | _STRING_IDENTIFIER_ '=' _HEXSTRING_ { $$ = reduce_string_declaration($1, $3, STRING_FLAGS_HEXADECIMAL); @@ -205,7 +229,6 @@ string_modifiers : /* empty */ { $$ = 0; } string_modifier : _WIDE_ { $$ = STRING_FLAGS_WIDE; } | _NOCASE_ { $$ = STRING_FLAGS_NO_CASE; } - | _REGEXP_ { $$ = STRING_FLAGS_REGEXP; } | _FULLWORD_ { $$ = STRING_FLAGS_FULL_WORD; } ; @@ -283,10 +306,9 @@ boolean_expression : _TRUE_ { $$ = reduce_consta | expression _IS_ expression { $$ = reduce_term(TERM_TYPE_EQ, $1, $3); } | expression _NEQ_ expression { $$ = reduce_term(TERM_TYPE_NOT_EQ, $1, $3); } | number _OF_ boolean_expression_list { $$ = reduce_term(TERM_TYPE_OF, $1, $3); } + | number _OF_ _THEM_ { $$ = reduce_n_of_them($1); } ; -//TODO: controla que el numero en el operador OF sea menor o igual que la cantidad de elementos en la lista - boolean_expression_list : '(' boolean_expressions ')' { $$ = $2; } ; @@ -360,11 +382,11 @@ void reduce_rule_declaration(char* identifier, int flags, TAG* tag_list_head, ST } } -STRING* reduce_string_declaration(char* identifier, char* str, int flags) +STRING* reduce_string_declaration(char* identifier, SIZED_STRING* str, int flags) { char tmp[200]; STRING* string = NULL; - + last_error = new_string(identifier, str, flags, &string); if (last_error == ERROR_INVALID_REGULAR_EXPRESSION) @@ -514,7 +536,7 @@ TERM* reduce_string_in_range(char* identifier, TERM* lower_offset, TERM* upper_o return (TERM*) term; } -TERM* reduce_string_in_section_by_name(char* identifier, char* section_name) +TERM* reduce_string_in_section_by_name(char* identifier, SIZED_STRING* section_name) { TERM_STRING* term = NULL; @@ -526,9 +548,10 @@ TERM* reduce_string_in_section_by_name(char* identifier, char* section_name) } else { - term->section_name = section_name; + term->section_name = strdup(section_name->c_string); } + free(section_name); free(identifier); return (TERM*) term; } @@ -576,6 +599,26 @@ TERM* reduce_boolean_expression_list(TERM* boolean_expression_list_head, TERM* b return boolean_expression; } +TERM* reduce_n_of_them(TERM* n) +{ + STRING* string; + TERM_BINARY_OPERATION* term; + + last_error = new_binary_operation(TERM_TYPE_OF_THEM, n, NULL, &term); + + /* the keyword THEM implicitly references all the strings + on the rule, so let's flag them as referenced */ + + string = current_rule_strings; + + while (string != NULL) + { + string->flags |= STRING_FLAGS_REFERENCED; + string = string->next; + } + + return (TERM*) term; +} diff --git a/libyara/lex.c b/libyara/lex.c index 6d1b01fd..56c590a1 100644 --- a/libyara/lex.c +++ b/libyara/lex.c @@ -285,28 +285,28 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 51 -#define YY_END_OF_BUFFER 52 -static yyconst short int yy_accept[164] = +#define YY_NUM_RULES 56 +#define YY_END_OF_BUFFER 57 +static yyconst short int yy_accept[170] = { 0, - 0, 0, 0, 0, 52, 50, 48, 49, 50, 38, - 34, 33, 50, 36, 36, 1, 50, 2, 35, 35, + 0, 0, 0, 0, 0, 0, 57, 55, 53, 54, + 55, 38, 34, 33, 47, 36, 36, 1, 55, 2, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 50, 44, 45, 39, 51, 6, 34, 33, - 0, 0, 36, 0, 0, 0, 3, 5, 4, 35, - 35, 21, 35, 35, 35, 35, 35, 35, 22, 29, - 35, 23, 20, 35, 35, 35, 35, 35, 35, 35, - 35, 0, 44, 46, 41, 42, 40, 46, 0, 0, - 0, 32, 36, 37, 19, 35, 35, 35, 35, 35, - 35, 35, 18, 35, 35, 35, 35, 26, 35, 35, + 35, 35, 35, 35, 55, 44, 45, 39, 56, 50, + 51, 48, 50, 6, 34, 33, 0, 0, 36, 0, + 0, 0, 3, 5, 4, 35, 35, 20, 35, 35, + 35, 35, 35, 35, 21, 29, 35, 22, 19, 35, + 35, 35, 35, 35, 35, 35, 35, 0, 44, 46, + 41, 42, 40, 46, 50, 49, 0, 0, 0, 32, + 36, 37, 18, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 47, 0, 31, 35, 35, 35, 28, 35, - 35, 35, 35, 35, 35, 9, 35, 35, 16, 35, - 43, 35, 35, 17, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 8, 13, - 27, 35, 14, 35, 35, 35, 35, 35, 35, 35, - 7, 30, 10, 35, 35, 35, 25, 12, 11, 15, - 35, 24, 0 + 17, 35, 35, 35, 26, 35, 35, 35, 35, 35, + 52, 0, 31, 35, 35, 35, 28, 35, 35, 35, + 35, 35, 9, 35, 35, 23, 15, 35, 43, 35, + 35, 16, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 8, 13, 27, 35, 35, + 35, 35, 35, 35, 35, 35, 7, 30, 10, 35, + 35, 35, 25, 12, 11, 14, 35, 24, 0 } ; static yyconst int yy_ec[256] = @@ -322,9 +322,9 @@ static yyconst int yy_ec[256] = 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 10, 22, 10, 1, 23, 1, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 19, 19, 33, 19, 34, - 35, 36, 19, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 1, 47, 1, 1, 1, 1, 1, + 28, 29, 30, 31, 32, 19, 19, 33, 34, 35, + 36, 37, 19, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 1, 48, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -341,125 +341,135 @@ static yyconst int yy_ec[256] = 1, 1, 1, 1, 1 } ; -static yyconst int yy_meta[48] = +static yyconst int yy_meta[49] = { 0, - 1, 1, 2, 3, 1, 2, 1, 1, 1, 3, - 1, 4, 4, 1, 1, 1, 4, 4, 5, 5, - 5, 2, 6, 4, 4, 4, 4, 4, 4, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 1, 1 + 1, 1, 2, 3, 1, 4, 1, 1, 1, 3, + 5, 6, 6, 1, 1, 1, 6, 6, 7, 7, + 7, 4, 8, 6, 6, 6, 6, 6, 6, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 1, 1 } ; -static yyconst short int yy_base[176] = +static yyconst short int yy_base[184] = { 0, - 0, 0, 45, 46, 221, 222, 222, 222, 205, 222, - 0, 0, 44, 44, 49, 204, 203, 202, 0, 20, - 181, 181, 26, 181, 37, 178, 43, 175, 45, 35, - 174, 178, 0, 0, 222, 222, 54, 222, 0, 0, - 200, 205, 69, 189, 188, 0, 222, 222, 222, 0, - 178, 0, 170, 164, 169, 168, 167, 164, 0, 0, - 52, 169, 0, 165, 166, 162, 170, 167, 155, 151, - 163, 142, 0, 222, 222, 222, 222, 0, 179, 176, - 183, 222, 222, 0, 0, 158, 147, 145, 154, 148, - 155, 155, 0, 140, 136, 148, 147, 0, 135, 141, + 0, 0, 46, 47, 48, 51, 250, 251, 251, 251, + 234, 251, 0, 0, 46, 51, 54, 233, 232, 231, + 0, 21, 209, 209, 52, 210, 42, 206, 49, 203, + 38, 54, 27, 208, 0, 0, 251, 251, 77, 0, + 251, 251, 228, 251, 0, 0, 229, 234, 76, 218, + 217, 0, 251, 251, 251, 0, 207, 0, 198, 192, + 198, 197, 196, 192, 0, 0, 60, 198, 0, 194, + 192, 200, 197, 184, 193, 179, 192, 170, 0, 251, + 251, 251, 251, 0, 0, 251, 208, 205, 212, 251, + 251, 0, 0, 187, 175, 173, 183, 177, 184, 184, - 144, 143, 222, 0, 222, 138, 125, 140, 129, 124, - 141, 126, 135, 138, 118, 0, 128, 125, 0, 132, - 222, 118, 120, 0, 123, 119, 120, 124, 112, 111, - 113, 113, 117, 115, 113, 109, 98, 105, 0, 0, - 0, 113, 0, 106, 101, 114, 102, 82, 68, 68, - 0, 0, 0, 57, 58, 54, 0, 0, 0, 0, - 45, 0, 222, 97, 100, 102, 104, 108, 112, 118, - 124, 130, 79, 75, 73 + 0, 168, 164, 177, 0, 164, 171, 168, 173, 172, + 251, 0, 251, 167, 153, 169, 157, 152, 170, 154, + 164, 167, 0, 158, 154, 0, 0, 143, 251, 126, + 115, 0, 118, 111, 113, 92, 79, 78, 80, 85, + 83, 81, 76, 65, 72, 0, 0, 0, 81, 73, + 68, 82, 69, 72, 75, 75, 0, 0, 0, 63, + 63, 57, 0, 0, 0, 0, 51, 0, 251, 121, + 129, 132, 134, 136, 142, 148, 156, 164, 172, 180, + 84, 79, 54 } ; -static yyconst short int yy_def[176] = +static yyconst short int yy_def[184] = { 0, - 163, 1, 164, 164, 163, 163, 163, 163, 163, 163, - 165, 166, 163, 163, 163, 163, 163, 163, 167, 167, - 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, - 167, 167, 168, 169, 163, 163, 170, 163, 165, 166, - 171, 172, 163, 163, 163, 173, 163, 163, 163, 167, - 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, - 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, - 167, 168, 169, 163, 163, 163, 163, 174, 171, 171, - 172, 163, 163, 173, 167, 167, 167, 167, 167, 167, - 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, + 169, 1, 170, 170, 171, 171, 169, 169, 169, 169, + 169, 169, 172, 173, 169, 169, 169, 169, 169, 169, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 175, 176, 169, 169, 177, 178, + 169, 169, 178, 169, 172, 173, 179, 180, 169, 169, + 169, 181, 169, 169, 169, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 175, 176, 169, + 169, 169, 169, 182, 178, 169, 179, 179, 180, 169, + 169, 181, 174, 174, 174, 174, 174, 174, 174, 174, - 167, 167, 163, 175, 163, 167, 167, 167, 167, 167, - 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, - 163, 167, 167, 167, 167, 167, 167, 167, 167, 167, - 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, - 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, - 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, - 167, 167, 0, 163, 163, 163, 163, 163, 163, 163, - 163, 163, 163, 163, 163 + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 169, 183, 169, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 169, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 0, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169 } ; -static yyconst short int yy_nxt[270] = +static yyconst short int yy_nxt[300] = { 0, - 6, 7, 8, 7, 9, 10, 11, 12, 6, 6, - 13, 14, 15, 16, 17, 18, 19, 19, 19, 19, - 19, 6, 19, 20, 19, 21, 19, 22, 23, 24, - 19, 25, 19, 26, 27, 28, 29, 30, 31, 19, - 19, 32, 19, 19, 19, 33, 6, 35, 35, 55, - 36, 36, 41, 51, 42, 43, 43, 56, 52, 75, - 43, 43, 68, 44, 45, 57, 37, 37, 44, 45, - 59, 62, 65, 69, 60, 76, 121, 92, 104, 63, - 43, 43, 84, 162, 66, 67, 46, 161, 44, 45, - 93, 160, 77, 159, 158, 157, 78, 34, 34, 34, + 8, 9, 10, 9, 11, 12, 13, 14, 8, 8, + 15, 16, 17, 18, 19, 20, 21, 21, 21, 21, + 21, 8, 21, 22, 21, 23, 21, 24, 25, 26, + 21, 27, 21, 21, 28, 29, 30, 31, 32, 33, + 21, 21, 34, 21, 21, 21, 35, 8, 37, 37, + 41, 38, 38, 41, 47, 57, 48, 75, 42, 129, + 58, 42, 49, 49, 76, 49, 49, 39, 39, 43, + 50, 51, 43, 50, 51, 61, 65, 68, 71, 72, + 66, 73, 81, 62, 112, 100, 69, 49, 49, 92, + 168, 167, 63, 74, 52, 50, 51, 166, 82, 101, - 34, 34, 34, 39, 39, 40, 40, 50, 50, 50, - 72, 72, 73, 156, 73, 73, 73, 73, 74, 74, - 74, 74, 74, 74, 79, 79, 79, 79, 79, 79, - 81, 81, 81, 81, 81, 81, 155, 154, 153, 152, - 151, 150, 149, 148, 147, 146, 145, 144, 143, 142, - 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, - 131, 130, 129, 128, 127, 126, 125, 124, 123, 122, - 120, 119, 118, 117, 116, 115, 114, 113, 112, 111, - 110, 109, 108, 107, 106, 82, 105, 80, 103, 102, - 101, 100, 99, 98, 97, 96, 95, 94, 91, 90, + 165, 164, 163, 162, 161, 160, 159, 158, 157, 156, + 155, 154, 153, 152, 151, 150, 83, 149, 148, 147, + 84, 36, 36, 36, 36, 36, 36, 36, 36, 40, + 40, 40, 40, 40, 40, 40, 40, 45, 45, 46, + 46, 56, 56, 56, 78, 146, 145, 78, 79, 144, + 79, 143, 79, 79, 79, 79, 80, 80, 80, 80, + 80, 80, 80, 80, 85, 142, 85, 85, 141, 85, + 85, 85, 87, 87, 87, 87, 87, 87, 87, 87, + 89, 89, 89, 89, 89, 89, 89, 89, 140, 139, + 138, 137, 136, 135, 134, 133, 132, 131, 130, 128, + + 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, + 117, 116, 115, 114, 90, 113, 88, 111, 110, 109, + 108, 107, 106, 105, 104, 103, 102, 99, 98, 97, + 96, 95, 94, 93, 91, 91, 90, 88, 86, 77, + 70, 67, 64, 60, 59, 55, 54, 53, 44, 169, + 7, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169 - 89, 88, 87, 86, 85, 83, 83, 82, 80, 71, - 70, 64, 61, 58, 54, 53, 49, 48, 47, 38, - 163, 5, 163, 163, 163, 163, 163, 163, 163, 163, - 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, - 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, - 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, - 163, 163, 163, 163, 163, 163, 163, 163, 163 } ; -static yyconst short int yy_chk[270] = +static yyconst short int yy_chk[300] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 3, 4, 23, - 3, 4, 13, 20, 13, 14, 14, 23, 20, 37, - 15, 15, 30, 14, 14, 23, 3, 4, 15, 15, - 25, 27, 29, 30, 25, 37, 175, 61, 174, 27, - 43, 43, 173, 161, 29, 29, 14, 156, 43, 43, - 61, 155, 37, 154, 150, 149, 37, 164, 164, 164, + 1, 1, 1, 1, 1, 1, 1, 1, 3, 4, + 5, 3, 4, 6, 15, 22, 15, 33, 5, 183, + 22, 6, 16, 16, 33, 17, 17, 3, 4, 5, + 16, 16, 6, 17, 17, 25, 27, 29, 31, 31, + 27, 32, 39, 25, 182, 67, 29, 49, 49, 181, + 167, 162, 25, 32, 16, 49, 49, 161, 39, 67, - 164, 164, 164, 165, 165, 166, 166, 167, 167, 167, - 168, 168, 169, 148, 169, 169, 169, 169, 170, 170, - 170, 170, 170, 170, 171, 171, 171, 171, 171, 171, - 172, 172, 172, 172, 172, 172, 147, 146, 145, 144, - 142, 138, 137, 136, 135, 134, 133, 132, 131, 130, - 129, 128, 127, 126, 125, 123, 122, 120, 118, 117, - 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, - 102, 101, 100, 99, 97, 96, 95, 94, 92, 91, - 90, 89, 88, 87, 86, 81, 80, 79, 72, 71, - 70, 69, 68, 67, 66, 65, 64, 62, 58, 57, + 160, 156, 155, 154, 153, 152, 151, 150, 149, 145, + 144, 143, 142, 141, 140, 139, 39, 138, 137, 136, + 39, 170, 170, 170, 170, 170, 170, 170, 170, 171, + 171, 171, 171, 171, 171, 171, 171, 172, 172, 173, + 173, 174, 174, 174, 175, 135, 134, 175, 176, 133, + 176, 131, 176, 176, 176, 176, 177, 177, 177, 177, + 177, 177, 177, 177, 178, 130, 178, 178, 128, 178, + 178, 178, 179, 179, 179, 179, 179, 179, 179, 179, + 180, 180, 180, 180, 180, 180, 180, 180, 125, 124, + 122, 121, 120, 119, 118, 117, 116, 115, 114, 110, + + 109, 108, 107, 106, 104, 103, 102, 100, 99, 98, + 97, 96, 95, 94, 89, 88, 87, 78, 77, 76, + 75, 74, 73, 72, 71, 70, 68, 64, 63, 62, + 61, 60, 59, 57, 51, 50, 48, 47, 43, 34, + 30, 28, 26, 24, 23, 20, 19, 18, 11, 7, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169 - 56, 55, 54, 53, 51, 45, 44, 42, 41, 32, - 31, 28, 26, 24, 22, 21, 18, 17, 16, 9, - 5, 163, 163, 163, 163, 163, 163, 163, 163, 163, - 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, - 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, - 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, - 163, 163, 163, 163, 163, 163, 163, 163, 163 } ; static yy_state_type yy_last_accepting_state; @@ -486,8 +496,10 @@ char *yytext; #include "error.h" #include "xtoi.h" -char string_buf[255]; + +char string_buf[256]; char *string_buf_ptr; +unsigned short string_buf_len; #ifdef WIN32 #define strdup _strdup @@ -495,7 +507,9 @@ char *string_buf_ptr; #define str 1 -#line 499 "lex.c" +#define regexp 2 + +#line 513 "lex.c" /* Macros after this point can all be overridden by user definitions in * section 1. @@ -646,10 +660,10 @@ YY_DECL register char *yy_cp, *yy_bp; register int yy_act; -#line 30 "lex.l" +#line 33 "lex.l" -#line 653 "lex.c" +#line 667 "lex.c" if ( yy_init ) { @@ -700,13 +714,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 164 ) + if ( yy_current_state >= 170 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 222 ); + while ( yy_base[yy_current_state] != 251 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -734,157 +748,157 @@ do_action: /* This label is used only to access EOF actions. */ case 1: YY_RULE_SETUP -#line 32 "lex.l" +#line 35 "lex.l" { return _LT_; } YY_BREAK case 2: YY_RULE_SETUP -#line 33 "lex.l" +#line 36 "lex.l" { return _GT_; } YY_BREAK case 3: YY_RULE_SETUP -#line 34 "lex.l" +#line 37 "lex.l" { return _LE_; } YY_BREAK case 4: YY_RULE_SETUP -#line 35 "lex.l" +#line 38 "lex.l" { return _GE_; } YY_BREAK case 5: YY_RULE_SETUP -#line 36 "lex.l" +#line 39 "lex.l" { return _EQ_; } YY_BREAK case 6: YY_RULE_SETUP -#line 37 "lex.l" +#line 40 "lex.l" { return _NEQ_; } YY_BREAK case 7: YY_RULE_SETUP -#line 38 "lex.l" +#line 41 "lex.l" { return _PRIVATE_; } YY_BREAK case 8: YY_RULE_SETUP -#line 39 "lex.l" +#line 42 "lex.l" { return _GLOBAL_; } YY_BREAK case 9: YY_RULE_SETUP -#line 40 "lex.l" +#line 43 "lex.l" { return _RULE_; } YY_BREAK case 10: YY_RULE_SETUP -#line 41 "lex.l" +#line 44 "lex.l" { return _STRINGS_; } YY_BREAK case 11: YY_RULE_SETUP -#line 42 "lex.l" +#line 45 "lex.l" { return _WIDE_; } YY_BREAK case 12: YY_RULE_SETUP -#line 43 "lex.l" +#line 46 "lex.l" { return _FULLWORD_; } YY_BREAK case 13: YY_RULE_SETUP -#line 44 "lex.l" +#line 47 "lex.l" { return _NOCASE_; } YY_BREAK case 14: YY_RULE_SETUP -#line 45 "lex.l" -{ return _REGEXP_; } +#line 48 "lex.l" +{ return _CONDITION_; } YY_BREAK case 15: YY_RULE_SETUP -#line 46 "lex.l" -{ return _CONDITION_; } +#line 49 "lex.l" +{ return _TRUE_; } YY_BREAK case 16: YY_RULE_SETUP -#line 47 "lex.l" -{ return _TRUE_; } +#line 50 "lex.l" +{ return _FALSE_; } YY_BREAK case 17: YY_RULE_SETUP -#line 48 "lex.l" -{ return _FALSE_; } +#line 51 "lex.l" +{ return _NOT_; } YY_BREAK case 18: YY_RULE_SETUP -#line 49 "lex.l" -{ return _NOT_; } +#line 52 "lex.l" +{ return _AND_; } YY_BREAK case 19: YY_RULE_SETUP -#line 50 "lex.l" -{ return _AND_; } +#line 53 "lex.l" +{ return _OR_; } YY_BREAK case 20: YY_RULE_SETUP -#line 51 "lex.l" -{ return _OR_; } +#line 54 "lex.l" +{ return _AT_; } YY_BREAK case 21: YY_RULE_SETUP -#line 52 "lex.l" -{ return _AT_; } +#line 55 "lex.l" +{ return _IN_; } YY_BREAK case 22: YY_RULE_SETUP -#line 53 "lex.l" -{ return _IN_; } +#line 56 "lex.l" +{ return _OF_; } YY_BREAK case 23: YY_RULE_SETUP -#line 54 "lex.l" -{ return _OF_; } +#line 57 "lex.l" +{ return _THEM_; } YY_BREAK case 24: YY_RULE_SETUP -#line 55 "lex.l" +#line 58 "lex.l" { return _ENTRYPOINT_; } YY_BREAK case 25: YY_RULE_SETUP -#line 56 "lex.l" +#line 59 "lex.l" { return _SIZE_; } YY_BREAK case 26: YY_RULE_SETUP -#line 57 "lex.l" +#line 60 "lex.l" { return _RVA_; } YY_BREAK case 27: YY_RULE_SETUP -#line 58 "lex.l" +#line 61 "lex.l" { return _OFFSET_; } YY_BREAK case 28: YY_RULE_SETUP -#line 59 "lex.l" +#line 62 "lex.l" { return _FILE_; } YY_BREAK case 29: YY_RULE_SETUP -#line 60 "lex.l" +#line 63 "lex.l" { return _IS_; } YY_BREAK case 30: YY_RULE_SETUP -#line 61 "lex.l" +#line 64 "lex.l" { return _SECTION_; } YY_BREAK case 31: YY_RULE_SETUP -#line 64 "lex.l" +#line 67 "lex.l" { /* skip comments */ char* line_break = strchr( yytext, '\n' ); @@ -898,7 +912,7 @@ YY_RULE_SETUP YY_BREAK case 32: YY_RULE_SETUP -#line 75 "lex.l" +#line 78 "lex.l" { /* skip single-line comments */ line_number++; @@ -906,24 +920,24 @@ YY_RULE_SETUP YY_BREAK case 33: YY_RULE_SETUP -#line 80 "lex.l" +#line 83 "lex.l" { - yylval.pchar = (char*) strdup(yytext); + yylval.c_string = (char*) strdup(yytext); return _STRING_IDENTIFIER_; } YY_BREAK case 34: YY_RULE_SETUP -#line 85 "lex.l" +#line 88 "lex.l" { - yylval.pchar = (char*) strdup(yytext); - yylval.pchar[0] = '$'; /* replace # by $*/ + yylval.c_string = (char*) strdup(yytext); + yylval.c_string[0] = '$'; /* replace # by $*/ return _STRING_COUNT_; } YY_BREAK case 35: YY_RULE_SETUP -#line 91 "lex.l" +#line 94 "lex.l" { if (strlen(yytext) > 128) { @@ -931,13 +945,13 @@ YY_RULE_SETUP yynerrs++; } - yylval.pchar = (char*) strdup(yytext); + yylval.c_string = (char*) strdup(yytext); return _IDENTIFIER_; } YY_BREAK case 36: YY_RULE_SETUP -#line 102 "lex.l" +#line 105 "lex.l" { yylval.integer = (unsigned int) atoi(yytext); @@ -955,7 +969,7 @@ YY_RULE_SETUP YY_BREAK case 37: YY_RULE_SETUP -#line 117 "lex.l" +#line 120 "lex.l" { yylval.integer = xtoi(yytext + 2); return _NUMBER_; @@ -963,74 +977,82 @@ YY_RULE_SETUP YY_BREAK case 38: YY_RULE_SETUP -#line 123 "lex.l" +#line 126 "lex.l" { string_buf_ptr = string_buf; + string_buf_len = 0; BEGIN(str); } YY_BREAK case 39: YY_RULE_SETUP -#line 128 "lex.l" +#line 132 "lex.l" { /* saw closing quote - all done */ - int len; + if (string_buf_len == 0) + { + yyerror("empty string"); + yynerrs++; + } + + *string_buf_ptr = '\0'; BEGIN(INITIAL); - *string_buf_ptr = '\0'; - len = strlen(string_buf); + SIZED_STRING* s = (SIZED_STRING*) malloc(string_buf_len + sizeof(SIZED_STRING)); - yylval.pchar = strdup(string_buf); + s->length = string_buf_len; + memcpy(s->c_string, string_buf, string_buf_len); + + yylval.sized_string = s; + return _TEXTSTRING_; } YY_BREAK case 40: YY_RULE_SETUP -#line 142 "lex.l" -*string_buf_ptr++ = '\t'; +#line 155 "lex.l" +{ *string_buf_ptr++ = '\t'; string_buf_len++; } YY_BREAK case 41: YY_RULE_SETUP -#line 143 "lex.l" -*string_buf_ptr++ = '\"'; +#line 156 "lex.l" +{ *string_buf_ptr++ = '\"'; string_buf_len++; } YY_BREAK case 42: YY_RULE_SETUP -#line 144 "lex.l" -*string_buf_ptr++ = '\\'; +#line 157 "lex.l" +{ *string_buf_ptr++ = '\\'; string_buf_len++; } YY_BREAK case 43: YY_RULE_SETUP -#line 146 "lex.l" +#line 159 "lex.l" { int result; sscanf( yytext + 2, "%x", &result ); - - if (result == 0) - { - yyerror("illegal escape sequence"); - yynerrs++; - } *string_buf_ptr++ = result; + string_buf_len++; } YY_BREAK case 44: YY_RULE_SETUP -#line 160 "lex.l" +#line 168 "lex.l" { char *yptr = yytext; while ( *yptr ) + { *string_buf_ptr++ = *yptr++; + string_buf_len++; + } } YY_BREAK case 45: YY_RULE_SETUP -#line 167 "lex.l" +#line 178 "lex.l" { yyerror("unterminated string"); yyterminate(); @@ -1039,7 +1061,7 @@ YY_RULE_SETUP YY_BREAK case 46: YY_RULE_SETUP -#line 173 "lex.l" +#line 184 "lex.l" { yyerror("illegal escape sequence"); yynerrs++; @@ -1047,40 +1069,113 @@ YY_RULE_SETUP YY_BREAK case 47: YY_RULE_SETUP -#line 180 "lex.l" -{ - yylval.pchar = (char*) strdup(yytext); - return _HEXSTRING_; - } +#line 189 "lex.l" +{ + string_buf_ptr = string_buf; + string_buf_len = 0; + BEGIN(regexp); + + } YY_BREAK case 48: YY_RULE_SETUP -#line 186 "lex.l" -/* skip whitespace */ +#line 196 "lex.l" +{ + if (string_buf_len == 0) + { + yyerror("empty regular expression"); + yynerrs++; + } + + + *string_buf_ptr = '\0'; + + BEGIN(INITIAL); + + SIZED_STRING* s = (SIZED_STRING*) malloc(string_buf_len + sizeof(SIZED_STRING)); + + s->length = string_buf_len; + + memcpy(s->c_string, string_buf, string_buf_len); + + yylval.sized_string = s; + + return _REGEXP_; + } YY_BREAK case 49: YY_RULE_SETUP -#line 188 "lex.l" +#line 220 "lex.l" +{ *string_buf_ptr++ = '/'; string_buf_len++; } + YY_BREAK +case 50: +YY_RULE_SETUP +#line 222 "lex.l" +{ + char *yptr = yytext; + + while ( *yptr ) + { + *string_buf_ptr++ = *yptr++; + string_buf_len++; + } + } + YY_BREAK +case 51: +YY_RULE_SETUP +#line 232 "lex.l" +{ + yyerror("unterminated regular expression"); + yyterminate(); + yynerrs++; + } + YY_BREAK +case 52: +YY_RULE_SETUP +#line 240 "lex.l" +{ + int len = strlen(yytext); + + SIZED_STRING* s = (SIZED_STRING*) malloc(len + sizeof(SIZED_STRING)); + + s->length = len; + + strcpy(s->c_string, yytext); + + yylval.sized_string = s; + + return _HEXSTRING_; + } + YY_BREAK +case 53: +YY_RULE_SETUP +#line 255 "lex.l" +/* skip whitespace */ + YY_BREAK +case 54: +YY_RULE_SETUP +#line 257 "lex.l" { line_number++; } YY_BREAK -case 50: +case 55: YY_RULE_SETUP -#line 193 "lex.l" +#line 262 "lex.l" { return yytext[0]; } YY_BREAK -case 51: +case 56: YY_RULE_SETUP -#line 196 "lex.l" +#line 265 "lex.l" ECHO; YY_BREAK -#line 1082 "lex.c" +#line 1176 "lex.c" case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(str): +case YY_STATE_EOF(regexp): yyterminate(); case YY_END_OF_BUFFER: @@ -1371,7 +1466,7 @@ static yy_state_type yy_get_previous_state() while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 164 ) + if ( yy_current_state >= 170 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -1406,11 +1501,11 @@ yy_state_type yy_current_state; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 164 ) + if ( yy_current_state >= 170 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 163); + yy_is_jam = (yy_current_state == 169); return yy_is_jam ? 0 : yy_current_state; } @@ -1965,7 +2060,7 @@ int main() return 0; } #endif -#line 196 "lex.l" +#line 265 "lex.l" diff --git a/libyara/lex.l b/libyara/lex.l index b94bd646..b36f5dce 100644 --- a/libyara/lex.l +++ b/libyara/lex.l @@ -10,8 +10,10 @@ #include "error.h" #include "xtoi.h" -char string_buf[255]; + +char string_buf[256]; char *string_buf_ptr; +unsigned short string_buf_len; #ifdef WIN32 #define strdup _strdup @@ -22,6 +24,7 @@ char *string_buf_ptr; %option noyywrap %x str +%x regexp digit [0-9] letter [a-zA-Z] @@ -42,7 +45,6 @@ hexdigit [a-fA-F0-9] "widechar" { return _WIDE_; } "fullword" { return _FULLWORD_; } "nocase" { return _NOCASE_; } -"regexp" { return _REGEXP_; } "condition" { return _CONDITION_; } "true" { return _TRUE_; } "false" { return _FALSE_; } @@ -52,6 +54,7 @@ hexdigit [a-fA-F0-9] "at" { return _AT_; } "in" { return _IN_; } "of" { return _OF_; } +"them" { return _THEM_; } "entrypoint" { return _ENTRYPOINT_; } "filesize" { return _SIZE_; } "rva" { return _RVA_; } @@ -78,13 +81,13 @@ hexdigit [a-fA-F0-9] } $({letter}|{digit})* { - yylval.pchar = (char*) strdup(yytext); + yylval.c_string = (char*) strdup(yytext); return _STRING_IDENTIFIER_; } #({letter}|{digit})* { - yylval.pchar = (char*) strdup(yytext); - yylval.pchar[0] = '$'; /* replace # by $*/ + yylval.c_string = (char*) strdup(yytext); + yylval.c_string[0] = '$'; /* replace # by $*/ return _STRING_COUNT_; } @@ -95,7 +98,7 @@ $({letter}|{digit})* { yynerrs++; } - yylval.pchar = (char*) strdup(yytext); + yylval.c_string = (char*) strdup(yytext); return _IDENTIFIER_; } @@ -122,46 +125,54 @@ $({letter}|{digit})* { \" { string_buf_ptr = string_buf; + string_buf_len = 0; BEGIN(str); } \" { /* saw closing quote - all done */ - int len; + if (string_buf_len == 0) + { + yyerror("empty string"); + yynerrs++; + } + + *string_buf_ptr = '\0'; BEGIN(INITIAL); - *string_buf_ptr = '\0'; - len = strlen(string_buf); + SIZED_STRING* s = (SIZED_STRING*) malloc(string_buf_len + sizeof(SIZED_STRING)); - yylval.pchar = strdup(string_buf); + s->length = string_buf_len; + memcpy(s->c_string, string_buf, string_buf_len); + + yylval.sized_string = s; + return _TEXTSTRING_; } -\\t *string_buf_ptr++ = '\t'; -\\\" *string_buf_ptr++ = '\"'; -\\\\ *string_buf_ptr++ = '\\'; +\\t { *string_buf_ptr++ = '\t'; string_buf_len++; } +\\\" { *string_buf_ptr++ = '\"'; string_buf_len++; } +\\\\ { *string_buf_ptr++ = '\\'; string_buf_len++; } \\x{hexdigit}{2} { int result; sscanf( yytext + 2, "%x", &result ); - - if (result == 0) - { - yyerror("illegal escape sequence"); - yynerrs++; - } *string_buf_ptr++ = result; + string_buf_len++; } [^\\\n\"]+ { char *yptr = yytext; while ( *yptr ) + { *string_buf_ptr++ = *yptr++; + string_buf_len++; + } } \n { @@ -175,10 +186,68 @@ $({letter}|{digit})* { yynerrs++; } +"/" { + string_buf_ptr = string_buf; + string_buf_len = 0; + BEGIN(regexp); + + } + +"/" { + if (string_buf_len == 0) + { + yyerror("empty regular expression"); + yynerrs++; + } + + + *string_buf_ptr = '\0'; + + BEGIN(INITIAL); + + SIZED_STRING* s = (SIZED_STRING*) malloc(string_buf_len + sizeof(SIZED_STRING)); + + s->length = string_buf_len; + + memcpy(s->c_string, string_buf, string_buf_len); + + yylval.sized_string = s; + + return _REGEXP_; + } + + +"\\/" { *string_buf_ptr++ = '/'; string_buf_len++; } + +[^/\n]+ { + char *yptr = yytext; + + while ( *yptr ) + { + *string_buf_ptr++ = *yptr++; + string_buf_len++; + } + } + +\n { + yyerror("unterminated regular expression"); + yyterminate(); + yynerrs++; + } + \{({hexdigit}|[ \?\[\]-])+\} { - yylval.pchar = (char*) strdup(yytext); + int len = strlen(yytext); + + SIZED_STRING* s = (SIZED_STRING*) malloc(len + sizeof(SIZED_STRING)); + + s->length = len; + + strcpy(s->c_string, yytext); + + yylval.sized_string = s; + return _HEXSTRING_; } diff --git a/libyara/libtool b/libyara/libtool index c6e6c099..c5503244 100755 --- a/libyara/libtool +++ b/libyara/libtool @@ -1,7 +1,7 @@ #! /bin/sh # libtoolT - Provide generalized library-building support services. -# Generated automatically by (GNU libyara 1.0) +# Generated automatically by (GNU libyara 1.1) # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 @@ -66,13 +66,13 @@ fast_install=needless # The host system. host_alias= -host=i386-apple-darwin9.5.0 -host_os=darwin9.5.0 +host=i386-apple-darwin9.6.0 +host_os=darwin9.6.0 # The build system. build_alias= -build=i386-apple-darwin9.5.0 -build_os=darwin9.5.0 +build=i386-apple-darwin9.6.0 +build_os=darwin9.6.0 # An echo program that does not interpret backslashes. echo="/bin/echo" @@ -7234,13 +7234,13 @@ fast_install=needless # The host system. host_alias= -host=i386-apple-darwin9.5.0 -host_os=darwin9.5.0 +host=i386-apple-darwin9.6.0 +host_os=darwin9.6.0 # The build system. build_alias= -build=i386-apple-darwin9.5.0 -build_os=darwin9.5.0 +build=i386-apple-darwin9.6.0 +build_os=darwin9.6.0 # An echo program that does not interpret backslashes. echo="/bin/echo" diff --git a/libyara/libyara.tmproj b/libyara/libyara.tmproj index 1fa38f68..fbad2530 100644 --- a/libyara/libyara.tmproj +++ b/libyara/libyara.tmproj @@ -3,7 +3,7 @@ currentDocument - ast.c + scan.c documents @@ -13,59 +13,63 @@ filename scan.c lastUsed - 2008-09-25T16:53:02Z - - - filename - pefile.c - lastUsed - 2008-07-16T11:44:54Z - - - filename - grammar.c - - - filename - filemap.c - lastUsed - 2008-07-15T19:42:19Z - - - filename - eval.c - lastUsed - 2008-07-15T19:42:17Z - - - filename - error.c - lastUsed - 2008-07-15T19:39:58Z - - - filename - compile.c - lastUsed - 2008-09-25T16:53:09Z - - - filename - ast.c - lastUsed - 2008-09-25T16:53:09Z + 2008-12-18T15:06:36Z selected + + filename + pefile.c + lastUsed + 2008-12-18T13:41:19Z + + + filename + filemap.c + lastUsed + 2008-12-16T14:05:52Z + + + filename + eval.c + lastUsed + 2008-12-18T13:39:44Z + + + filename + error.c + lastUsed + 2008-12-18T12:33:29Z + + + filename + compile.c + lastUsed + 2008-12-17T12:58:51Z + + + filename + ast.c + lastUsed + 2008-12-18T12:58:08Z + filename lex.l + lastUsed + 2008-12-18T13:41:12Z filename grammar.y lastUsed - 2008-07-17T08:33:38Z + 2008-12-18T15:06:36Z + + + filename + ../yara.c + lastUsed + 2008-12-18T12:06:48Z expanded @@ -80,13 +84,13 @@ filename yara.h lastUsed - 2008-07-17T18:49:33Z + 2008-12-18T13:01:29Z filename pefile.h lastUsed - 2008-07-15T19:52:33Z + 2008-12-17T13:30:13Z filename @@ -98,37 +102,43 @@ filename grammar.h lastUsed - 2008-07-15T19:52:56Z + 2008-12-16T13:59:06Z filename filemap.h lastUsed - 2008-07-15T19:52:55Z + 2008-12-16T14:43:41Z filename eval.h lastUsed - 2008-07-15T20:51:18Z + 2008-12-18T12:45:27Z filename error.h lastUsed - 2008-07-16T11:09:47Z + 2008-12-17T19:14:52Z filename compile.h lastUsed - 2008-07-15T19:52:49Z + 2008-12-16T19:03:53Z filename ast.h lastUsed - 2008-07-15T19:52:47Z + 2008-12-18T13:01:14Z + + + filename + sizedstr.h + lastUsed + 2008-12-18T12:06:30Z expanded @@ -141,21 +151,93 @@ 200 metaData + ../yara.c + + caret + + column + 15 + line + 281 + + firstVisibleColumn + 0 + firstVisibleLine + 419 + ast.c caret column - 23 + 42 line - 476 + 552 + + columnSelection + + firstVisibleColumn + 0 + firstVisibleLine + 518 + selectFrom + + column + 19 + line + 552 + + selectTo + + column + 42 + line + 552 + + + ast.h + + caret + + column + 33 + line + 52 firstVisibleColumn 0 firstVisibleLine - 707 + 62 compile.c + + caret + + column + 4 + line + 38 + + firstVisibleColumn + 0 + firstVisibleLine + 1 + + error.c + + caret + + column + 9 + line + 94 + + firstVisibleColumn + 0 + firstVisibleLine + 53 + + error.h caret @@ -167,32 +249,200 @@ firstVisibleColumn 0 firstVisibleLine - 10 + 0 + + eval.c + + caret + + column + 0 + line + 92 + + firstVisibleColumn + 0 + firstVisibleLine + 66 + + eval.h + + caret + + column + 15 + line + 25 + + firstVisibleColumn + 0 + firstVisibleLine + 0 + + filemap.c + + caret + + column + 0 + line + 0 + + firstVisibleColumn + 0 + firstVisibleLine + 0 + + filemap.h + + caret + + column + 0 + line + 0 + + firstVisibleColumn + 0 + firstVisibleLine + 0 + + grammar.h + + caret + + column + 16 + line + 123 + + firstVisibleColumn + 0 + firstVisibleLine + 91 + + grammar.y + + caret + + column + 0 + line + 311 + + firstVisibleColumn + 0 + firstVisibleLine + 580 + + lex.l + + caret + + column + 32 + line + 254 + + firstVisibleColumn + 0 + firstVisibleLine + 210 + + pefile.c + + caret + + column + 0 + line + 0 + + firstVisibleColumn + 0 + firstVisibleLine + 0 scan.c caret column - 21 + 2 line - 570 + 0 firstVisibleColumn 0 firstVisibleLine - 562 + 674 + + sizedstr.h + + caret + + column + 31 + line + 22 + + firstVisibleColumn + 0 + firstVisibleLine + 0 + + yara.h + + caret + + column + 8 + line + 36 + + columnSelection + + firstVisibleColumn + 0 + firstVisibleLine + 20 + selectFrom + + column + 31 + line + 36 + + selectTo + + column + 8 + line + 36 + openDocuments - scan.c - compile.c + ast.h ast.c + error.c + error.h + scan.c + sizedstr.h + lex.l + ../yara.c + yara.h + pefile.c + eval.c + eval.h + grammar.y + compile.c + filemap.c showFileHierarchyDrawer windowFrame - {{243, 4}, {1037, 774}} + {{214, 79}, {1020, 911}} diff --git a/libyara/scan.c b/libyara/scan.c index a29b05a1..bf65c28d 100644 --- a/libyara/scan.c +++ b/libyara/scan.c @@ -43,8 +43,11 @@ int compare(char* str1, char* str2, int len) char* s2 = str2; int i = 0; - while (*s1++ == *s2++ && i < len) i++; - + while (*s1++ == *s2++ && i < len) + { + i++; + } + return ((i==len) ? i : 0); } @@ -169,25 +172,13 @@ int regexp_match(unsigned char* buffer, unsigned int buffer_size, unsigned char* char* s; result = 0; - len = 0; - - while (len < buffer_size) - { - if (buffer[len] < 32 || buffer[len] > 126) /* only printable characters */ - { - break; - } - - len++; - } /* - negative_size > 0 indicates that it is safe to access buffer[-1], - if a previous printable char exists and pattern begins with ^ the - string doesn't match. + negative_size > 0 indicates that we are not at the beginning of the file, + therefore if pattern begins with ^ the string doesn't match */ - if (negative_size > 0 && buffer[-1] >= 32 && buffer[-1] <= 126 && pattern[0] == '^') + if (negative_size > 0 && pattern[0] == '^') { return 0; } @@ -196,7 +187,7 @@ int regexp_match(unsigned char* buffer, unsigned int buffer_size, unsigned char* regexp, /* the compiled pattern */ NULL, /* no extra data - we didn't study the pattern */ (char*) buffer, /* the subject string */ - len, /* the length of the subject */ + buffer_size, /* the length of the subject */ 0, /* start at offset 0 in the subject */ 0, /* default options */ ovector, /* output vector for substring information */ @@ -230,63 +221,79 @@ int init_hash_table(RULE_LIST* rule_list) STRING_LIST_ENTRY* entry; unsigned char x,y; int next; + char hashable; rule = rule_list->head; while (rule != NULL) { string = rule->string_list_head; - + while (string != NULL) - { + { if (string->flags & STRING_FLAGS_REGEXP) { - /* take into account scaped characters and ^ at beginning of regular expressions */ + /* take into account anchors (^) at beginning of regular expressions */ - if (string->string[0] == '\\' || string->string[0] == '^') + if (string->string[0] == '^') { - x = string->string[1]; - next = 2; + if (string->length > 2) + { + x = string->string[1]; + y = string->string[2]; + } + else + { + x = 0; + y = 0; + } } else { x = string->string[0]; - next = 1; + y = string->string[1]; } - - if (string->string[next] == '\\') - { - y = string->string[next + 1]; - } - else - { - y = string->string[next]; - } + + hashable = isalnum(x) && isalnum(y); } else { - x = string->string[0]; + x = string->string[0]; y = string->string[1]; + + hashable = TRUE; } - if (string->flags & STRING_FLAGS_NO_CASE) + if (string->flags & STRING_FLAGS_HEXADECIMAL) + { + hashable = (string->mask[0] == 0xFF) && (string->mask[1] == 0xFF); + } + + if (hashable && string->flags & STRING_FLAGS_NO_CASE) { x = tolower(x); y = tolower(y); } - + entry = (STRING_LIST_ENTRY*) malloc(sizeof(STRING_LIST_ENTRY)); - - if (entry != NULL) - { - entry->string = string; - entry->next = rule_list->hash_table[x][y]; /* insert new entry at begining of list */ - rule_list->hash_table[x][y] = entry; + + if (entry == NULL) + { + return ERROR_INSUFICIENT_MEMORY; + } + + entry->string = string; + + if (hashable) + { + entry->next = rule_list->hash_table[x][y]; /* insert new entry at begining of list */ + rule_list->hash_table[x][y] = entry; } else { - return ERROR_INSUFICIENT_MEMORY; - } + entry->next = rule_list->non_hashed_strings; + rule_list->non_hashed_strings = entry; + } string = string->next; } @@ -319,6 +326,17 @@ void free_hash_table(RULE_LIST* rule_list) rule_list->hash_table[i][j] = NULL; } } + + entry = rule_list->non_hashed_strings; + + while (entry != NULL) + { + next_entry = entry->next; + free(entry); + entry = next_entry; + } + + rule_list->non_hashed_strings = NULL; } void clear_marks(RULE_LIST* rule_list) @@ -332,7 +350,8 @@ void clear_marks(RULE_LIST* rule_list) while (rule != NULL) { - string = rule->string_list_head; + rule->flags &= ~RULE_FLAGS_MATCH; + string = rule->string_list_head; while (string != NULL) { @@ -402,7 +421,7 @@ int string_match(unsigned char* buffer, unsigned int buffer_size, STRING* string match = regexp_match(tmp, len, string->string, string->length, string->regexp, (negative_size > 2) ? 1 : 0); free(tmp); - return match; + return match * 2; } } @@ -457,7 +476,7 @@ int string_match(unsigned char* buffer, unsigned int buffer_size, STRING* string { match = compare((char*) string->string, (char*) buffer, string->length); } - + if (match > 0 && IS_FULL_WORD(string)) { if (negative_size >= 1 && isalnum((char) (buffer[-1]))) @@ -476,6 +495,78 @@ int string_match(unsigned char* buffer, unsigned int buffer_size, STRING* string return 0; } + +int find_matches_for_strings( STRING_LIST_ENTRY* first_string, + unsigned char* buffer, + unsigned int buffer_size, + unsigned int current_file_offset, + int wide, + int no_case, + int negative_size) +{ + int len; + int overlap; + + STRING* string; + MATCH* match; + STRING_LIST_ENTRY* entry = first_string; + + while (entry != NULL) + { + string = entry->string; + + if ((!wide || IS_WIDE(string)) && + (!no_case || IS_NO_CASE(string)) && + (len = string_match(buffer, buffer_size, string, negative_size))) + { + /* If this string already matched we must check that this match is not + overlapping a previous one. This can occur for example if we search + for the string 'aa' and the file contains 'aaaaaa'. + */ + + overlap = FALSE; + + if (string->flags && STRING_FLAGS_FOUND) + { + match = string->matches; + + while(match != NULL) + { + if (match->offset + match->length > current_file_offset) + { + overlap = TRUE; + break; + } + match = match->next; + } + } + + if (!overlap) + { + string->flags |= STRING_FLAGS_FOUND; + match = (MATCH*) malloc(sizeof(MATCH)); + + if (match != NULL) + { + match->offset = current_file_offset; + match->length = len; + match->next = string->matches; + string->matches = match; + } + else + { + return ERROR_INSUFICIENT_MEMORY; + } + } + } + + entry = entry->next; + } + + return ERROR_SUCCESS; +} + + int find_matches( unsigned char first_char, unsigned char second_char, unsigned char* buffer, @@ -488,77 +579,57 @@ int find_matches( unsigned char first_char, unsigned char first_char_lower; unsigned char second_char_lower; - int len; + int result; - STRING* string; - MATCH* match; - STRING_LIST_ENTRY* entry; - - entry = rule_list->hash_table[first_char][second_char]; + /* case sensitive */ - while (entry != NULL) - { - string = entry->string; - - if ((!wide || IS_WIDE(string)) && (len = string_match(buffer, buffer_size, string, negative_size))) - { - string->flags |= STRING_FLAGS_FOUND; - match = (MATCH*) malloc(sizeof(MATCH)); - - if (match != NULL) - { - match->offset = current_file_offset; - match->length = len; - match->next = string->matches; - string->matches = match; - } - else - { - return ERROR_INSUFICIENT_MEMORY; - } - } - - entry = entry->next; - } - + result = find_matches_for_strings( rule_list->hash_table[first_char][second_char], + buffer, + buffer_size, + current_file_offset, + wide, + FALSE, + negative_size); + + if (result == ERROR_SUCCESS) + { + result = find_matches_for_strings( rule_list->non_hashed_strings, + buffer, + buffer_size, + current_file_offset, + wide, + FALSE, + negative_size); + } + /* case insensitive */ first_char_lower = tolower(first_char); second_char_lower = tolower(second_char); - if (first_char_lower != first_char || second_char_lower != second_char) + if (result == ERROR_SUCCESS && (first_char_lower != first_char || second_char_lower != second_char)) { - entry = rule_list->hash_table[first_char_lower][second_char_lower]; - - while (entry != NULL) - { - string = entry->string; - - if ((!wide || IS_WIDE(string)) && - (string->flags & STRING_FLAGS_NO_CASE) && - (len = string_match(buffer, buffer_size, string, negative_size))) - { - string->flags |= STRING_FLAGS_FOUND; - match = (MATCH*) malloc(sizeof(MATCH)); - - if (match != NULL) - { - match->offset = current_file_offset; - match->length = len; - match->next = string->matches; - string->matches = match; - } - else - { - return ERROR_INSUFICIENT_MEMORY; - } - } - - entry = entry->next; - } + result = find_matches_for_strings( rule_list->hash_table[first_char_lower][second_char_lower], + buffer, + buffer_size, + current_file_offset, + wide, + TRUE, + negative_size); + + if (result == ERROR_SUCCESS) + { + result = find_matches_for_strings( rule_list->non_hashed_strings, + buffer, + buffer_size, + current_file_offset, + wide, + TRUE, + negative_size); + } } - return ERROR_SUCCESS; + return result; } int scan_mem(unsigned char* buffer, unsigned int buffer_size, RULE_LIST* rule_list, YARACALLBACK callback, void* user_data) @@ -612,12 +683,16 @@ int scan_mem(unsigned char* buffer, unsigned int buffer_size, RULE_LIST* rule_li continue; } + context.rule = rule; + if (evaluate(rule->condition, &context)) { - if (callback(rule, buffer, buffer_size, user_data) != 0) - { - return ERROR_CALLBACK_ERROR; - } + rule->flags |= RULE_FLAGS_MATCH; + } + + if (callback(rule, buffer, buffer_size, user_data) != 0) + { + return ERROR_CALLBACK_ERROR; } rule = rule->next; diff --git a/libyara/sizedstr.h b/libyara/sizedstr.h new file mode 100644 index 00000000..1e23a118 --- /dev/null +++ b/libyara/sizedstr.h @@ -0,0 +1,33 @@ +/* + +Copyright(c) 2007. Victor M. Alvarez [plusvic@gmail.com]. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +*/ + +#ifndef _SIZEDSTR_H +#define _SIZEDSTR_H + +// +// This struct is used to support strings containing null chars. The length of +// the string is stored along the string data. However the string data is also +// terminated with a null char. +// + +typedef struct _SIZED_STRING +{ + int length; + char c_string[1]; + +} SIZED_STRING; + +#endif \ No newline at end of file diff --git a/libyara/yara.h b/libyara/yara.h index 713c1e40..0fe61fdd 100644 --- a/libyara/yara.h +++ b/libyara/yara.h @@ -59,7 +59,7 @@ GNU General Public License for more details. #endif #define ERROR_INSUFICIENT_MEMORY 1 -#define ERROR_DUPLICATERULEIDENTIFIER 2 +#define ERROR_DUPLICATERULEIDENTIFIER 2 #define ERROR_INVALID_CHAR_IN_HEX_STRING 3 #define ERROR_MISMATCHED_BRACKET 4 #define ERROR_SKIP_AT_END 5 @@ -71,12 +71,11 @@ GNU General Public License for more details. #define ERROR_UNDEFINED_RULE 11 #define ERROR_COULD_NOT_OPEN_FILE 12 #define ERROR_INVALID_REGULAR_EXPRESSION 13 -#define ERROR_INVALID_BEGINING_FOR_REGEXP 14 -#define ERROR_SYNTAX_ERROR 15 -#define ERROR_DUPLICATE_TAG_IDENTIFIER 16 -#define ERROR_UNREFERENCED_STRING 17 -#define ERROR_DUPLICATE_STRING_IDENTIFIER 18 -#define ERROR_CALLBACK_ERROR 19 +#define ERROR_SYNTAX_ERROR 14 +#define ERROR_DUPLICATE_TAG_IDENTIFIER 15 +#define ERROR_UNREFERENCED_STRING 16 +#define ERROR_DUPLICATE_STRING_IDENTIFIER 17 +#define ERROR_CALLBACK_ERROR 18 typedef struct _MATCH { @@ -146,6 +145,7 @@ typedef struct _RULE_LIST RULE* head; RULE* tail; STRING_LIST_ENTRY* hash_table[256][256]; + STRING_LIST_ENTRY* non_hashed_strings; } RULE_LIST; diff --git a/yara.c b/yara.c index 9d232b79..9e630026 100644 --- a/yara.c +++ b/yara.c @@ -36,6 +36,8 @@ int recursive_search = FALSE; int show_tags = FALSE; int show_specified_tags = FALSE; int show_strings = FALSE; +int negate = FALSE; + TAG* specified_tag_list = NULL; @@ -43,13 +45,14 @@ TAG* specified_tag_list = NULL; void show_help() { - printf("usage: yara [ -t tag ] [ -g ] [ -s ] [ -r ] [ -v ] [RULEFILE...] FILE\n"); + printf("usage: yara [ -t tag ] [ -g ] [ -s ] [ -r ] [ -n ] [ -v ] [RULEFILE...] FILE\n"); printf("options:\n"); - printf(" -t Display rules tagged as and ignore the rest. This option can be used more than once.\n"); - printf(" -g Display tags.\n"); - printf(" -s Display strings.\n"); - printf(" -r Recursively search directories.\n"); - printf(" -v Show version information.\n"); + printf(" -t print rules tagged as and ignore the rest. This option can be used more than once.\n"); + printf(" -n print rules that doesn't apply (negate).\n"); + printf(" -g print tags.\n"); + printf(" -s print strings.\n"); + printf(" -r recursively search directories.\n"); + printf(" -v show version information.\n"); printf("\nReport bugs to: <%s>\n", PACKAGE_BUGREPORT); } @@ -160,22 +163,43 @@ void scan_dir(const char* dir, int recursive, RULE_LIST* rules, YARACALLBACK cal #endif -void print_string(unsigned char* buffer, unsigned int buffer_size, unsigned int offset, unsigned int length) +void print_string(unsigned char* buffer, unsigned int buffer_size, unsigned int offset, unsigned int length, int unicode) { - int i = offset; - int len = 0; - char* tmp; - - tmp = malloc(length + 1); + int i; + char* str; - memcpy(tmp, buffer + offset, length); + str = (char*) (buffer + offset); - tmp[length] = 0; + for (i = 0; i < length; i++) + { + if (str[i] >= 32 && str[i] <= 126) + { + printf("%c",str[i]); + } + else + { + printf("\\x%02x", str[i]); + } + + if (unicode) i++; + } + + printf("\n"); +} + +void print_hex_string(unsigned char* buffer, unsigned int buffer_size, unsigned int offset, unsigned int length) +{ + int i; + char* str; - printf("%s\n", tmp); - - free(tmp); + str = (char*) (buffer + offset); + for (i = 0; i < length; i++) + { + printf("%02X ", str[i]); + } + + printf("\n"); } int callback(RULE* rule, unsigned char* buffer, unsigned int buffer_size, void* data) @@ -184,6 +208,8 @@ int callback(RULE* rule, unsigned char* buffer, unsigned int buffer_size, void* STRING* string; MATCH* match; + int rule_match; + int string_found; int show = TRUE; if (show_specified_tags) @@ -203,6 +229,10 @@ int callback(RULE* rule, unsigned char* buffer, unsigned int buffer_size, void* } } + rule_match = (rule->flags & RULE_FLAGS_MATCH); + + show = show && ((!negate && rule_match) || (negate && !rule_match)); + if (show) { if (show_tags) @@ -240,13 +270,17 @@ int callback(RULE* rule, unsigned char* buffer, unsigned int buffer_size, void* printf("%s %s\n", rule->identifier, (char*) data); } + /* show matched strings */ + if (show_strings) { string = rule->string_list_head; while (string != NULL) { - if (string->flags & STRING_FLAGS_FOUND) + string_found = string->flags & STRING_FLAGS_FOUND; + + if ( (!string_found)) { match = string->matches; @@ -256,17 +290,15 @@ int callback(RULE* rule, unsigned char* buffer, unsigned int buffer_size, void* if (IS_HEX(string)) { - //TODO: print_hex_string() - printf("\n"); + print_hex_string(buffer, buffer_size, match->offset, match->length); } else if (IS_WIDE(string)) { - //TODO: print_wide_string() - printf("\n"); + print_string(buffer, buffer_size, match->offset, match->length, TRUE); } else { - print_string(buffer, buffer_size, match->offset, match->length); + print_string(buffer, buffer_size, match->offset, match->length, FALSE); } match = match->next; @@ -287,7 +319,7 @@ int process_cmd_line(int argc, char const* argv[]) TAG* tag; opterr = 0; - while ((c = getopt (argc, (char**) argv, "rsvgt:")) != -1) + while ((c = getopt (argc, (char**) argv, "rnsvgt:")) != -1) { switch (c) { @@ -306,6 +338,10 @@ int process_cmd_line(int argc, char const* argv[]) case 's': show_strings = TRUE; break; + + case 'n': + negate = TRUE; + break; case 't':