Pozn .: Normálně se zabývám demontáží (tj. mnemotechnickými pomůckami) a vždy se dívám pouze na surové operační kódy, když se jim nemohu vyhnout.
Mám následující řádek demontáže režimu jádra Windows x64 ovladač, vytvořený IDA Pro 7.1.180227:
xor edx, edx
Nyní vím o tom, že toto je v přípravě předání druhého parametru funkci přes rdx
. Také vím, že záměrem tohoto kódu je nastavit uvedený argument ukazatele na NULL
.
Opcode je 33 D2
. A křížové odkazy, které s odkazem nebo jeho prohlížením v ODA, přinesou to samé jako u IDA: xor edx, edx
.
To, co mě na této demontáži svádí špatně, je to, že rdx
, jako nadmnožina edx
, se používá jinde na této přesné cestě kódu k ukládání dalších ukazatelů. Teoreticky by tedy horní dvojslovo rdx
mohlo být „špinavé“.
A vzhledem k tomu, že se jedná o kód x64, očekával bych, že bude číst
Nyní chápu, že podle oddílu 3.6.1 (tabulka 3-4) Intel SDM ( 05/2018) předpona REX.W operačního kódu může ovlivnit velikost operandu.
U tohoto operačního kódu není k dispozici předpona velikosti operandu (66h) ani předvolba velikosti adresy (67h).
Takže pokud jde o Intel SDM (část „XOR — Logical Exclusive OR“), měl bych se skutečně zabývat opcode 33 / r
nebo instrukcí XOR r32, r / m32
, což potvrzuje překlad IDAs operačního kódu. Odkaz na oddíl 2.1.5 („Kódování režimu adresování ModR / M a SIB bajtů“) Intel SDM nám dává představu o tom, jak je operand ( D2
) kódován, a tak nám dává , z tabulky 2-2 („32bitové adresovací formuláře s modulem ModR / M Byte“): EDX / DX / DL / MM2 / XMM2
jako operand.
Obrázky.
To by však znamenalo, že „špinavé“ horní dvojslovo v rdx
by nebylo vynulováno a tudíž by byl předán poškozený / zkrácený ukazatel. Vzhledem k tomu, že se jedná o kód režimu jádra, důsledky by měly být jasné.
Nemůžu uvěřit, že by kompilátor udělal takovou chybu. Co mi chybí ?