The document discusses software birthmarks, which are characteristics of a program that uniquely identify it. A birthmark can be used to detect software theft by searching for the birthmark of a plaintiff program in a suspected program. Specifically, the document discusses heap graph-based birthmarks, which are generated from a program's runtime heap structure and object references. A subgraph of the heap graph forms the birthmark. Subgraph monomorphism is used to search for the birthmark in a suspected program's heap graph to detect copying of code. Heap graph-based birthmarks are robust against attacks like code obfuscation that aim to disguise stolen code.