Race Vector and Dwarven Race Index:
0f bf 15 XX XX XX XX 66
85 d2 78 18 8b 0d VV VV VV VV a1 EE EE EE EE 29 c8 c1
Individually, these are not good patterns. Concatenated, they are okay but not great. There are two occurrences, both of which do point to the race vector and the dwarven race index. I am uncomfortable because it hardcodes both register allocation and a jump distance. If the compiler happens to do different optimizations to this function, the pattern will not match. Moreover, if the compiler happens to do different optimizations to an unrelated function, this pattern might get a false positive.
Creature Vector:
66 90 31 ed 8b 0d VV VV VV VV a1 EE EE EE EE 29 c8 c1
This one makes me very uncomfortable because it hardcodes a NOP used for alignment, an unrelated register used as a loop counter, and the registers used to reference the vector.
Language Vector:
20 8b 14 88 8b 0d VV VV VV VV a1 EE EE EE EE 89 4c 24
Again, I think this is a poor pattern. This one hardcodes the location of a stack variable, an unrelated multiplication, and the registers used to reference the vector.
Translation Vector:
57 74 08 90 8b 0d VV VV VV VV a1 EE EE EE EE 89 4c 24
This one hardcodes the location of a table in the code, a NOP used for alignment, and a stack variable. I think this one is a very poor pattern.
Overall, I recommend against putting any of these patterns into the DM detection code. They should be used under human supervision.
If you want, I will try to figure out some detection methods that are likely to be more stable. This will probably involve more than simple memory matching.