Reverse Engineering Windows Defender's Antivirus Emulator

mak

Соломенные сандалии
Администратор
Сообщения
1 024
Реакции
1 357
Tools for instrumenting Windows Defender's mpengine.dll
This repository contains code that I wrote to help with my reverse engineering of Windows Defender Antivirus' binary emulator, complimentary to my presentations on the emulator at Black Hat USA 2018 and DEF CON 26.

Slides: https://i.blackhat.com/us-18/Thu-Au...ring-Windows-Defenders-Antivirus-Emulator.pdf
Videos: https://media.defcon.org/DEF CON 26...rse-Engineering-Windows-Defender-Demo-Videos/


My code is built on top of Tavis Ormandy's loadlibrary (https://github.com/taviso/loadlibrary) project. In order to work with my code, you'll need to pull down a copy of loadlibrary, and then apply my patches to the project.

Bash:
$ git clone https://github.com/taviso/loadlibrary
$ cd loadlibrary
$ git apply OutputDebugStringAHook.patch
$ make

[Follow Tavis's instructions about setting up mpengine.dll - make sure you have the 6/25/2018 build
Dumping symbols from IDA is nice for debugging, but is not necessary for this code to work]

$ ./mpclient OutputDebugStringADemo.exe
[+] mpengine.dll base at 0xf5e66008
[+] Setting hooks and resolving offsets
[+] Parameters<1>::Parameters<1> RVA: 0x46e5d5 Address: 0xf62d45dd
[+] pe_read_string_ex: RVA: 0x3e59f3 Address: 0xf624b9fb
[+] OutputDebugStringA FP: RVA: 0x01af88 Address: 0xf637c7a8
[+] OutputDebugStringA FP replaced: 0x804ea80
[+] Done setting hooks and resolving offsets!
main(): Scanning /mnt/hgfs/sharemp/windows_only/OutputDebugStringADemo.exe...
EngineScanCallback(): Scanning input
[+] OutputDebugStringA(pe_vars_t * v = 0x0xf5c3c008)
[+] Params[1]: 0x402010
[+] OutputDebugStringA: "This is coming from inside the emulator!"
IMPORTANT: The offsets contained in this project are specific to the 6/25/2018 32-bit mpengine.dll build, MD5=e95d3f9e90ba3ccd1a4b8d63cbd88d1b. If you are using a different version of mpengine.dll, you'll need to locate these offsets yourself. It's easiest to wait for Microsoft to publish mpengine.dll PDBs with symbols, but it can be done easily without them.

Note that the included patches only contain my OutputDebugStringA hooking code. This will let you experiment with the engine and reproduce some of the demos I have shown. Implementing more advanced functionality demonstrated in my presentation is left as an exercise to the reader, eg: building a fuzzer, supporting format string-based output, dumping out arbitrary non-string buffers, hooking ExitProcess to understand when emulation is ending, or collecting coverage with a customized Lighthouse Pintool (https://github.com/gaasedelen/lighthouse).
 

Sp1n

Мудрец
Сообщения
177
Реакции
96
mak

> где ты уже дал развёрнутый ответ.

Плохо описаны два нюанса, это исполняемый флоу и захват стека, впрочем это все логично. При захвате ссылок на стеке нужно знать размер фрейма, соотв мониторить процедур. ветвления. Инструкция может читать стек не явно(без mrm, за исключением строковых и xlat) через pop, либо прямо. При этих событиях нужно восстановить ссылки, это на счет техники.
По флоу примеры - фаулты или отличный пример с тем нелинейным буфером. Статический флоу(cfg) не соотв. динамическому(xfg), так управление из области передается на ее начало без ветвлений в cfg. При трансляции будет несоответствие и cfg и xfg, тк код перемещен в памяти.

Остальное все далее чисто тесты, статистика по дроблении ссылок, по их сложению, разделение арг ссылками и тп, для этого нужно полноценное наследование всех наборов инструкций.

Это что хотел добавить.
 
Верх Низ