
Um Plugin Interativo de Patching Binário para o IDA Pro

Patching de código assembly para alterar o comportamento de um programa existente não é incomum em análise de malware, engenharia reversa de software e domínios mais amplos de pesquisa em segurança. Este projeto estende o popular descompilador IDA Pro para criar um fluxo de trabalho de patching binário interativo mais robusto, projetado para iteração rápida.
Este projeto é atualmente alimentado por um fork menor do onipresente Keystone Engine, suportando patching para x86/x64 e Arm/Arm64, com planos de habilitar as arquiteturas restantes do Keystone em uma versão futura.
Agradecimentos especiais à Hex-Rays pelo suporte ao desenvolvimento deste plugin.
Este plugin requer IDA 7.6 e Python 3. Ele suporta Windows, Linux e macOS.
Por favor, note que versões mais antigas do IDA (8.2 e anteriores) não são compatíveis com Python 3.11 e superiores.
Execute a seguinte linha no console do IDA para instalar automaticamente o plugin:
import urllib.request as r; exec(r.urlopen('https://github.com/gaasedelen/patching/raw/main/install.py').read())
import urllib.request as r; exec(r.urlopen('https://github.com/gaasedelen/patching/raw/main/install.py', cafile='/etc/ssl/cert.pem').read())
Alternativamente, o plugin pode ser instalado manualmente baixando o pacote distribuível do plugin para sua respectiva plataforma na página de releases e descompactando-o na sua pasta de plugins.
É fortemente recomendado que você instale este plugin no diretório de plugins do usuário do IDA:
import ida_diskio, os; print(os.path.join(ida_diskio.get_user_idadir(), "plugins"))
O plugin de patching será carregado automaticamente para arquiteturas suportadas (x86/x64/Arm/Arm64) e injetará ações de patching relevantes no menu de contexto do botão direito das visualizações de desmontagem do IDA:

Uma listagem completa das ações contextuais de patching é descrita nas seções seguintes.
O diálogo principal de patching pode ser iniciado através da ação Montar no menu de contexto do botão direito. Ele simula uma visualização básica de desmontagem do IDA que pode ser usada para editar uma ou várias instruções em rápida sucessão.

A linha de montagem é um campo editável que pode ser usado para modificar instruções em tempo real. Pressionar enter confirmará (patch) a instrução inserida no banco de dados.
Sua localização atual (também conhecida como cursor) será sempre destacada em verde. Instruções que serão sobrescritas como resultado do seu patch/edição serão destacadas em vermelho antes de confirmar o patch.

Finalmente, as teclas de seta UP e DOWN podem ser usadas enquanto o foco ainda está no campo de texto editável de montagem para mover rapidamente o cursor para cima e para baixo na visualização de desmontagem sem usar o mouse.
A ação de patching mais comum é NOPear (NOP out) uma ou mais instruções. Por esta razão, a ação NOP estará sempre visível no menu de botão direito para acesso rápido.

Instruções individuais podem ser NOPeadas, assim como um intervalo selecionado de instruções.
Forçar um salto condicional a sempre executar um caminho 'bom' é outra ação comum de patching. O plugin só mostrará esta ação ao clicar com o botão direito em uma instrução de salto condicional.

Se você nunca quiser que um salto condicional seja tomado, você pode simplesmente NOPeá-lo!
Patches podem ser salvos (aplicados) a um executável selecionado através do submenu de patching a qualquer momento. A ação de aplicar rapidamente torna ainda mais rápido salvar patches subsequentes usando as mesmas configurações.

O plugin também fará um esforço ativo para reter um backup (.bak) do executável original, que ele usa para aplicar 'limpiamente' o conjunto atual de patches do banco de dados durante cada salvamento.
Finalmente, se você alguma vez não estiver satisfeito com um patch, pode simplesmente clicar com o botão direito nos blocos de instruções patcheados (amarelos) para revertê-los ao seu valor original.

Embora seja 'fácil' reverter bytes ao seu valor original, pode ser 'difícil' restaurar a análise ao seu estado anterior. Reverter um patch pode ocasionalmente exigir correções manuais adicionais.
cpp::like::symbols(...) / IDBs (muito instável no momento)Tempo e motivação permitindo, trabalhos futuros podem incluir:
xor eax, eax; ret;)Pretty: mov [rsp+48h+dwCreationDisposition], 3
Raw: mov [rsp+20h], 3
Eu aceito contribuições externas, issues e pedidos de funcionalidades. Por favor, faça qualquer pull request para o branch develop deste repositório se quiser que sejam considerados para um lançamento futuro.