• 逆向初级-硬编码(六)


    6.1.前缀指令

    1、硬编码的结构
    image
    2、前缀指令是分组的

    <1> LOCK和REPEAT前缀指令:
    	LOCK			FO
    	REPNE/REPNZ 	F2
    	REP/REPZ		F3
    <2> 段前缀指令:
    	CS(2E)
    	SS(36)
        DS(3E)
        ES(26)
        FS(64)
        GS(65)   
    <3>操作数宽度前缀指令
    	66
    <4>地址宽度前缀指令。
    	67
    
    

    6.2.经典定长指令_修改ERX

    image
    不包含Eb,Gb,说明是定长指令;

    包含Eb,Gb,说明是变长指令

    1、PUST/POP
    image
    DTDebug中安Ctrl+E快捷键测试
    image
    2、INC/DEC

    0x40 - 0x47    INC ERX     加1
    0X48 - 0X4F    DEC ERX	   减1
    

    测试
    image
    3、MOV Rb,Ib

    0xb0 - 0xb7      MOV Rv,Ib     //后面跟1个字节的立即数
    

    4、MOV ERX,Id

    0xb8 - 0xbF	      MOV ERX,Id    //后面跟4个字节的立即数
    

    image
    5、XCHG EAD,ERX

    0x90 - 0x97 XCHG EAX,ERX
    

    image

    6.3.经典定长指令_修改EIP

    1、0x70 - 0x7F
    image
    2、0x0F 0x80 - 0x0F 0x8F
    image
    image
    3、其它指令
    image
    image

    4、其它指令
    image

    6.4.经典变长指令_ModRM

    1、经典变长指令_ModR/M

    0x88	MOV Eb,Gb		G:通用寄存器
    0x89	MOV EV,GV		E:寄存器/内存
    0x8A	MOV GB,Eb		b:字节
    0X8B	MOV Gv,EV		v:Worder,duubleword or quadword
    

    当指令中出现内存操作对象的时候,就需要在操作码后面附加一个字节来进行补充说明,这个字节被称为ModR/M,该字节的8个位被分成了三部分
    image
    Mod(第6,7位)和R/M(第0,1,2位)共同描述指令中的E部分,即寄存器/内存
    image
    2、当Mod = 00时,ModR/M字节通过寄存器直接进行内存寻址

    例如当操作指令为88 01时,其对应的汇编为MOV BYTE PTR DS:[ECX], AL

    88 是操作指令,其后跟随的01为ModR/M
    image
    0x88描述了操作数宽度为b(byte),且操作数的顺序为Eb Gb,所以这条汇编指令为MOV BYTE PTR DS:[ECX], AL

    同理可以分析出如下操作指令对应的汇编指令
    image
    3、当Mod = 01时,ModR/M字节通过寄存器+I8进行内存寻址(I为立即数,即8位立即数)

    例如当操作指令为88 41 12时,其对应的汇编为MOV BYTE PTR DS:[ECX+12],AL

    88 是操作指令,其后跟随的41为ModR/M
    image
    所以这条汇编指令为MOV BYTE PTR DS:[ECX+12],AL

    同理可以分析出如下操作指令对应的汇编指令
    image
    4、当Mod = 10时,ModR/M字节通过寄存器+I32进行内存寻址

    例如当操作指令为88 81 12 34 56 78时,其对应的汇编为MOV BYTE PTR DS:[ECX+78563412],AL

    88 是操作指令,其后跟随的81为ModR/M
    image
    所以这条汇编指令为MOV BYTE PTR DS:[ECX+78563412],AL
    同理可以分析出如下操作指令对应的汇编指令

    image
    5、当Mod = 11时,ModR/M字节直接操作两个寄存器

    例如当操作指令为88 C1时,其对应的汇编为MOV CL,AL

    88 是操作指令,其后跟随的C1为ModR/M
    image
    所以这条汇编指令为MOV CL,AL

    同理可以分析出如下操作指令对应的汇编指令
    image

    6.5.经典变长指令_Reg/Opcode

    image
    上一节中,3-5位用来标识寄存器,Mod字段 与 R/M字段共同用来标识寄存器与内存。但3-5字段,并不仅仅用来标识寄存器,有些时候,用来标识Opcode。

    参见Table A-2中
    image
    80 81 82 83 这几个编码,并没有明确给出具体的操作码是什么。

    特别说明:凡是出现Grp的,均参见TableA-6
    image
    举例说明:80 65 08 FF

    1.第一个字节为80 查Table-2表,得到对应结构:Eb,Ib

    2.第二个字节为ModR/M字段,所以拆分65:

    ​ 01 100 101

    Mod 与 R/M字段 查Table2-2 得到对应的结构:[EBP+DIS8]

    3.100 字段 查表TableA-6 得到对应操作码为:AND
    image
    4.最终指令格式

    AND [ebp+dis8],Ib

    AND BYTE PTR SS:[EBP+08],0xFF
    image

    6.6.经典变长指令_SIB字段

    ModR/M字段是用来进行内存寻址的,可当地址形如DS:[EAX + ECX*2 + 12345678]时,仅仅靠ModR/M字段,是描述不出来的。这时就在ModR/M后面增加一个SIB字节,与ModR/M字段共同描述。

    下图是上两节没有涉及到的三种情况
    image
    这三种情况表示,在ModR/M字节后,还紧跟着一个SIB字节。SIB字节的8个位被分成了三部分:
    image
    举例说明:88 84 48 12 34 56 78

    1.第一个字节为88 查Table-2表,得到对应结构:MOV Eb,Gb
    image
    2.第二个字节为ModR/M字段,所以拆分84:

    ​ 01 000 010
    image
    如果查看ModR/M结果是[--][--]+dis8,则还需要一个字节(SIB)来确定[--][--]里面的内容

    3.SIB字节48分析
    image
    Base + Index*2Scale (Scale描述2Scale,所以只能为 *1 *2 *4 *8)

    48拆分:01 001 000

    [EAX + EXC*2]
    image
    4.结果

    88 84 48 12 34 56 78 对应汇编 MOV BYTE PTR DS:[EAX+ECX*2+78563412],AL
    image

    作者:zhang_derek

    个性签名:其实人跟树一样,越是向往高处的阳光,它的根就越要伸向黑暗的地底。

  • 相关阅读:
    Windows phone 墓碑机制的一些源码
    关于Image一些比较抽象的东西(Build Type与 同步以及异步加载的差异)
    自定义控件之Button控件的自定义
    Java集合最全解析,学集合,看这篇就够用了!!!
    看完让你彻底搞懂Websocket原理
    别人的前途我不敢决定
    花一年的时间让自己过得像个人样
    开篇
    你看得懂吗?
    反思
  • 原文地址:https://www.cnblogs.com/derek1184405959/p/14674362.html
Copyright © 2020-2023  润新知