



That is, every assembly language instruction has a corresponding machine language instruction so it's fairly trivial to disassemble the machine language and convert it to assembly language. There is a one-to-one relationship between assembly language and machine language (the hex file). So, if you find a readable string you can read it, or you can change it with the hex editor. You can open any file in a Hex Editor and the Hex Editor will show the ASCII character for any values that can be converted to text (including values that don't represent text). In other words, the hex code is meaningless unless you know what the machine language is. C/C++ is portable (with some limitations) so you can compile a C/C++ program to run on an Arduino, PC, or Mac, but the machine language hex code only runs on the machine it's intended for. (Or, they steal the source code or simply copy the hex code.) Realistically, when people do "reverse engineering", they usually figure-out what the code is doing and they start-over and write a new program that does he same thing.
