  Deep learning has demonstrated its strengths in numerous binary analysis
tasks, including function boundary detection, binary code search, function
prototype inference, value set analysis, etc. When applying deep learning to
binary analysis tasks, we need to decide what input should be fed into the
neural network model. More specifically, we need to answer how to represent an
instruction in a fixed-length vector. The idea of automatically learning
instruction representations is intriguing, however the existing schemes fail to
capture the unique characteristics of disassembly. These schemes ignore the
complex intra-instruction structures and mainly rely on control flow in which
the contextual information is noisy and can be influenced by compiler
optimizations.
  In this paper, we propose to pre-train an assembly language model called
PalmTree for generating general-purpose instruction embeddings by conducting
self-supervised training on large-scale unlabeled binary corpora. PalmTree
utilizes three pre-training tasks to capture various characteristics of
assembly language. These training tasks overcome the problems in existing
schemes, thus can help to generate high-quality representations. We conduct
both intrinsic and extrinsic evaluations, and compare PalmTree with other
instruction embedding schemes. PalmTree has the best performance for intrinsic
metrics, and outperforms the other instruction embedding schemes for all
downstream tasks.
