1. 程式人生 > >Opcode解析方法

Opcode解析方法

asm

Opcode解析方法。
83C4 04 ADD
每條指令,開頭的字節不是前綴就是code域。

  1. 先取出opcode的第一個字節,判斷是code域還是前綴
  2. 如果是前綴,則繼續找下一個字節,再一次判斷是否code域函數前綴,因為一條指令中可能有多個前綴,但絕不會超過4個,如果超過了,就是一條無效指令。
  3. 如果證明就是code域的時候。
    3.1 找到code域對應的指令助記符,操作數個數,操作數的類型。
    3.2 如果含有Group,則用code域的值去Group中查找對應行,用指令的下一個字節,也就是ModR/M域定位Group中的列。
    最終得到: ADD Ev,Ib
  4. 如果存在ModR/M域, 則將code域的下一個1字節的值,去查找ModR/M表。如果存在前綴67,去16的ModR/M域表查找,如果沒有,則去32位的ModR/M查找。操作數中的E和M對應著ModR/M域表的左邊,G對應著ModR/M表的頂邊。
    第一個操作數:Ev
    E => ESP/SP/AH
    v => 依賴於操作數的大小(操作數指的是指令中的另一個操作數。)=> b => 字節 => AH
    Ev => AH
    第二個操作數:Ib
    I => 立即數
    b => 1個字節
    Ib => 04
    Add ah ,04

A1 78812801 MOV

  1. A1 => code => Mov Rax,Ov => 如果是32位匯編,rax需要改成eax
  2. Ov => [01288178]
  3. mov eax, [01288178]

8B 40 04
8B => Mov Gv,Ev
Gv => 40(ModR/M域) => eax

Ev => 40(ModR/M域) => [EAX]?disp8 => [eax+04(disp域)]
Mov eax,[eax+4]
?8B 04 85 04 00 00 00
8B => Mov Gv,Ev
Gv => 04(ModR/M域) => eax
Ev => 04(ModR/M域) => [--][--](SIB域:85)=> [eax4][00000004] => [eax4+4]
Mov eax,[eax*4+4]

A3 54812801 MOV
68 54812801 PUSH
8B0D 74812801 MOV
51 PUSH
68 48812801 PUSH

68 44812801 PUSH
68 40812801 PUSH
FF15 A4922801 CALL

技術分享圖片

Opcode解析方法