Ver. 1.6 Víctor Manuel Álvarez victor.alvarez@virustotal.com YARA Korean User's Manual Ver. 1.6 Hakawati(Woo-seok Choi) siansia007@gmail.com ISAC & Research Engineer : http://www.tricubelab.com Kisec 40 th : http://www.kisec.com Malware Project Member : http://www.boanproject.com Blog : http://hidka.tistory.com 1
YARA install! 4 0.1 Yara 1.6 install on Linux! 4 0.2 Yara-Python-1.6 install on Linux! 4 0.3 Yara install on Windows! 4 YARA in a nutshell! 5 Writing rules! 6 2.1 Comments! 7 Strings! 8 3.1 Hexadecimal strings! 8 3.2 Text strings! 10 3.2.1 Case-insensitive strings! 11 3.2.2 Wide-character strings! 12 3.2.3 Searching for full words! 13 3.3 Regular expressions! 13 Conditions! 14 4.1 Counting strings! 14 4.2 String offsets or virtual addresses! 15 4.3 File size! 16 4.4 Executable entry point! 16 4.5 Accessing data at a given position! 17 4.6 Sets of strings! 18 4.7 Applying the same condition to many strings! 20 4.8 Using anonymous strings with "of" and "for..of"! 21 4.9 Iterating over string occurrences! 21 4.10 Referencing other rules! 23 More about rules! 23 5.1 Global rules! 24 5.2 Private rules! 24 5.3 Rule tags! 24 5.4 Metadata! 25 5.5 External variables! 26 Includes! 27 Using YARA from command-line! 28 Using YARA from Python! 29 PerformanceGuidelines 33 YARA Editor 33 2
10.1 YARA-Editor-1.0.5 Install on Linux! 34 10.2 UI Yara Browser! 35 10.3 UI Malware Browser! 35 10.4 Editor 36 10.5 Config File 36 10.6 Key Bindings 37 10.7 File Menu 37 10.8 Edit Menu 37 10.9 Yara Menu 37 10.10 Editor 37 3
0. YARA install YARA 를설치하고사용하는방법은매우간단합니다. Linux 계열들은소스코드를다운로드 받고컴파일하여사용할수있습니다. Windows 계열은컴파일을통해사용할수없고, Python 의모듈을이용하여사용할수있습니다. YARA 를이용한탐지를효과적으로 ( 자동화 ) 하기위해서는 Python 프로그래밍을연습해야합 니다. 0.1 Yara 1.6 install on Linux ~# sudo apt-get install libpcre3-dev g++ ~# wget http://yara-project.googlecode.com/files/yara-1.6.tar.gz ~# tar xfz yara-1.6.tar.gz ~# cd yara-1.6 ~/yara-1.6#./configure ~/yara-1.6# make ~/yara-1.6# make check ~/yara-1.6# make install 0.2 Yara-Python-1.6 install on Linux ~# wget https://yara-project.googlecode.com/files/yara-python-1.6.tar.gz ~# tar xfz yara-python-1.6.tar.gz ~# cd yara-python-1.6 ~/yara-python-1.6# python setup.py build ~/yara-python-1.6# python setup.py install Permission 에러가발생시명령줄앞에 sudo를사용하시면됩니다. 0.3 Yara install on Windows Windows 에서는 Python 의 Yara 모듈로 Yara 를사용할수있습니다. 그래서 Yara 가요구하는 Python 의버전에맞게 Python 을설치해야합니다. 4
다운로드 : https://code.google.com/p/yara-project/downloads/list >>> import yara >>> rules = yara.compile(filepath="yara 룰파일주소 ") >>> rules.match(" 대상파일주소 ") 1. YARA in a nutshell YARA는악성코드를연구하는연구원이악성코드의종류들을식별하고분류하는목적으로사용하는도구입니다. YARA를사용하면그종류의샘플에포함된텍스트또는바이너리정보의기반으로악성코드를분류할수있습니다. YARA는설명, 이름규칙문자열의집합그리고부울식으로규칙로직을결정합니다. 규칙이설명된악성코드의종류에속해있는지결정하기위해파일또는실행중인프로세스에적용할수있습니다. 다음예와함께설명합니다. 다음두변종의악성코드종류가있다고가정합니다. 그중하나는 http://bar.com/badfile2.exe 에서다운로드하고, 다른하나는 http://foo.com/badfile1.exe 에서다운로드합니다. 이 URL들의악성코드는하드코딩되어있습니다. win.exe 이름으로다운로드되어떨어지는두변종의파일또한하드코드의샘플을포함하고있습니다. 이러한설정된것들을통해우리는다음과같은규칙을만들수있습니다. rule BadBoy $a = win.exe $b = http://foo.com/badfile1.exe $c = http://bar.com/badfile2.exe $a and ($b or $c) 위의규칙은파일또는프로세스가 win.exe 문자열과두개의 URL 중하나를포함하고있 을때, BadBoy 로보고하도록 YARA 에게지시합니다. 이는단지단순한예제이며, 더복잡하고강력한규칙은 wild-card, 대소문자를구분하는텍 스트문자열, 정규표현식, 그리고 YARA 에서제공하는다양한기능들을사용하여만듭니다. 5
2. Writing rules YARA 의규칙은이해하고쓰기쉽게하기위해 C 언어의구조체를선언하는방식과유사한 구문으로갖추고있습니다. 다음은 YARA 에어떤것도적용하지않은아주간단한규칙입니 다. rule Dummy false YARA의각규칙은식별자규칙을따르는키워드 rules로시작합니다. 식별자는 C 프로그래밍언어와동일한어휘규칙을준수해야하며, 영숫자와밑줄문자를포함할수있지만, 첫번째문자는숫자를사용해서는안됩니다. 규칙식별자는대소문자를구분하며 128자를초과할수없습니다. 다음키워드들은예약되어있으며식별자로사용할수없습니다. all in private and include rule any index rva ascii indexes section at int8 strings condition int32 true entrypoint matches uint8 false meta uint16 filesize nocase uinit32 fullword note wide for or global of 규칙은일반적으로두섹션으로구분되어있습니다. 어떤문자열에도의존하지않는규칙이면, 문자열정의및조건, 문자열정의섹션을생략할수있지만상태섹션은항상필요로합니다. 문자열정의섹션은정의되어있는규칙의일부문자열을가집니다. 식별자는 $ 문자다음에영숫자와밑줄로구성되며, 해당문자열을참조하는조건섹션에서사용할수있습니다. 다음예제와같이문자열은텍스트나진수형태로정의할수있습니다. rule ExampleRule 6
$my_text_string = "text here" $my_hex_string = E2 34 A1 C8 23 FB $my_text_string or $my_hex_string 텍스트문자열은 C 언어처럼따옴표로묶여있습니다. 16 진수문자열은대괄호로묶으며, 이 는 16 진수의연속으로구성하며인접한문자는공백으로표시하여구분합니다. 10 진수숫자 는 16 진수문자열로인식하지않습니다. 조건세션의규칙은로직에있습니다. 이섹션에서말하고자하는것은파일또는프로세스에조건세션의규칙을충족하는로직을포함하며이는부울변수로표현합니다. 일반적으로문자열식별자를사용하여이전에정의된문자열찾습니다. 부울변수의역할은문자열식별자를통해파일이나프로세스메모리등에서찾은문자열과비교해 true 또는 false로평가합니다. 이렇게문자열식별자의문자열이파일이나프로세스, 메모리또는기타등등에의해서부울변수로인한 true로발견되었다면설정한규칙대로역할을수행합니다. 2.1 Comments YARA 규칙에서주석을추가할경우 C 소스파일에서단일라인과여러라인에주석을다는 것과같이주석을지원합니다. /* */ This is a multi-line comment... rule CommentExample //... and this is single-line comment false // just an dummy rule, don't do this 7
3. Strings YARA에는 3가지타입의문자열이있습니다. 16진수문자열, 텍스트문자열그리고정규표현식입니다. 16진수문자열은바이트의시퀀스그대로정의하는데사용하고, 텍스트문자열과정규표현식은텍스트문자그대로정의하여읽는부분에사용합니다. 그러나텍스트문자열과정규표현식을정의하는규칙을벗어나면바이트그대로의시퀀스로나타내어아래에표시됩니다. 3.1 Hexadecimal strings 16진수문자열은더욱유연하게 wild-cards, jumps 그리고 alternatives의세가지특별한구조를허용합니다. Wild-cards는어떤것과도매칭하지않고, 어떤바이트가들어갈지도모르는자리를표시하는역할을합니다. 자리를표시하는문자는물음표 (?) 입니다. 다음은 wild-cards와함께 16진수문자열을사용한예제입니다. rule WildcardExample $hex_string = E2 34?? C8 A? FB $hex_string 위의 wild-cards 예제는알수없는값을바이트단위뿐만아니라 nibble 단위로표현할수 있는의미를가집니다. Wild-cards는문자열을정의할때유용하지만변수의길이를알고있어야합니다. 하지만컨텐츠마다그길이는다를수있습니다. 일부의경우에서는변수의내용을길이의덩어리로문자열대신정의해야할수있습니다. 이러한상황에서 wild-cards대신 jumps를사용할수있습니다. rule JumpExample $hex_string = F4 23 [4-6] 62 B4 8
$hex_string 위의예제에서대괄호로묶여있고하이픈으로구분된숫자쌍이있는데, 이는 jumps 를나 타냅니다. 위예제의 jumps 는 4 에서 6 바이트의임의의시퀀스를차지할수있다는것을나 타내고있습니다. 이는다음문자열의패턴들과일치합니다. F4 23 01 02 03 04 62 B4 F4 23 00 00 00 00 00 62 B4 F4 23 15 82 A3 04 45 22 62 B4 가장낮은바운드 jumps 는 ( 하이픈의앞숫자 ) 0 보다크거나같아야하고, 가장높은바운 드 jumps 는 ( 하이픈의뒤의숫자 ) 255 이하여야합니다. 다음은유효한 jumps 입니다.: FE 39 45 [0-8] 89 00 FE 39 45 [23-45] 89 00 FE 39 45 [128-255] 89 00 다음은유효하지않은 jumps 입니다 : FE 39 45 [10-7] 89 00 FE 39 45 [4-4] 89 00 FE 39 45 [200-300] 89 00 Jumps 도이와같이괄호로묶어하나의번호로지정할수있습니다 : FE 39 45 [6] 89 00 위 jumps 의의미는다음과같이정확히 6 바이트의공간이존재해야한다는것을의미합니 다. FE 39 45???????????? 89 00 물론 wild-cards 와 jumps 는동일한문자열에혼합하여사용할수있습니다 : 78 [4] 45?? 5F 9
Wild-cards 와 jumps 의유일한제한은문자열의시작부분에표시할수없다는것입니다. 다음문자열은올바르지않습니다. 5? 00 40 23 [4] 12 35 16 진수문자열의주어진조각에대한다른방법을제공해야만하는상황도있습니다. 이러 한상황에서는정규표현식 (regular expression) 과유사한구문을사용할수있습니다. rule AlternativesExample1 $hex_string = F4 23 ( 62 B4 56 ) 45 $hex_string 이규칙은 F4 23 62 B4 45 또는 F4 23 56 45 가포함된파일과일치합니다. 또한두개이상의대안도표현할수있습니다. 실제로제공할수있는대체시퀀스의양 에는제한이없고길이도제한이없습니다. rule AlternativesExample2 $hex_string = F4 23 ( 62 B4 56 45?? 67 ) 45 $hex_string 위의예제에서도볼수있듯이, wild-cards 를포함하는문자열대체시퀀스의일부로사용 할수있습니다. 그러나 jumps 포함하는규칙은만들수없습니다. 3.2 Text strings 이전섹션과같이텍스트문자열은일반적으로다음과같이정의되어있습니다. 10
rule TextExample $text_string = "foobar" $text_string ASCII- 인코딩, 대소문자를구분하는문자열을표현하는가장간단한방법입니다. 그러나텍 스트문자열은문자열을해석하는방식에유용한수식을동반할수있습니다. 이러한수식 은공백으로구분된문자열정의의끝부분에추가되며, 아래와같이설명합니다. 텍스트문자열은 C 언어에서사용할수있는 escape sequences 의하위집합을포함할수 있습니다. \" \\ \t \xdd 더블쿼터백슬래쉬수평탭 16진수표기법의모든바이트 3.2.1 Case-insensitive strings YARA 의텍스트문자열이기본적으로대소문자를구분하지만같은줄의문자열정의끝부 분에보조 nocase 를추가하여대소문자를구분하지않는모드로설정할수있습니다. rule CaseInsensitveTextExample $text_string = "foobar" nocase $text_string nocase 설정으로문자열 "foobar" 은 "Foobar", "FOOBAR" 및 "foobar" 와일치합니다. 이러한설정은다른설정방식과함께사용할수있습니다. 11
3.2.2 Wide-character strings Wide 설정은실행에필요한많은바이너리에서문자당 2 바이트로인코딩된문자열을검 색하는데사용할수있습니다. 위의그림은문자열 Borland 에서각문자당 1 바이트로인코딩되어나타납니다. 그러므로 다음규칙이일치합니다. rule WideCharTextExample $wide_string = "Borland" wide $wide_string 그러나이설정은단지 0 과문자열에있는문자의 ASCII 코드를볼수있지만영어가아닌 문자가포함된 UTF-16 문자열은지원하지않습니다. 만약 wide 와 ASCII 형태둘다검색하 길원한다면, 순서상관없이 wide 와함께 ASCII 를사용합니다. rule WideCharTextExample $wide_and_ascii_string = "Borland" wide ascii $wide_and_ascii_string 12
Wide 설정없이 ASCII 설정같이나타낼수있지만, wide 에사용되는다양한문자열은기 본적으로 ASCII 로간주되기때문에사용하지않아도됩니다. 3.2.3 Searching for full words 텍스트문자열에적용할수있는또다른설정에는 fullword가있습니다. 이설정은숫자가아닌문자로일치되는문자열이있는경우에만구분하여나타내도록약속하는것입니다. 예를들어문자열 domain 이있고, fullword로정의했다면 "www.mydomain.com" 은일치하지않지만, "www.my-domain.com" 이나 "www.domain.com" 은일치합니다. 3.3 Regular expressions 정규표현식은 YARA 의가장강력한기능중하나입니다. 이것은텍스트문자열과같은방식 으로정의하지만, 펄프로그래밍언어와같이더블쿼터대신백슬러시로둘러쌉니다. 정규 표현식문법또한펄과호환됩니다. rule RegExpExample1 $re1 = /md5: [0-9a-zA-Z]32/ $re2 = /state: (on off)/ $re1 and $re2 정규표현식은텍스트문자열과같이뒤에 nocase, ascii, wide, 그리고 fullword 와같은수 식어가붙을수있습니다. 이수식어들의의미는이전에텍스트문자열에서설명했던것과 같습니다. 펄정규표현에대한좀더자세한내용은아래에방문하시기바랍니다. http://www.pcre.org/pcre.txt http://gypark.pe.kr/wiki/perl/%ec%a0%95%ea%b7%9c%ed%91%9c%ed%98%84%ec%8b%9 D 13
4. Conditions Conditions는모든프로그래밍언어에서찾을수있는 ( 예를들어 if 구문에서사용하는..) 부울연산식에불과합니다. 일반적인부울연산자 and, or 그리고 not 및관계연산자 >=, <=, <, >, == 그리고!= 를포함할수있습니다. 또한숫자표현은산술연산자 (+,-,*,\) 및비트연산자 (&,, <<, >>, ~) 를사용할수있습니다. 문자열식별자또한 Condition 내에서부울변수로동작할수있으며, 그값은파일내부 에관련된문자열의존재여부에따라달라집니다. 아래예제를보면, condition 에사용된 $a 는파일 ( 또는프로세스 ) 내에 text1 이라는문자열 이존재하면 True 가되고, 그렇지않으면 False 가됩니다. rule Example $a = "text1" $b = "text2" $c = "text3" $d = "text4" ($a or $b) and ($c or $d) 4.1 Counting strings 때때로우리는특정문자열의존재여부에대해알필요가있지만, 얼마나많은문자열이파일또는프로세스메모리에나타날지는모릅니다. 각일치하는문자열항목의수는변수로표현한문자열식별자이름이지만 $ 문자대신에 # 문자로사용합니다. 예제 : rule CountExample 14
$a = "dummy1" $b = "dummy2" #a == 6 and #b > 10 이규칙은정확히문자열 $a 를 6 번포함하고문자열 $b 를 10 번보다많이포함하는파일이 나프로세스를검사합니다. 4.2 String offsets or virtual addresses 대부분의경우에, 문자열식별자를조건에서사용하는경우는관련문자열이어떤파일이나프로세스메모리내에있어그것을알고자하는경우지만, 때때로문자열이파일이나일부가상주소에포함되어있는경우프로세스주소공간의특정오프셋을알필요가있습니다. 이러한상황에서연산자 at이필요합니다. 이연산자는다음예제와같이사용됩니다. rule AtExample $a = "dummy1" $b = "dummy2" $a at 100 and $b at 200 위예에서 $a at 100 표현은만약문자열 $a가파일안의오프셋 100에서 ( 또는실행중인프로세스의가상주소 100에서 ) 발견되는경우에만해당합니다. 문자열 $b는오프셋 200에서나타납니다. 두오프셋이 10진수임을참고합니다. 16진수숫자는 C언어에서처럼숫자앞에접두사로 0x를추가하여사용하며, 이는가상주소를작성할때매우유용하게사용할수있습니다. 추가로참고할것은 at이 and보다연산자우선순위가높습니다. at 명령어는프로세스메모리영역을포함하는가상주소또는파일의고정된오프셋에서 문자열을탐색할수있고, in 명령은오프셋또는주소의범위안에서문자열을탐색하는데 사용할수있습니다. rule InExample 15
$a = "dummy1" $b = "dummy2" $a in (0..100) and $b in (100..filesize) 위의예제에서는문자열 $a 를오프셋 0 과 100 사이에서찾을것이고, 문자열 $b 는오프셋 100 과파일의끝사이에서찾을수있습니다. 다시말하지만, 숫자는기본적으로 10 진수입 니다. 또한오프셋또는가상주소의 i번째에발생하는문자열 $a은 @a[i] 로사용하여가져올수있습니다. 이는첫번째나타내는것은 @a[1] 두번째는 @a[2] 등등색인기반입니다. 만약문자열이나타낸수보다더큰색인값을정의하는경우, 그결과값은 NaN (Not A Number) 값이될것입니다. 4.3 File size 문자열식별자는변수상태뿐만아니라사용할수있는다른특별한변수들이있습니다. ( 실제로밑에서볼수있는것처럼어떤문자열을정의하지않고규칙을정의할수있습니다.) 이러한특별한변수중하나로 filesize가있는데이는이름그대로파일크기로분석합니다. 크기는바이트로표시됩니다. rule FileSizeExample filesize > 200KB 앞의예는 KB 접미사의사용을보여줍니다. 이접미사는숫자상수에이어사용하면자동으 로 1024 의상수값을곱합니다. MB 접미사를사용하면 2 20 값을곱하게됩니다. 두접미사 는십진수상수에서만사용할수있습니다. filesize 를사용한규칙을파일에적용할수있지만, 만일실행중인프로세스에적용할경우 filesize 는이해할수없는맥락이되기때문에절대검사하지않습니다. 16
4.4 Executable entry point 규칙에서사용할수있는다른특별한변수는 entrypoint입니다. 만약파일이 Portable Executable (PE) 또는 Executable and Linkable Format (ELF), 실행가능한진입점의오프셋을가지고있는경우이변수로인해파일을스캐닝할수있습니다. 만약실행중인프로세스의 entrypoint를스캐닝할경우메인가상주소의실행가능한진입점을가져옵니다. 이변수의일반적인사용은간단한파일감염또는 packers의진입점을감지할수있는일부패턴을찾는것입니다. rule EntryPointExample1 $a = E8 00 00 00 00 $a at entrypoint rule EntryPointExample2 $a = 9C 50 66 A1?????? 00 66 A9???? 58 0F 85 $a in (entrypoint..entrypoint + 10) 규칙에 entrypoint 변수의존재는오직 PE 또는 ELF 파일만이규칙을충족할수있다는것 을의미합니다. 만약 PE 또는 ELF 가아닌파일에이규칙을사용한다면이변수는 false 로 평가됩니다. 4.5 Accessing data at a given position 파일또는실행중인프로세스를검사하는경우에따라특정파일의오프셋이나메모리의가 상주소에저장된데이터의조건을쓸수있는경우가있습니다. 이러한상황에서는파일로 17
부터읽은오프셋을다음기능들중하나를사용할수있습니다. int8(<offset or virtual address>) int16(<offset or virtual address>) int32(<offset or virtual address>) uint8(<offset or virtual address>) uint16(<offset or virtual address>) uint32(<offset or virtual address>) intxx 기능은 <offset or virtual address> 에쓰인 8, 16, 32 비트의부호가있는정수를읽는것이고, uintxx 기능은부호가없는정수를읽습니다. 16 과 32비트의정수는 little-endian으로간주됩니다. 기본적으로 <offset or virtual address> 파라미터는 uintxx 기능의리턴값을포함하여부호가없는정수를반환하는표현이될수있습니다. 다음예제에서는 PE 파일을구별할수있는규칙을볼수있습니다. rule IsPE // MZ signature at offset 0 and... uint16(0) == 0x5A4D and //... PE signature at offset stored in MZ header at 0x3C uint32(uint32(0x3c)) == 0x00004550 4.6 Sets of strings 파일은지정된설정에서숫자를사용하여특정문자열을포함해야한다는것을표현할필 요가있습니다. 설정하는문자열은모두존재할필요는없지만, 적어도일부는있어야한다 고가정하면, 이러한상황에서연산자 of 가필요합니다. rule OfExample1 $a = "dummy1" $b = "dummy2" 18
$c = "dummy3" 2 of ($a,$b,$c) 위규칙은설정한 ($a,$b,$c) 의문자열에서적어도두문자열이어떤문제도없이파일에존 재해야합니다. 물론, 이명령을사용하려면 of 키워드앞의숫자가설정한문자열의개수보 다작거나같아야합니다. 설정의요소는명시적으로앞의예와같이열거하여사용하거나 wild-cards 를사용할수있 습니다. 예를들면다음과같습니다. rule OfExample2 $foo1 = "foo1" $foo2 = "foo2" $foo3 = "foo3" /* ($foo*) is equivalent to ($foo1,$foo2,$foo3) */ 2 of ($foo*) rule OfExample3 $foo1 = "foo1" $foo2 = "foo2" $bar1 = "bar1" $bar2 = "bar2" 3 of ($foo*,$bar1,$bar2) 19
($*) 대신에 them 를사용하여규칙에있는모든문자열을참조하거나더가독성을높일수 있습니다. rule OfExample4 $a = "dummy1" $b = "dummy2" $c = "dummy3" 1 of them /* equivalent to 1 of ($*) */ 위의모든예제에서는문자열의번호는숫자상수로지정되었지만, 숫자값을반환하는식 으로사용할수도있습니다. 키워드 any 와 all 가함께사용할수있습니다. all of them /* all strings in the rule */ any of them /* any string in the rule */ all of ($a*) /* all strings whose identifier starts by $a */ any of ($a,$b,$c) /* any of $a, $b or $c */ 1 of ($*) /* same that "any of them" */ 4.7 Applying the same condition to many strings of 명령어와매우유사하지만좀더강력한 for..of 명령어가있습니다. 구문은다음과같습 니다. for expression of string_set : ( boolean_expression ) 그의미는다음과같습니다. string_set 의문자열로부터적어도 expression 는 boolean_expression 을만족해야합니다. 즉 boolean_expression 는 string_set 의모든문자열을평가하여적어도반환값이 true 가되 는 expression 이어야합니다. 20
물론, boolean_expression의중요한세부사항을제외하고, 규칙의조건섹션에서부울식을표현하여사용할수있습니다. 여기에는평가되는문자열에대한달러기호 ($) 를사용할수있습니다. 다음식을살펴보십시오. for any of ($a,$b,$c) : ( $ at entrypoint ) 부울식의 $ 기호는특정문자열에연결하지않고, $a 다음 $b 다음 $c 의연속하는세가지 표현을평가합니다. 이미알겠지만 of 명령어는 for..of 의특별한형태입니다. 다음표현식은동일합니다. any of ($a,$b,$c) for any of ($a,$b,$c) : ( $ ) 또한 # 과 @ 를사용한사건의횟수에대한참조를만들어각각의첫번째문자열의오프셋 을구합니다. for all of them : ( # > 3 ) for all of ($a*) : ( @ > @b ) 4.8 Using anonymous strings with "of" and "for..of" of 와 for..of 연산자다음에 them을사용할경우, 각문자열에할당된식별자는일반적으로불필요한것입니다. 개별적으로모든문자열을참조하지않음으로써각각의고유한식별자를제공할필요가없습니다. 이러한상황에서는다음예에서와같이 $ 문자로만구성된익명의식별자를이용하여문자열을선언할수있습니다. rule AnonymousStrings $ = "dummy1" $ = "dummy2" 1 of them 21
4.9 Iterating over string occurrences 4.2 절에서와같이특정문자열이있는파일또는프로세스주소공간내에서나타나는오 프셋또는가상주소는구문을사용하여액세스할수있습니다. @a[i] 에서 i 가나타내는 지수는 $a 에서발생하는문자열로말할수있습니다. (@a[1], @a[2],...). 때때로이러한반복구문과오프셋의일부를이용하여주어진조건을만족시켜야합니다. 예 를들면다음과같습니다. rule Ocurrences $a = "dummy1" $b = "dummy2" for all i in (1,2,3) : (@a[i] + 10 == @b[i]) 위규칙을말하자면 $b 의첫세가지사건은 $a 의첫세가지사건에서 10 바이트차이로 있어야알려줍니다. 다음은위와같은형태로사용한것입니다. for all i in (1..3) : (@a[i] + 10 == @b[i]) 인덱스값범위를 (1,2,3) 대신 (1..3) 으로사용한것을확인할수있습니다. 물론, 범위를지 정하는데있어상수를사용하도록강요하지만, 다음예에서보는것과같이표현식을사용 할수있습니다. for all i in (1..#a) : (@a[i] < 100) 이경우 $a 의모든사건을통한반복을하고있습니다. (#a 는 $a 의일치하는발생의수를 나타낸다는것을기억하면됩니다.) 이규칙은 $a 의모든사건이파일의시작에서부터 100 바이트내에존재한다는것을말하고있습니다. 문자열의일부발생조건이만족해야하는것을표현하려는경우, 동일한논리로 for..of 연산 22
자를사용하여적용할수있습니다. for any i in (1..#a): ( @a[i] < 100 ) for 2 i in (1..#a): ( @a[i] < 100 ) 이연산자는반복구문입니다. for expression identifier in indexes : ( boolean_expression ) 4.10 Referencing other rules 규칙에대한조건을작성할때기존프로그래밍언어의함수호출과유사한방식으로이전 에정의된규칙에대한참조를만들수있습니다. 이방법을통해다른함수를참조하는 규칙을만들수있습니다. 다음예에서볼수있습니다. rule Rule1 $a = "dummy1" $a rule Rule2 $a = "dummy2" $a and Rule1 위의예에서볼수있듯이, 오직파일의문자열 dummy2 와 Rule1 을만족하는경우에만 Rule2 를만족할수있습니다. 참고로호출을하기전에호출되는규칙을정의하는것을엄 격하게관리할필요성이있습니다. 23
5. More about rules 이것들은지금까지적용하지않은 YARA 규칙의일부측면들이지만, 중요합니다. 이는 global rules, private rules, tags 그리고 metadata 입니다. 5.1 Global rules Global rules 는한번에모든규칙에제한을부여할수있습니다. 예를들어, 특정크기에제 한을두어초과하면해당파일을무시한다고가정합니다. 그러면규칙을통해자신의조건 에필요한규칙으로수정하거나, 다음과같이 global rules 로작성할수있습니다. global rule SizeLimit filesize < 2MB 많은 global rules 를정의하려면, 다른규칙을적용하기전에원하는만큼사용하여 global rules 를적용할수있습니다. 5.2 Private rules Private rules는매우단순한개념입니다. 이것은단순히규칙이특정파일과일치할때 YARA에이해보고되지않는규칙입니다. 전혀보고되지않는규칙은처음에는아무것도아닌것처럼보일수있으나, YARA에서제공하는다른규칙과혼합하여 (4.5 섹션을참조 ) 매우유용하게사용될수있습니다. Private rules는다른규칙에대한블록을구축하는역할을하고, 동시에관련이없는정보를 YARA를통해복잡하지않게출력하도록할수있습니다. Private 규칙은 private키워드를추가하여선언할수있습니다. private rule PrivateRuleExample... 24
private 와 global 둘다사용하여만든규칙은 YARA 에이해보고되지는않지만글로벌규칙 을모두만족해야만합니다. 5.3 Rule tags YARA의또다른유용한기능으로는규칙에태그를추가할수있습니다. 이러한태그는나중에 YARA의출력을필터링하고오직흥미로운룰만을보여주는데사용할수있습니다. 룰에많은태그들을추가하길원하는경우, 아래에서보여주는것과같이규칙식별자이후에선언하여사용할수있습니다. rule TagsExample1 : Foo Bar Baz... rule TagsExample2 : Bar... 태그는규칙식별자의동일한어휘규칙을준수해야하기때문에영문자와숫자및밑줄을 사용할수있으며, 숫자로시작할수없습니다. 또한대소문자를구분합니다. YARA 를사용할때사용자가설정한태그나태그된태그를사용한규칙을출력할수있 습니다. 5.4 Metadata 규칙은문자열정의및조건섹션외에도, metadata 섹션을이용하여사용자의규칙에대한 추가정보를넣을수있습니다. metadata 섹션은다음예외같이 meta 키워드와식별자 / 값 을쌍으로포함하여정의할수있습니다. rule MetadataExample meta: my_identifier_1 = "Some string data" 25
my_identifier_2 = 24 my_identifier_3 = true $my_text_string = "text here" $my_hex_string = E2 34 A1 C8 23 FB $my_text_string or $my_hex_string 예제에서볼수있듯이 metadata 식별자는등호뒤에항상다음과같은값이할당됩니다. 할당된값은문자열, 정수또는부울값중에하나인 true 또는 false가될수있습니다. 참고할것은 metadata 섹션에정의된식별자 / 값쌍은상태섹션에서는사용할수없고, 규칙에대한추가정보를저장하는목적으로만사용할수있습니다. 5.5 External variables External variables 는외부에서제공되는값에따라규칙을정의할수있습니다. 예를들어 다음과같은규칙으로작성할수있습니다. rule ExternalVariableExample1 ext_var == 10 이경우에는 ext_var의값은실행시간에할당된외부변수입니다. (command-line 툴의옵션 d와 yara-python의메소드인 match와 compile의 externals 파라매터에서볼수있습니다.) 외부변수의유형은할당된값에따라 integer, string 또는부울이될수있습니다. 정수변수는상태와논리변수, 부울표현의자리를차지할수를상수로대체할수있습니다. 다음은이예제입니다. rule ExternalVariableExample2 bool_ext_var or filesize < int_ext_var 26
형식문자열의외부변수는연산자 contains 와 matches 와함께사용할수있습니다. 문자열 은지정한하위문자열을포함하는경우 contains 연산자는 true 를반환합니다. 만약문자열 이주어진정규표현식과일치하는경우 matches 연산자는 true 를반환합니다. rule ExternalVariableExample3 string_ext_var contains "text" rule ExternalVariableExample4 string_ext_var matches /[a-z]+/ 규칙에사용되는모든외부변수는 command-line 도구의 d 옵션을사용하여실행시간에 정의되거나, 또는 yara-python 에서적절한방법으로외부파라미터를제공하여사용합니다. 6. Includes 좀더유연한규칙을만들수있도록하기위해, YARA에서는 include 지시어를제공합니다. 이지시자는 C 프로그램에서 #include 사전지시자와비슷하게컴파일하는동안현재파일에서지정한소스파일의내용을삽입하는방식으로작동합니다. 다음예제는현재파일이 other.yar 를포함합니다. include "other.yar" include 지시문에서파일을검색하는기본경로는현재파일이상주하는디렉터리입니다. 이러한이유에서, 앞의예제의 other.yar 파일은현재파일과같은디렉터리에위치해야합 니다. 하지만상대경로를지정하여이러한문제점을해결할수있습니다. include "./includes/other.yar" include "../includes/other.yar" 27
또한절대경로를사용할수있습니다. include "/home/plusvic/yara/includes/other.yar" Windows 에서는드라이브문자를작성하는것을잊으면안되며, 슬래시및백슬래시모두 사용할수있습니다. include "c:/yara/includes/other.yar" include "c:\\yara\\includes\\other.yar" 7. Using YARA from command-line YARA를호출하기위해서는다음두가지가필요합니다 : 적용할규칙집합, 파일에대한정보와경로, 폴더또는스캔할프로세스의 PID. 규칙은규칙을포함하는하나이상의일반텍스트파일을통해 YARA에게제공하거나또는표준입력을통해어떤규칙파일을지정하지않고제공할수있습니다. usage: yara [OPTION]... [RULEFILE]... FILE PID options: -t <tag> print rules tagged as <tag> and ignore the rest. -i <identifier> print rules named <identifier> and ignore the rest. -n print only not satisfied rules (negate). -g print tags. -m print metadata. -s print matching strings. -l <number> abort scanning after a <number> of rules matched. -d <identifier>=<value> define external variable. -r recursively search directories. -f fast matching mode. -v show version information. 규칙은 YARA의마지막인자로지정된객체에적용되는데, 이것은현재의디렉터리의경로에있다면, 그안에포함된모든파일을검사할수있습니다. 기본적으로 YARA는재귀적으로디렉터리를검색하도록시도하지않지만 r 옵션을사용하여이를해결할수있습니다. -t 옵션은 YARA의출력필터역할을하지만하나이상의태그를지정할수없습니다. 이옵션을사용하는경우, 지정된태그만규칙에표시됩니다. -i 옵션은비슷한동작을하는데, 주어진식별자를갖는하나를제외한모든규칙을필터링합니다. 또한 n을이용하여만족스럽지못한규칙을출력하는데변형하여사용할수있습니다. -l 옵션은주어진번호와일치하면규칙을중지할수있습니다. 28
-d 옵션은외부변수를정의하는데사용합니다. 다음과같습니다. -d flag=true -d beast=666 -d name= James Bond 8. Using YARA from Python YARA 는파이썬스크립트에서호출할수있습니다. yara-python 확장은파이썬사용자에게 YARA 기능을사용할수있도록하기위해제공됩니다. 한번 yara-python 을설치하고나면 아래와같이사용할수있습니다. import yara import yara 를한다음데이터를적용하기전에 YARA 규칙을컴파일하고, 컴파일은규칙 의파일경로를설정하여할수있습니다. rules = yara.compile(filepath='/foo/bar/myrules') 기본 argument 는 filepath 이므로, 따로이름을지정할필요가없습니다. rules = yara.compile('/foo/bar/myrules') 또한규칙의파일개체화를통해컴파일할수있습니다. fh = open('/foo/bar/myrules') rules = yara.compile(file=fh) fh.close() 또는파이썬문자열에서직접컴파일할수있습니다. rules = yara.compile(source='rule dummy true ') 동일한시간에파일이나문자열의그룹을컴파일하려한다면 filepaths 또는 sources 인수 이름을사용할수있습니다. rules = yara.compile(filepaths= 'namespace1':'/my/path/rules1', 'namespace2':'/my/path/rules2' 29
) rules = yara.compile(sources= 'namespace1':'rule dummy true ', 'namespace2':'rule dummy false ' ) 참고로 filepaths 와 sources는문자열유형의키가존재하는 dictionary형태가있는것을확인할수있습니다. dictionary키는네임스페이스의식별자로사용됩니다. 이는두번째예에서 dummy 라는이름으로발생하는것과같이, 다른소스에서같은이름으로사용되는규칙을구별할수있도록해줍니다. 또한컴파일방법은 includes 라는이름의선택적부울파라미터를갖고있습니다. 그변수는 소스파일에접근하는지시자 include directive 를제어할수있는지없는지를선택해주는 파라미터입니다. 해당예는다음과같습니다. rules = yara.compile('/foo/bar/myrules', includes=false) 만약소스파일에 include 지시어가포함되어있는경우이전라인은예외를일으킬것입니 다. 만약개인적인규칙속의외부변수를사용한다면해당외부변수를컴파일하거나혹은다른파일에그규칙을적용하는동안, 해당외부규칙을정의해야할것입니다. 그리고컴파일하는순간에변수를정의하기위해서는컴파일메서드에외부파라미터를보내야합니다. 이것은다음예와같습니다. rules = yara.compile( '/foo/rules', externals= 'var1 : 'some string, 'var2 : 4, 'var3 : True ) 외부파라미터는키와같은변수이름의사전이어야하고, 정수또는부울유형의두문자 열의연관값이어야합니다. 컴파일의모든경우는결과적으로일치하는방식을가지고있는클래스 Rules 의인스턴스를 반환합니다. 30
matches = rules.match('/foo/bar/myfile') 그러나또한파이썬문자열로규칙을적용할수있습니다. f = fopen('/foo/bar/myfile', 'rb') matches = rules.match(data=f.read()) 아니면프로세스를실행합니다. matches = rules.match(pid=1234) 컴파일의경우와마찬가지로, 탐색방법은외부파라미터안에외부변수에대한정의를받 을수있습니다. matches = rules.match( '/foo/bar/myfile', externals= 'var1': 'some other string', 'var4': 100, ) 컴파일하는시간동안정의된외부변수는 match 함수에서재차정의될필요는없습니다. 그 러나필요에따라어떤변수를재정의하거나, 컴파일하는동안제공되지않은정의를추가 제공할수있습니다. 일치하는방법을호출할때콜백함수를지정할수있습니다. 제공되는기능은매칭여부와상관없이모든규칙에대한호출이이루어집니다. 콜백기능은하나의사전타입파라미터를결정하며, 차기규칙이나혹은데이터에규칙을적용하는것을중지하는 CALLBACK_ABORT를수행하여 CALLBACK_CONTINUE을리턴합니다. 여기예제를보십시오. import yara def mycallback(data): print data yara.callback_continue matches = rules.match('/foo/bar/myfile', callback=mycallback) 31
전달된 dictionary 형태는다음과같이될것입니다. 'tags': ['foo', 'bar'], 'matches': True, 'namespace': 'default', 'rule': 'my_rule', 'meta':, 'strings': [(81, '$a', 'abc'), (141, '$b', 'def')] 규칙데이터여부와일치하는경우일치하는필드를나타냅니다. 문자열필드형식의벡터로, 검색문자열의목록입니다. (<offset>, <string identifier>, <string data>) 탐색방법은 Match 클래스의인스턴스의목록을반환합니다. 이클래스의인스턴스는일치 하는규칙의이름을포함하여텍스트문자열로간주될수있습니다. 다음예는이목록을 프린트합니다. for m in matches: print "%s" % m 일부환경에서는명시적으로 Match 문자열의인스턴스를변환해야할수있습니다. 다른 문자열과비교했을때의예를들면다음과같습니다. if str(matches[0]) == 'SomeRuleName':... Match 클래스는콜백함수에전달된 dictionary 와같은속성이있습니다. rule namespace meta tags strings 32
9. PerformanceGuidelines YARA 의규칙을만들때최상의성능을위해다음가이드라인을유지하길바랍니다. 첫번째두바이트의문자열에는 wild-cards 또는 jumps의사용을피해야합니다. YARA는가장효과적으로수행하기위해서는빠른속도로파일을검색해야하는데, 이러한목적을위해서해시테이블에선언된문자열을저장합니다. 이해시테이블에저장되는해시키는첫번째두바이트의문자열입니다. 엄격하게정의된첫두바이트가없는문자열은해시테이블에저장될수없어검색과정에서속도가느려집니다. $a = EB?? 00 34 12 0F /* bad, wild-card on second byte */ $a = EB 00?? 34 12 0F /* ok */ $a = /.*ab/ /* bad, regular expression starting with wild-card */ $a = /ab.*/ /* ok, regular expression have the first two chars well defined */ jumps 를사용할때가장짧은길이의범위를유지하여사용합니다. YARA 가 0-255 의길이 로 jumps 를한다는것은좋지않고, 더나은 jumps 를위해범위를짧게유지하는것이좋 습니다. $a = FF 25 00 [0-200] FF 25 /* bad, range from 0 to 200 too wide */ $a = FF 25 00 [0-8] FF 25 /* ok */ $a = FF 25 00 [200-210] FF 25 /* ok */ 하지만너무짧은문자열을정의하지는마십시오. 5~6 바이트들보다짧은문자열은너무 많은파일들을탐색할것입니다. 또한필요한경우에만정규표현식을사용합니다. 정규표현식을이용한평가는본질적으로 느리지만, 사용해야한다면 hex 문자열과함께 jumps 와 wild-cards 를사용하지않는것으로 이문제를완화시킬수있습니다. 10. YARA Editor! 33
YARA 는악성코드샘플을식별하고분류하여악성코드연구자들을돕는목적으로만들어진 도구입니다. 그리고 Yara-editor 는이러한 YARA 툴에사용되는규칙을쉽게빌드하도록도와 줍니다. 즉, 규칙을만들고바이너리에적용하기위한편집기입니다. 10.1 YARA-Editor-1.0.5 Install on Linux ~# apt-get install python-sip ~# apt-get install python-gt4 ~# wget http://yara-editor.googlecode.com/files/yara-editor-0.1.5.tar.gz ~# tar xfz yara-editor-0.1.5.tar.gz ~# cd yara-editor-0.1.5 ~yara-editor-0.1.5# python setup.py install python-sip : C와 C++ 의라이브러리와인터페이스를파이썬에서작성하기위해사용하는모듈입니다. 아래의 python-qt4를사용하기위해설치합니다. python-qt4 : qt4는데스크탑, 임베디드및모바일플랫폼에대한응용프로그램및사용자인터페이스의생성을간소화하여사용할수있도록만들어진프레임워크입니다. 이는 C++, CSS, Javascript와같은 API를제공합니다. python-qt4는이러한 qt4를 python에서사용할수있도록합니다. 실행하면다음과같은에러가발생합니다. ~yara-editor-0.1.5# yara-editor Traceback (most recent call last): File "/usr/local/bin/yara-editor", line 112, in <module> main(sys.argv) File "/usr/local/bin/yara-editor", line 109, in main mapp = app(args) File "/usr/local/bin/yara-editor", line 101, in init config=config) File "/usr/local/lib/python2.6/dist-packages/yaraeditor/core/controlleur.py", line 78, in init self.path_yara=config.get(conf_preference, CONF_PATH_YARA) File "/usr/lib/python2.6/configparser.py", line 531, in get raise NoSectionError(section) ConfigParser.NoSectionError: No section: 'preference ~yara-editor-0.1.5# 34
하지만다시실행하게되면정상적으로동작하게되지만, 프로그램을종료하면다음과같은메시지를보여줍니다. ~yara-editor-0.1.5# yara-editor QWidget::setWindowModified: The window title does not contain a '[*]' placeholder ~yara-editor-0.1.5# 10.2 UI Yara Browser! 왼쪽측면은 YARA Browser 입니다. 이두부분은두가지요소들로구성되어있습니다. Ÿ Ÿ 경로 경로로지정된디렉토리의내용 파일의경우사용자가더블클릭을할때, 파일이중앙부분에서열립니다. 10.3 UI Malware Browser! 35
오른쪽측면은 Malware Browser 입니다. 이두부분은두가지요소들로구성되어있습니 다. Ÿ Ÿ 경로 경로로지정된디렉토리의내용 여기에폴더와파일을선택할수있습니다. 선택한파일은강조되어표시됩니다. 사용자가 규칙을테스트하려할경우, 각각의악성코드를선택하거나각각의폴더를선택하면됩니 다.( 폴더는재귀적으로검사합니다.) 10.4 Editor 중앙부분은규칙을작성할수있습니다. 각각의키워드는강조되어표시됩니다. 10.5 Config File 구성파일이없는경우, 응용프로그램이파일을만듭니다. ~/.yara/yara-editor/conf 36
이파일에는많은요소가들어있지않습니다.( 임시 ) [preference] lang = /home/user/.yara/yara-editor/i18n/i18n_en.qm path_yara_rules = /home/user/yara path_malwares = /home/user/ lang : 언어는다음버전에대한것입니다. path_yara_rules : 응용프로그램탐색을위한 YARA 규칙의저장소의경로 path_malware : 악성코드탐색을위한편집기의경로 10.6 Key Bindings 이에디터에서모든키바인딩은구성하지않습니다. 10.7 File Menu Ctrl+N Ctrl+O Ctrl+S Ctrl+Shift+S Ctrl+P Ctrl+Shift+P Ctrl+D Ctrl+Q 새문서 YARA 룰열기저장다른이름으로저장출력미리보기 PDF로내보내기종료 10.8 Edit Menu Ctrl+Z Ctrl+Shift+Z Ctrl+X Ctrl+C Ctrl+V 실행취소다시실행잘라내기복사하기붙여넣기 10.9 Yara Menu F5 선택한악성코드에룰적용하기 37
10.10 Editor Ctrl+E 가능한모든완료들을표시 38