/ / Analisando dados de objetos serializados Java não confiáveis ​​- java, serialização, serialização de objetos

Analisando Dados do Objeto Serializado Java Não Confiável - Java, Serialização, Serialização de Objetos

Preciso analisar objetos serializados Java não confiáveis. Os dados são fornecidos a mim como uma matriz de bytes (escrita em algum momento por ObjectOutputStream).

eu faço não deseja simplesmente chamar ObjectInputStream.readObject () e / ou carregar o objeto real. Estou procurando uma maneira de analisar com segurança os bytes e obter nomes e valores de campos.

--

Aqui está um pequeno resumo da minha tentativa até agora, depois de dar uma olhada no Procedimento ObjectInputStream para desserializar objetos.

Tentei extrair tipos / nomes de campos (comocadeias unicode) recursivamente com base nas constantes de fluxo esperadas. Termino com uma lista de nomes de campos cujos valores devem aparecer na matriz de bytes em ordem. Fico desconfortável com essa abordagem porque provavelmente é de buggy. Especialmente adaptado para o que parece ser protocolos de serialização individuais seguidos por HashMap, ArrayList, etc. Mas pode funcionar, se eu conseguir descobrir uma maneira de ler os bytes que representam valores de campo:

Eu posso tentar ler e armazenar primitivas com base emtamanho / deslocamento, mas quando encontro meu primeiro objeto, fica um pouco mais complicado - não há uma maneira clara de distinguir entre quais bytes estão associados a quais valores (sem realmente carregar o objeto da maneira que provavelmente o ObjectInputStream provavelmente faz? )

--

Alguém pode sugerir uma solução em potencial que eu obviamente estou procurando, ou uma biblioteca confiável que pode ajudar a analisar os dados serializados sem carregando objetos?

Obrigado pela leitura e por todos os comentários / sugestões !!! Peço desculpas se algo não está claro e ficaria feliz em esclarecer se você concorda comigo.

Respostas:

2 para resposta № 1

Você não pode fazer isso em princípio. Qualquer classe Java pode assumir sua própria serialização e gravar dados arbitrários no fluxo que somente ele sabe analisar e reconstruir, por meio de código que é chamado apenas durante a desserialização.