There are two main methods that I have seen. Many programs consist of several small parts that are dynamically loaded at run time, often these files are simply replaced with newer versions. Because updates often only affect a relatively small number of these files, a patch may be a small subset of the entire application. Another method that I have seen used in large monolithic applications is to actually modify the executable code using some kind of binary diff. One of the drawbacks of this approach is that it is more difficult to maintain an upgrade to a new version from a version with multiple versions earlier without having to perform each incremental update.
source
share