A powerful python wrapper for libyara.
Why:
- ctypes releases the GIL on system function calls... Run your PC to its true potential.
- No more building the PyC extension...
- I found a few bugs and memory leaks and wanted to make my life simple.
For tips / tricks with this wrapper feel free to post a question here.
[mjdorma+yara-ctypes@gmail.com]
yara folder:
- scan.py - Command line interface tool for yara scanning files and processes
- rules.py - Context manager and interface to libyara.py. Also includes a main to demonstrate how simple it is to build a rules object than scan.
- ./rules/ - default yar rules path... Demonstrates how to store yar files with the opened 'example' yars and 'hbgary' yars...
test folder:
- libyara_wrapper.py - Wraps the libyara library file
- test_libyara.py / test_yara.py
libs folder: contains precompiled libyara files (make shipping easier)
Simply run the following:
> python setup.py install > python setup.py test > python -m yara.scan -h
If the package does not contain a pre-compiled libyara library for your platform you need to build and install it. (see libyara build notes)
A rough build guide - my notes
Ubuntu pre-requisites:
> sudo apt-get install flex libpcre3-dev pcre bison > cd $ROOTDIR/yara-1.6/ > aclocal > automake -ac > autoheader > autoconf > ./configure make install
Windows pre-requisites:
> install mingw32 > pcre-8.20 builds fine... ./configure && make install > autoreconf -fiv # force an autoreconf (or update/replace libtools m4) > install build auto tools (including autoconf autogen) > find the latest pcre and bison - build them! :P > cd $ROOTDIR/yara-1.6/ > ./configure > make install
Note:
1. Make sure the libyara.so or libyara-0.dll can be found!
Windows:
<python install dir>\DLLs (or sys.prefix + 'DLLs')
Linux:
<python env usr root>/lib (or sys.prefix + 'lib'
2. Make sure the libraries were built for the target platform (64 vs 32)
import platform
print platform.architecture()
See: http://yara-project.googlecode.com/svn/tags/yara-1.6.0
Modification of libyara (yara-1.6) to allow cleanup of search results:
>>>yara.h<<<
+ void yr_free_matches(YARA_CONTEXT* context);
>>>libyara.c<<<
+ void yr_free_matches(YARA_CONTEXT* context)
+ {
+ RULE* rule;
+ STRING* string;
+ MATCH* match;
+ MATCH* next_match;
+ rule = context->rule_list.head;
+ while (rule != NULL)
+ {
+ string = rule->string_list_head;
+
+ while (string != NULL)
+ {
+ match = string->matches_head;
+ while (match != NULL)
+ {
+ next_match = match->next;
+ yr_free(match->data);
+ yr_free(match);
+ match = next_match;
+ }
+ string->matches_head = NULL;
+ string->matches_tail = NULL;
+ string = string->next;
+ }
+ rule = rule->next;
+ }
+ }
Example rules folder:
./rules/hbgary/libs.yar ./rules/hbgary/compression.yar ./rules/hbgary/fingerprint.yar ./rules/hbgary/microsoft.yar ./rules/hbgary/sockets.yar ./rules/hbgary/integerparsing.yar ./rules/hbgary/compiler.yar ./rules/hbgary/antidebug.yar ./rules/example/packer_rules.yar Building a Rules object using yar.build_namespaced_rules with rules_rootpath set to './rules' will automatically load all of the above yar files into the following namespaces:: hbgary.libs hbgary.compression hbgary.fingerprint hbgary.microsoft hbgary.sockets hbgary.integerparsing hbgary.compiler hbgary.antidebug example.packer_rules
Simply kick off the scan module as main with -h to see how to run a scan:
> python -m yara.scan -h
List available modules:
> python -m yara.scan --list
Rules + hbgary.compiler
+ example.packer_rules
+ hbgary.sockets
+ hbgary.libs
+ hbgary.compression
+ hbgary.fingerprint
+ hbgary.integerparsing
+ hbgary.antidebug
+ hbgary.microsoft
> python -m yara.scan --list --whitelist=hbgary
Rules + hbgary.compiler
+ hbgary.sockets
+ hbgary.libs
+ hbgary.compression
+ hbgary.fingerprint
+ hbgary.integerparsing
+ hbgary.antidebug
+ hbgary.microsoft
Scan a process:
> ps
PID TTY TIME CMD
6975 pts/7 00:00:05 bash
13479 pts/7 00:00:00 ps
> sudo python -m yara.scan --proc 6975 > result.out
Rules + hbgary.compiler
+ example.packer_rules
+ hbgary.sockets
+ hbgary.libs
+ hbgary.compression
+ hbgary.fingerprint
+ hbgary.integerparsing
+ hbgary.antidebug
+ hbgary.microsoft
scan queue: 0 result queue: 0
scanned 1 items... done.
> ls -lah result.out
-rw-rw-r-- 1 mick mick 222K Sep 1 17:36 result.out
Scan files:
> sudo python -m yara.scan /usr/bin/ > result.out
Rules + hbgary.compiler
+ example.packer_rules
+ hbgary.sockets
+ hbgary.libs
+ hbgary.compression
+ hbgary.fingerprint
+ hbgary.integerparsing
+ hbgary.antidebug
+ hbgary.microsoft
scan queue: 0 result queue: 0
scanned 1518 items... done.
> ls -lah result.out
-rw-rw-r-- 1 mick mick 17M Sep 1 17:37 result.out
yara-ctypes is implemented to be compatible with Python 2.6+ and Python 3.x. It has been tested against the following Python implementations:
Ubuntu 12.04:
- CPython 2.7 (32bit, 64bit)
- CPython 3.2 (64bit)
- CPython 2.6 (32bit)
- CPython 2.7 (32bit)
- CPython 3.2 (32bit)
- PyPy 1.9.0 (32bit)
Windows 7:
- CPython 2.6 (32bit)
- CPython 3.2 (32bit)
Continuous integration testing is provided by Travis CI.
Source code for yara-ctypes is hosted on GitHub. Please file bug reports with GitHub's issues system.
