
Ferramenta IDAPython para criação automática de tabelas virtuais C++ no IDA Pro
Virtuailor é uma ferramenta IDAPython que reconstrói vtables para código C++ escrito para arquitetura Intel, tanto código de 32 bits quanto 64 bits e AArch64 (Novo!). A ferramenta é composta por 2 partes, estática e dinâmica.
A primeira é a parte estática, contendo as seguintes capacidades:
A segunda é a parte dinâmica, contendo as seguintes capacidades:
O Virtuailor agora suporta versões do IDA de 7.0 até a versão mais recente (7.5). Se você estiver usando versões do IDA anteriores à 7.4, precisará mudar para o branch beforeIDA-7.4; o branch master suporta a versão mais recente disponível (7.5).
if __name__ == '__main__':
start_addr_range = idc.MinEA() # Você pode alterar a faixa de endereços das chamadas virtuais
end_addr_range = idc.MaxEA()
add_bp_to_virtual_calls(start_addr_range, end_addr_range)
Opcional, mas extremamente recomendado, crie um snapshot do seu idb. Basta pressionar ctrl+shift+t e criar um snapshot.
Pressione File->Run script... então vá para a pasta do Virtuailor e escolha executar Main.py. Você pode ver o gif a seguir para uma explicação visual mais clara.

Agora a GUI fornecerá uma opção para escolher uma faixa a ser alvo; caso queira segmentar todo o binário, basta pressionar OK com os valores padrão nos endereços inicial e final.
Depois disso, os breakpoints serão colocados no seu código e tudo o que você precisa fazer é executar seu código com o depurador do IDA, realizar as ações desejadas e observar como as vtables estão sendo construídas! Para AArch64, você pode configurar um servidor gdb remoto e depurar usando o depurador do IDA.
Caso não queira mais/precise dos breakpoints, basta ir até a aba de lista de breakpoints no IDA e excluí-los como desejar.
Também é realmente importante para mim notar que esta é a segunda versão da ferramenta com suporte a 32 e 64 bits e aarch64; provavelmente em alguns casos uma pequena quantidade de breakpoints será perdida. Nesses casos, por favor, abra uma issue e entre em contato comigo para que eu possa melhorar o código e ajudar a corrigi-lo. Desde já, obrigado por isso :)
As estruturas que o Virtuailor cria a partir da vtable usada em chamadas virtuais que foram atingidas. As funções da vtable são extraídas da memória com base no registrador relevante usado no opcode do BP.
Como eu queria criar uma correlação entre a estrutura no IDA e as vtables na seção de dados, o BP altera o nome do endereço da vtable na seção de dados para o nome da estrutura. Como pode ser visto na imagem a seguir:

Os nomes das funções virtuais também são alterados, exceto em situações onde os nomes não são os nomes padrão do IDA (funções com símbolos ou funções que o usuário alterou); nesses casos, os nomes das funções permanecerão os mesmos e também serão adicionados à estrutura da vtable com seu nome atual.
Os nomes escolhidos são construídos usando o seguinte padrão:
Após criar a vtable, o Virtuailor também adiciona uma conexão entre a estrutura criada e o assembly, como pode ser visto nas imagens a seguir:

P.S.: O offset de estrutura usado no BP é relevante apenas para a última chamada feita; para obter uma melhor compreensão de todas as chamadas virtuais feitas, o recurso de xref foi adicionado, conforme explicado na próxima seção
Ao fazer engenharia reversa de C++ estaticamente, não é trivial ver quem chamou quem, pois a maioria das chamadas são indiretas; no entanto, após executar o Virtuailor, toda função que foi chamada indiretamente agora possui um xref para esses locais.
O gif a seguir mostra os xrefs adicionados com sua chamada de função indireta:

A ferramenta foi apresentada na RECon Brussels, Troopers e Warcon. A apresentação pode ser encontrada no seguinte link: https://www.youtube.com/watch?v=Xk75TM7NmtA
Equipes da REcon Brussels, Troopers, Warcon, Nana, @tmr232, @matalaz, @oryandp, @talkain, @shiftreduce
O plugin é licenciado sob a licença GNU GPL v3.