Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
custom-bytecode-analyzer — Analisador de bytecode Java personalizável via regras JSON | Kitploit
Ferramentas/GitHubGitHub/fergarrui/custom-bytecode-analyzer
Análise EstáticaAnálise de VulnerabilidadesAnálise de CódigoAnálise de Binários
GitHubfergarrui/custom-bytecode-analyzer

custom-bytecode-analyzer

Analisador de bytecode Java personalizável via regras JSON

Ver Repositório

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
7312há 8 anosRevisado pelo Kitploit

custom-bytecode-analyzer

Analisador de bytecode Java customizável através de regras JSON. É uma ferramenta de linha de comando que recebe um caminho contendo um ou mais arquivos Jar ou War, os analisa usando as regras fornecidas e gera relatórios HTML com os resultados.

Build Status

Uso

root@kitploit:~
usage: java -jar cba-cli.jar [OPTIONS] -a DIRECTORY_TO_ANALYZE
 -a,--analyze <pathToAnalyze>    Caminho do diretório para executar a
                                 análise.
-c,--checks <checks...>          Lista separada por espaços de verificações
                                 personalizadas que serão executadas na análise.
 -f,--custom-file <customFile>   Especifica um arquivo em formato JSON para
                                 executar regras personalizadas. Leia mais em
                                 https://github.com/fergarrui/custom-bytecode-analyzer.
 -h,--help                       Exibe esta mensagem.
 -i,--items-report <maxItems>    Número máximo de itens por relatório. Se o
                                 número de problemas encontrados exceder este
                                 valor, o relatório será dividido em diferentes
                                 arquivos. Útil se forem esperados muitos
                                 problemas no relatório. Padrão: 50.
 -o,--output <outputDir>         Diretório para salvar o relatório. Aviso -
                                 se já houver relatórios salvos neste
                                 diretório, eles serão sobrescritos.
                                 O padrão é "report".
 -v,--verbose-debug              Aumenta a verbosidade para modo debug.
 -vv,--verbose-trace             Aumenta a verbosidade para modo trace - torna-o mais lento, use apenas quando necessário.

Regras JSON personalizadas

O arquivo de regras pode ser especificado usando o argumento -f,--custom-file. O arquivo está no formato JSON e possui a seguinte estrutura:

  • rules : array(regra)
    • name : string
    • fields : array(campo)
      • visibility : (public|protected|private)
      • type : string
      • valueRegex : string (expressão regular java) - suportado apenas se o campo for final
      • nameRegex : string (expressão regular java)
      • report : boolean (padrão: true)
    • interfaces : array(string)
    • superClass : string
    • annotations : array(anotação)
      • type : string
      • report : boolean (padrão: true)
    • methods : array(método)
      • name : string
      • visibility : (public|protected|private)
      • parameters : array(parâmetro)
        • type : string
        • report : boolean (padrão: true)
        • annotations : array(anotação)
          • type : string
          • report : boolean (padrão: true)
      • variables : array(variável)
        • type : string
        • nameRegex : string (expressão regular java)
        • annotations : array(anotação)
          • type : string
          • report : boolean (padrão: true)
        • report (padrão: true)
      • annotations : array(anotação)
        • type : string
        • report : boolean (padrão: true)
      • report : boolean (padrão: true)
    • invocations : array(invocação)
      • owner : string
      • method : método
        • name : string
        • visibility : (public|protected|private)
      • from : método
        • name : string
        • visibility : (public|protected|private)
      • notFrom : método
        • name : string
        • visibility : (public|protected|private)
      • report : boolean (padrão:true)

Você também pode consultar net.nandgr.cba.custom.model.Rules.java para ver a estrutura em código Java.

Exemplos

Já existem várias regras no diretório examples . De qualquer forma, abaixo estão listados exemplos para cada regra.

Encontrar desserialização personalizada

Se precisarmos encontrar classes com desserialização personalizada, podemos fazê-lo facilmente. Uma classe define desserialização personalizada implementando private void readObject(ObjectInputStream in). Portanto, precisamos apenas encontrar todas as classes onde esse método está definido. Bastaria definir uma regra como:

root@kitploit:~
{
	"rules": [{
		"name": "Desserialização personalizada",
		"methods": [{
			"name": "readObject",
			"visibility": "private",
			"parameters" : [{
         "type" : "java.io.ObjectInputStream"
      }]
		}]
	}]
}

Isso reportará métodos com visibilidade private, nome readObject e um parâmetro do tipo java.io.ObjectOutputStream. Parâmetros são um array; se mais de um for especificado, todos devem corresponder para serem reportados. Como temos apenas uma regra, será criado um relatório chamado: custom-deserialization-0.html.

Encontrar serialização e desserialização personalizadas

Neste caso, uma regra com dois métodos deve ser definida. A mesma do exemplo anterior para desserialização, e uma nova para corresponder a private void writeObject(ObjectOutputStream out). Conforme mostrado na estrutura JSON acima, a propriedade rules.rule.methods é um array de métodos, então podemos escrever uma regra assim:

root@kitploit:~
{
  "rules": [{
    "name": "Serialização e desserialização personalizadas",
    "methods": [{
      "name": "readObject",
      "visibility": "private",
      "parameters" : [{
       "type" : "java.io.ObjectInputStream"
      }]
    },{
      "name": "writeObject",
      "report": "false",
      "visibility": "private",
      "parameters" : [{
        "type" : "java.io.ObjectOutputStream"
      }]
    }]
  }]
}

A propriedade report foi definida como false para evitar reportar duas vezes a mesma regra. Estamos usando o segundo método apenas como condição, mas reportar apenas os métodos readObject deve ser suficiente para o propósito desta regra.

Encontrar todas as definições de métodos

Se uma propriedade não for definida, ela sempre corresponderá como verdadeiro. Por exemplo, esta regra retornaria todas as definições de métodos:

root@kitploit:~
{
	"rules": [{
		"name": "Definições de métodos",
		"methods": [{
		}]
	}]
}

Encontrar invocações do método String.equals

Invocações de métodos também podem ser encontradas. O JSON neste caso seria:

root@kitploit:~
{
	"rules": [{
		"name": "String equals",
		"invocations": [{
			"owner": "java.lang.String",
			"method": {
				"name": "equals"
			}
		}]
	}]
}

A propriedade owner especifica a classe que contém o método.

Invocação de método por reflexão

Outro exemplo de invocação de método um pouco mais útil que o anterior:

root@kitploit:~
{
	"rules": [{
		"name": "Invocação de método por reflexão",
		"invocations": [{
			"owner": "java.lang.reflect.Method",
			"method": {
				"name": "invoke"
			}
		}]
	}]
}

Encontrar instanciações de String

É o mesmo que qualquer invocação de método, mas o nome do método neste caso deve ser <init>.

root@kitploit:~
{
  "rules": [{
    "name" : "Instanciação de String",
    "invocations" : [{
        "owner" : "java.lang.String",
        "method" : {
          "name" : "<init>"
        }
    }]
  }]
}

Esta regra encontrará ocorrências de:

root@kitploit:~
[...]
String s = new String("foo");
[...]

Uso de desserialização

Neste exemplo, queremos encontrar usos de desserialização (não classes que definem comportamentos de serialização como nos exemplos anteriores). A desserialização ocorre quando ObjectInputStream.readObject() é invocado. Por exemplo, neste trecho de código:

root@kitploit:~
ObjectInputStream in = new ObjectInputStream(fileInputStream);
Object o = in.readObject();

Portanto, precisamos encontrar invocações de método de ObjectInputStream chamado readObject. Mas isso encontrará muitos falsos positivos em um contexto de pesquisa, porque quando uma classe define desserialização personalizada, ela faz uma invocação a este método dentro de um método private void readObject(ObjectInputStream in), e isso poluiria demais o relatório. Se quisermos excluir esses casos e manter apenas a desserialização genuína, a propriedade notFrom pode ser usada:

root@kitploit:~
{
	"rules": [{
		"name": "Uso de desserialização",
		"invocations": [{
			"owner": "java.io.ObjectInputStream",
			"method": {
				"name": "readObject"
			},
			"notFrom": {
				"name": "readObject",
				"visibility": "private"
			}
		}]
	}]
}

Este arquivo encontrará invocações de java.io.ObjectInputStream.readObject() se a invocação não for feita dentro do método private void readObject(ObjectInputStream in).

Uma classe compilada com este código não será reportada:

root@kitploit:~
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
      Object o = in.readObject();
}

Mas esta será reportada:

root@kitploit:~
public Object deserializeObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
      Object o = in.readObject();
      return o;
}

A propriedade from pode ser definida em invocações exatamente da mesma forma que notFrom, mas o resultado será o oposto: só corresponderá se a invocação for feita a partir do método definido.

Java servlets

A propriedade superClass pode ser usada neste caso. Se quisermos encontrar todas as classes que estendem javax.servlet.http.HttpServlet, uma regra pode ser:

root@kitploit:~
{
  "rules": [{
    "name": "Java servlets",
    "superClass" : "javax.servlet.http.HttpServlet"
  }]
}

Implementações de interfaces

Uma regra pode ser escrita para encontrar classes que implementam um array de interfaces. Se mais de uma interface for definida na regra, a classe deve implementar todas elas para ser reportada. Se quisermos encontrar classes que implementam javax.net.ssl.X509TrustManager, a regra seria:

root@kitploit:~
{
  "rules": [{
    "name": "Implementações de X509TrustManager",
    "interfaces" : ["javax.net.ssl.X509TrustManager"]
  }]
}

Observe que interfaces é um array, portanto certifique-se de adicionar as strings entre colchetes, ex: ["interface1", "interface2", ...].

Encontrar endpoints Spring

Anotações também são suportadas. Múltiplas propriedades de anotações podem ser definidas em uma regra (encontrando anotações de classe), em métodos ou variáveis (parâmetros ou variáveis locais). Se todas forem encontradas na classe analisada, ela será reportada. Por exemplo, se quisermos encontrar endpoints Spring, procuraríamos por classes ou métodos anotados com org.springframework.web.bind.annotation.RequestMapping. Então, a regra pode ser:

root@kitploit:~
{
  "rules": [{
    "name": "Endpoint Spring - anotação de classe",
    "annotations" : [{
      "type" : "org.springframework.web.bind.annotation.RequestMapping"
    }]
  },
  {
     "name": "Endpoint Spring - anotação de método",
     "methods" : [{
        "annotations" : [{
          "type" : "org.springframework.web.bind.annotation.RequestMapping"
        }]
      }]
  }]
}

Encontrar campos

A propriedade rule.fields pode ser usada para encontrar campos de classe. Se quisermos encontrar campos String privados com nomes de senha, uma regra como esta poderia ser usada:

root@kitploit:~
{
  "rules": [{
    "name" : "Campos de senha",
    "fields" : [
      {
        "visibility" : "private",
        "type" : "java.lang.String",
        "nameRegex" : "(password|pass|psswd|passwd)"
      }
    ]
  }]
}

Encontrar variáveis

Para encontrar variáveis, rule.variables pode ser usado. Esta propriedade reportará variáveis locais e variáveis de argumentos de métodos. Se quisermos encontrar todas as variáveis do tipo javax.servlet.http.Part, uma regra poderia ser:

root@kitploit:~
{
  "rules": [{
    "name" : "Arquivo de upload Servlet",
    "methods" : [{
      "variables" : [{
          "type" : "javax.servlet.http.Part"
      }]
    }]
  }]
}

Definir múltiplas regras

Múltiplas regras podem ser definidas no mesmo arquivo JSON. Elas serão processadas e reportadas separadamente e não afetarão umas às outras. Podemos combinar alguns dos exemplos anteriores:

root@kitploit:~
{
	"rules": [{
		"name": "Desserialização personalizada",
		"methods": [{
			"name": "readObject",
			"visibility": "private",
			"parameters": [{
        "type" : "java.io.ObjectInputStream"
      }]
		}]
	},{
		"name": "Invocação de método por reflexão",
		"invocations": [{
			"owner": "java.lang.reflect.Method",
			"method": {
				"name": "invoke"
			}
		}]
	}]
}

Aqui, temos duas regras ("Desserialização personalizada" e "Invocação de método por reflexão"). Elas serão processadas como se fossem duas execuções separadas. E um relatório por regra será gerado. Se as regras tiverem o mesmo nome, elas serão reportadas no mesmo arquivo.

Regras Java personalizadas

O projeto pode ser baixado e compilado para adicionar regras personalizadas mais complexas em código Java que não são cobertas pelo formato JSON. Já existem três exemplos no pacote net.nandgr.cba.visitor.checks. São eles CustomDeserializationCheck, DeserializationCheck e InvokeMethodCheck. Você pode criar suas próprias regras estendendo net.nandgr.cba.custom.visitor.base.CustomAbstractClassVisitor.

Relatórios

Como mencionado acima, os relatórios são criados por padrão na pasta report. Cada regra terá um arquivo separado, a menos que tenham o mesmo nome. Se o relatório for muito grande, você pode dividi-lo usando o parâmetro -i,--items-report <maxItems>; cada um conterá o argumento especificado ou menos (se for o último). Cada item reportado especifica o jar onde foi encontrado, o nome da classe e o nome do método (se relevante). Também mostra a versão decompilada da classe para facilitar uma verificação visual rápida. Exemplo de como os itens são mostrados para uma regra que encontra instanciações de java.io.File:

Exemplo de relatório

Grafo de chamadas

Ao pesquisar por bugs de segurança, é muito útil ter um grafo de chamadas. Atualmente, um arquivo simples compatível com DOT é criado no diretório report. O grafo contém todos os fluxos possíveis a partir dos quais os problemas encontrados podem ser invocados. Por exemplo, se uma regra para encontrar desserialização for usada, será gerado um grafo contendo todos os caminhos possíveis que levam ao método que chama a desserialização.

O arquivo é call-graph.dot e teria a seguinte aparência (este é um exemplo extremamente simples):

root@kitploit:~
graph callGraph {
"demo.callgraph.Class1:method1" -- "demo.callgraph.Class2:method2"
"demo.callgraph.Class3:method3" -- "demo.callgraph.Class2:method2"
}

Para exibi-lo visualmente, DOT pode ser usado (ou qualquer software compatível). Por exemplo, para converter o arquivo para svg:

root@kitploit:~
dot -Tsvg call-graph.dot -o call-graph.svg

Isso é feito automaticamente por padrão se o DOT for encontrado no PATH do sistema. Caso contrário, o DOT pode ser instalado em sistemas baseados em Debian usando sudo apt-get install graphviz.

Isso criará um arquivo SVG chamado call-graph.svg que pode ser convertido para PNG ou visualizado usando programas como inkscape ou apenas firefox.

Um exemplo muito simples do arquivo call-graph.dot acima seria:

Exemplo de grafo

Existem algumas limitações, como por exemplo, se o item pesquisado estiver em um método java.lang.Runnable.run() ou similar, não encontrará de onde a thread foi executada. Além disso, o grafo está limpando ciclos para evitar StackOverflowErrors; isso é feito de maneira um pouco conservadora para que a memória do sistema não seja drenada durante a análise de um diretório grande.

Mais opções serão adicionadas em versões futuras.

Exemplos de linha de comando

Executar uma análise usando um arquivo JSON

root@kitploit:~
java -jar cba-cli-<version>.jar -a /caminho/com/jars -f /caminho/com/arquivo/json/regras.json

Executar uma análise usando uma regra Java personalizada

Para usar regras Java personalizadas, os nomes das classes devem ser especificados como argumentos de -c.

root@kitploit:~
java -jar cba-cli-<version>.jar -a /caminho/com/jars -c DeserializationCheck

Aceita uma lista separada por espaços, então múltiplas regras personalizadas podem ser definidas (cada regra criará um relatório separado):

root@kitploit:~
java -jar cba-cli-<version>.jar -a /caminho/com/jars -c DeserializationCheck InvokeMethodCheck CustomDeserializationCheck SuaRegraPersonalizada

Combinar regras JSON e Java personalizadas

root@kitploit:~
java -jar cba-cli-<version>.jar -a /caminho/com/jars -f /caminho/com/arquivo/json/regras.json -c SuaRegraPersonalizada1 SuaRegraPersonalizada2

Aumentar verbosidade

Para encontrar erros, a verbosidade pode ser aumentada. Nível de debug:

root@kitploit:~
java -jar cba-cli-<version>.jar -a /caminho/com/jars -c SuaRegraPersonalizada1 -v

Nível de trace:

root@kitploit:~
java -jar cba-cli-<version>.jar -a /caminho/com/jars -c SuaRegraPersonalizada1 -vv

Analisar APKs Android

No momento, o APK deve ser convertido para JAR primeiro para ser analisado.

  • Baixe o dex2jar: https://github.com/pxb1988/dex2jar
  • Converta DEX para JAR
    • d2j-dex2jar.sh -f -o app_to_analyze.jar app_to_analyze.apk
  • Execute o cba-cli.jar normalmente, passando como parâmetro -a o diretório contendo o arquivo jar convertido.

Compilar e executar o projeto

Já existe um arquivo jar executável no diretório bin em: https://github.com/fergarrui/custom-bytecode-analyzer/blob/master/bin/cba-cli-0.1-SNAPSHOT.jar . Se você quiser fazer modificações ou adicionar regras personalizadas, o projeto pode ser compilado fazendo:

root@kitploit:~
git clone https://github.com/fergarrui/custom-bytecode-analyzer.git
cd custom-bytecode-analyzer
mvn clean package

Dois jars serão gerados na pasta target. cba-cli-<version>.jar contém todas as dependências e é executável. Pode ser executado usando java -jar cba-cli-<version>.jar

Baixar ferramenta