
Winstrument is a framework of modular scripts to aid in instrumenting Windows software using Frida for reverse engineering and attack surface analysis.
Winstrument é um framework de scripts modulares para auxiliar na instrumentação de software Windows usando Frida para engenharia reversa e análise de superfície de ataque.
Este projeto suporta python 3.7. Supondo que você já tenha Python e pip instalados, simplesmente:
pip install winstrument
e, em seguida, para executar o programa, execute:
winstrument
Observe que a ferramenta é atualmente experimental e pode, às vezes, congelar ou apresentar outros problemas de estabilidade.
Em alguns casos, como em uma instalação nova do Windows 10, você pode encontrar um erro de SSL no pip ao instalar o Frida. Se isso acontecer, consulte Solução de Problemas abaixo.
Para executar o REPL do winstrument, basta executar winstrument.
Aqui está um exemplo rápido de instrumentação do notepad.exe com o módulo registry. Para informações completas sobre os comandos disponíveis na CLI, veja a seção CLI abaixo.
PS C:\winstrument> winstrument
> set target C:\Windows\System32\notepad.exe
> use registry
> run
Spawned 1144
instrumented process with pid: 1144 and path: C:\Windows\System32\notepad.exe
<User closes notepad from GUI>
detached from 1144 for reason process-terminated
> show registry
module time target function hkey subkey value
-------- ----------------- ------------------------------- ---------------- ------------------ --------------------------------------------------------------------------- ---------------------------------
registry 2019-08-19 07:03:07 C:\Windows\System32\notepad.exe RegGetValueW 0x2f4 SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize AppsUseLightTheme
<...>
No exemplo acima, o usuário indica o processo alvo, neste caso notepad.exe. Em seguida, ele indica que deseja usar o módulo registry, que enumera chamadas de sistema relacionadas ao registro feitas pelo programa. Depois que o processo termina (o usuário fecha o Bloco de Notas), a saída armazenada pode ser visualizada usando show registry.
O arquivo python principal winstrument.py inicializa o dispositivo Frida e gera uma instância do processo alvo.
cmdline.py fornece uma interface de linha de comando usando cmd2. Este é o ponto de entrada principal do script quando o Winstrument é executado diretamente da linha de comando. Os comandos estão documentados abaixo.
Em seguida, ele percorre cada módulo habilitado, instancia-o e chama o método load_scripts() do módulo para instrumentar o processo.
Por fim, ele chama get_output() e on_finish() para cada módulo ao ser desanexado do alvo.
Os módulos estão contidos em arquivos .py no diretório modules/. Um módulo consiste em uma subclasse de base_module.BaseInstrumentation que define o código a ser injetado, o tratamento de mensagens para esse código injetado e a saída.
As APIs dos módulos são definidas mais adiante na seção "Módulos" abaixo.
Cada módulo armazena metadados, como sua descrição, em modules/metadata.toml. A seção deve ser encabeçada pelo nome do módulo (sem diferenciar maiúsculas de minúsculas).
Por exemplo, aqui está a seção correspondente ao módulo dlls:
[DLLS]
description = """Hooks LoadLibrary-family system calls and outputs DLL loads where part of the search path might be
writable by the current user or a low-privileged user group."""
O programa armazena as configurações em settings.toml em %APPDATA%/winstrument.
Como a maioria, se não todos, os módulos injetarão Javascript no processo alvo, o diretório modules/js/ contém trechos de Javascript do Frida que são carregados e injetados pelos módulos.
Esses arquivos devem ter o mesmo nome do módulo, ou seja, o módulo dlls.py usaria o JS de js/dlls.js.
Conforme descrito acima, cada módulo é uma subclasse de BaseInstrumentation de base_module.py
Cada módulo deve definir seu nome (o nome dos arquivos python e js sem a extensão) como um atributo estático de classe chamado modulename.
Os módulos podem usar ou sobrescrever os seguintes métodos de BaseInstrumentation:
__init__(self,*args,**kwargs) - Além de qualquer código de inicialização específico do módulo, este construtor deve chamar super().__init__(*args,**kwargs).load_script(self) - Este método geralmente não precisa ser sobrescrito, pois a implementação em BaseInstrumentation deve ser suficiente para a maioria dos casos de uso. Para capturar eventos do Frida, sobrescreva register_callbacks() em vez disso. load_script deve ser usado para carregar o arquivo javascript a ser instrumentado, chamar session.create_script do Frida, adicionar quaisquer callbacks desejados e, em seguida, chamar o método load() do objeto do script para instrumentar.register_callbacks(self) - Chamado por BaseInstrumentation.load_script antes de carregar o script no processo alvo. Usado para registrar eventos como _session.on('message') etc. A versão adiciona um hook para on_message por padrão.O shell do Winstrument fornece os seguintes comandos:
list - Exibe todos os módulos disponíveis e carregadosload <modulename>/use <modulename> - Habilita o módulo com o nome fornecidounload <modulename> - Desabilita o módulo com o nome fornecidoset [setting [value]] - Sem argumentos, exibe todas as configurações e seus valores. Com um argumento, exibe o valor de setting. Com dois argumentos, define setting como value. As configurações persistem entre várias execuções.show [modulename [format]] - Exibe a entrada armazenada de modulename no format especificado. Execute sem argumentos para ver uma lista de formatadores.info <modulename> - Imprime uma descrição do módulo com o nome fornecido.Isso parece ocorrer principalmente em uma instalação nova do Windows. O setup.py do Frida tenta baixar um arquivo .egg de https://files.pythonhosted.org. Em alguns casos, isso falha porque o certificado SSL desse domínio não é verificado. Isso parece ser um efeito colateral da forma como o Windows carrega as CAs raiz. O Windows parece não incluir todas as CAs raiz em uma instalação padrão, preferindo, em vez disso, baixá-las conforme necessário quando sites são visitados. Como resultado, a CA raiz que assinou o certificado SSL de files.pythonhosted.org pode não estar no armazenamento de confiança do sistema.
Para resolver esse problema, visite https://files.pythonhosted.org manualmente no Edge ou no Chrome para fazer o Windows adicionar a CA raiz ao seu armazenamento de confiança e, em seguida, tente pip install novamente.
Observe que visitar a página no Firefox não funcionará, porque o Firefox usa seu próprio armazenamento de confiança em vez do armazenamento do sistema.
Winstrument é licenciado sob GPLv3. Para mais detalhes, consulte o arquivo LICENSE.
BaseInstrumentationwrite_message(message) recebe uma mensagem semelhante a JSON como um dict, grava-a no banco de dados sqlite e a salva para ser exibida posteriormente.post_load(self) Chamado por BaseInstrumentation.load_script após o script ser carregado dentro do processo alvo. Isso poderia ser usado, por exemplo, para chamar métodos rpc exportados pelo script.get_output(self) - Chamado pelo script principal quando o alvo é desanexado. Este método deve retornar uma lista, onde cada entrada é um objeto MoudleMessage (de data/module_message.py). Geralmente não precisa ser sobrescrito.on_message(self,message,data) - Callback para lidar com o evento message do frida, que é acionado por send no JS injetadoon_finish(self) - Callback chamado pelo script principal quando o alvo se torna desanexado. Execute aqui quaisquer operações de limpeza necessárias.runq/quit/exit - Sai da CLI (obviamente).