Quick summary of DFHack history:
It started out as a memory I/O library - you loaded a DLL and it gave you functions for retrieving the addresses of important variables (from a "memory.xml" file, whose contents were very similar to what Dwarf Therapist currently contains in its INI files) and other functions to read/write them, and over time it got extended to add high-level functionality to make utilities simpler. It worked sort of like a debugger, reading and modifying DF's memory from outside the process, making it rather slow (a Reveal on a full-sized map could take several seconds) and error-prone (if something went wrong, it could leave DF stuck in a "suspended" state, requiring a secondary utility to unlock it). It also had a history of setting off virus scanners. However, it had the benefit that you could update a utility to work with a newer version of DF just by editing memory.xml.
Later, after it was observed that certain operations like figuring out item types and materials was decidedly non-trivial (some values were at different addresses based on item type, and some could only be determined by executing code), we came up with the idea of injecting a DLL into DF's address space - with this, we could not only directly modify its internal memory as if it were our own (making certain operations massively faster, especially Reveal), but we could even execute DF's own code in order to perform complex operations that were otherwise very difficult (such as formatting item names exactly the same as they appear in-game). When this happened, we abandoned the idea of having offsets to individual fields and reverse-engineered all of the game's data structures (so we could access them in C++ as structs and classes), memory.xml became "symbols.xml" (containing only the locations of global variables), and the utilities all became "plugins" that were invoked from within the game from a special console window. This made some things a lot simpler, but it also meant that when newer versions of DF came out, DFHack and all of its plugins needed to be recompiled in order to handle new structure layouts (i.e. if new fields were added or old ones were removed).
The rest (Lua scripting, vtable interposing, etc.) has already been covered above.