E, cá entre nós, foi a melhor coisa que fiz. Rodei o Speakeay no macOS e curti bastante a quantidade de recursos e possibilidades que ele traz. Vou contar aqui rapidinho o que rolou. ?
Instalação
O processo de instalação foi bem fácil:
git clone https://github.com/fireeye/speakeasy.git cd speakeasy python3 -m pip install -r requirements.txt python3 setup.py install
Uso
Invocando o script principal sem nenhum argumento, damos de cara com o help do programa:
$ python3 run_speakeasy.py usage: run_speakeasy.py [-h] [-t TARGET] [-o OUTPUT] [-p [PARAMS [PARAMS ...]]] [-c CONFIG] [-m] [-r] [-a ARCH] [-d DUMP_PATH] [-q TIMEOUT] [-z DROP_FILES_PATH] [-l MODULE_DIR] Emulate a Windows binary with speakeasy optional arguments: -h, --help show this help message and exit -t TARGET, --target TARGET Path to input file to emulate -o OUTPUT, --output OUTPUT Path to output file to save report -p [PARAMS [PARAMS ...]], --params [PARAMS [PARAMS ...]] Commandline parameters to supply to emulated process (e.g. main(argv)) -c CONFIG, --config CONFIG Path to emulator config file -m, --mem-tracing Enables memory tracing. This will log all memory access by the sample but will impact speed -r, --raw Attempt to emulate file as-is with no parsing (e.g. shellcode) -a ARCH, --arch ARCH Force architecture to use during emulation (for multi-architecture files or shellcode). Supported archs: [ x86 | amd64 ] -d DUMP_PATH, --dump DUMP_PATH Path to store compressed memory dump package -q TIMEOUT, --timeout TIMEOUT Emulation timeout in seconds (default 60 sec) -z DROP_FILES_PATH, --dropped-files DROP_FILES_PATH Path to store files created during emulation -l MODULE_DIR, --module-dir MODULE_DIR Path to directory containing loadable PE modules. When modules are parsed or loaded by samples, PEs from this directory will be loaded into the emulated address space [-] No target file supplied Destaque para as opções -z e -d que prometem salvar os arquivos criados pelo programa e um dump de memória do processo, respectivamente.
Emulando um executável PE
O Speakeasy ainda não é perfeito. Emulei vários binários, mas a maioria tinha uma ou outra função da API do Windows ainda não suportada pelo programa. Um exemplo é o nosso desafio AnalyseMe-03, que gerou a seguinte saída:
$ python3 run_speakeasy.py -t ~/Downloads/AnalyseMe-03.exe 0x40101e: 'KERNEL32.GetCommandLineA()' -> 0x40b0 0x40105c: 'KERNEL32.GetStartupInfoA(0x1211fa0)' -> None 0x401102: 'KERNEL32.GetProcessHeap()' -> 0x4120 0x401109: 'KERNEL32.HeapAlloc(0x4120, 0x8, 0x80)' -> 0x4140 0x40108d: 'KERNEL32.GetModuleHandleA(0x0)' -> 0x400000 0x40135e: 'KERNEL32.CreateFileA("C:\\Program Files\\Oracle\\VirtualBox Guest Additions\\DIFxAPI.dll", "GENERIC_READ", 0x1, 0x0, "OPEN_EXISTING", 0x80, 0x0)' -> 0xffffffff 0x40138f: 'KERNEL32.CreateFileA("C:\\windows\\System32\\Drivers\\Vmmouse.sys", "GENERIC_READ", 0x1, 0x0, "OPEN_EXISTING", 0x80, 0x0)' -> 0xffffffff 0x4011fe: 'wininet.InternetOpenA("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)", 0x1, 0x0, 0x0, 0x0)' -> 0x20 Caught error: unsupported_api Invalid memory read (UC_ERR_READ_UNMAPPED) Unsupported API: wininet.InternetOpenUrlA * Finished emulating Tudo bem. O software é livre, então eu posso ir lá e adicionar suporte à InternetOpenUrlA da wininet.dll, caso eu realmente precise. E mesmo assim, o Speakeasy foi capaz de emular várias outras funções, que já me dizem o que o binário faz. Achei que os seguintes recursos valem o destaque:
Fácil instalação. Multiplataforma. Pode ser usada como biblioteca em Python. Exemplos. Suporta shellcode. Emula drivers em ring0. Por ser emulador, dispensa SO e virtualizador. Cria um dump de memória. Salva os arquivos criados. Sem dúvida um software impressionante, principalmente se o utilizamos com foco em famílias de malware em específico. Pode salvar muitas horas de análise. ?
Pontaço para a FireEye de novo, que mês passado, diga-se de passagem, lançou o capa, que cobri no canal. Já são duas ferramentas que entraram pro meu dia a dia na análise de binários de Windows.