Hardware breakpoints are based on eight registers that are not accessible from the user mode, which are DR0 to DR7.
These registers allow you to set a maximum of four breakpoints given specific addresses for read, write, or execute of 1, 2, or 4 bytes, starting from the given address. They are very useful as they don't modify the instruction bytes such as INT3 breakpoints to set, and they are much harder to detect (as these registers are not accessible for the program's assembly). However, they still could be detected and removed by the malware, which we will discuss in Chapter 5, Bypassing Anti-Reverse Engineering Techniques.
You can view them from the Debug menu by going to Hardware breakpoints, as shown in the following screenshot:
Figure 25: OllyDbg dialog window for hardware breakpoints