This document presents software techniques that can be used to ensure the confidentiality and integrity of code, data at rest, and data in use. After a general survey, more details are provided about the major software countermeasure techniques. The focus is then on combining and layering techniques to effectively safeguard both the confidentiality and integrity of software assets. Lastly, the document shows how software and hardware techniques can complement each other for achieving robust software security.