Didier Stevens

Monday 16 December 2019

Analyzing .DWG Files With Embedded VBA Macros

Filed under: maldoc,Malware — Didier Stevens @ 0:00

AutoCAD’s drawing files (.dwg) can contain VBA macros. The .dwg format is a proprietary file format. There is some documentation, for example here.

When VBA macros are stored inside a .dwg file, an OLE file is embedded inside the .dwg file. There’s a quick-and-dirty way to find this embedded file inside the .dwg file: search for magic sequence D0CF11E0.

My tool cut-bytes.py can be used to search for the first occurrence of byte sequence D0CF11E0 and extract all bytes starting from this sequence until the end of the .dwg file. This can be done with cut-expression [D0CF11E0]: and pipe the result into oledump.py, like this:

Next, oledump can be used to conduct the analysis as usual, for example by extracting the VBA macro source code:

There is also a more structured approach to locate the embedded OLE file inside a .dwg file. When one looks at a .dwg file with a hexadecimal editor, the following can be seen:

First there is a magic sequence identifying this as a .dwg file: AC1032. This sequence varies with the file format version, but since many, many years, it starts with AC10. You can find more details regarding this magic sequence here and here.

At position 0x24 (36 decimal), there is a 32-bit little-endian integer. This is a pointer to the embedded OLE file (this pointer is NULL when no OLE file with VBA macros is embedded).

In our example, this pointer value is 0x00008080. And here is what can be found at this position inside the .dwg file:

First there is a 16-byte long header. At position 8 inside this header, there is a 32-bit little-endian integer that represents the length of the embedded file. 0x00001C00 in our example. And after the header one can find the embedded OLE file (notice magic sequence D0CF11E0).

This information can then be used to extract the OLE file from the .dwg like, like this:

Achieving exactly he same result as the quick-and-dirty method. The reason we don’t have to figure out the length of embedded OLE the file using the quick-and-dirty method, is that oledump ignores all bytes appended to an OLE file.

I will adapt my oledump.py tool to extract macros directly from .dwg files, without the need of a tool like cut-bytes.py, but I will probably implement something like the quick-and-dirty method, as this method would potentially work for other file formats with embedded OLE files, not only .dwg files.

 

7 Comments »

  1. Please also add support for Microstation MVBA files which also is OLE format.

    Comment by Otofoto — Monday 16 December 2019 @ 17:23

  2. I can take a look if you provide me a sample.

    Comment by Didier Stevens — Monday 16 December 2019 @ 17:25

  3. […] Blog post: Analyzing .DWG Files With Embedded VBA Macros […]

    Pingback by Analyzing .DWG Files With Embedded VBA Macros – Didier Stevens Videos — Wednesday 18 December 2019 @ 22:42

  4. […] new version of oledump adds option -f to find embedded ole files, making the analysis of .DWG files with embedded VBA macros (for example) […]

    Pingback by Update: oledump.py Version 0.0.44 | Didier Stevens — Thursday 19 December 2019 @ 0:00

  5. […] Analyzing .DWG Files With Embedded VBA Macros […]

    Pingback by Overview of Content Published in December | Didier Stevens — Wednesday 1 January 2020 @ 0:00

  6. For example this mvba macro – https://communities.bentley.com/products/microstation/w/askinga/1036/populate-file-properties-with-this-macro

    Comment by Oto — Friday 5 February 2021 @ 19:28

  7. Thanks, I’ll take a look.

    Comment by Didier Stevens — Friday 5 February 2021 @ 19:32


RSS feed for comments on this post. TrackBack URI

Leave a Reply (comments are moderated)

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Blog at WordPress.com.