Pytaniex86 CMP Instrukcja Różnica
Jaki jest (nietrywialne) różnica między dwiema następującymi instrukcjami x86?
39 /r CMP r/m32,r32 Compare r32 with r/m32
3B /r CMP r32,r/m32 Compare r/m32 with r32
Tło
Buduję asembler Java, który będzie używany przez mojego języka pośredniego kompilatora produkować Windows 32 wykonywalnych.
Obecnie mam następujący kod:
final ModelBase mb = new ModelBase(); // create new memory model
mb.addCode(new Compare(Register.ECX, Register.EAX)); // add code
mb.addCode(new Compare(Register.EAX, Register.ECX)); // add code
final FileOutputStream fos = new FileOutputStream(new File("test.exe"));
mb.writeToFile(fos);
fos.close();
Do wyjścia prawidłowy plik wykonywalny, który zawiera dwa instrukcji CMP w tekście poprzecznym. Plik wykonywalny wypisany na "text.exe" nie zrobi nic ciekawego, ale nie o to chodzi. Klasa Compare
jest opakowaniem instrukcji CMP
.
Powyższy kod tworzy (kontroli z OllyDbg):
Address Hex dump Command
0040101F |. 3BC8 CMP ECX,EAX
00401021 |. 3BC1 CMP EAX,ECX
Różnica jest subtelna: jeśli używam 39
bajt opcodu:
Address Hex dump Command
0040101F |. 39C1 CMP ECX,EAX
00401021 |. 39C8 CMP EAX,ECX
co sprawia, że zastanawiam się o ich synonymity i dlaczego to nawet istnieje.
Te 1-bitowe stopnie swobody zapewniają również ukryty kanał dla kompilatorów do "telefonu domowego" - mogą "znakować" "binariami, które produkują, a sprzedawca kompilatorów może poprosić cię o wyjaśnienie, czy znajdują twoje oprogramowanie z ich znakiem wodnym, ale bez licencji na plik. –