【S02E03】Shark恒 零基础逆向分析教程之图文!【走向大牛②】
我们在计算注册码时经常要用到传送指令。所以我们就先学学数据传送指令。其他相关指令在用到的时候用“汇编金手指”查一下大概意思。数据传送数据MOV,MOVZX,MOVSX,XCHG,PUSH, POP, PUSHA,POPA,PUSHAD,POPAD
MOV命令使用格式:MOV目的操作数,源操作数
源操作数传送到目的操作数
MOVSX 寄存器,寄存器/存储器将源操作数传送到目的操作数中, 如果源操作数的位数小于目的操作数的话, 目的操作数的高位用源操作的符号位填补。
MOVZX 寄存器/存储器MOVZX与 MOVSX 功能差不多,唯一不同就是当源操作数的位数少于目的操作数位时, 目的操作数的高位用 0 填补
下面看看图片的详细解释:
拿90举例看看
一步一步详细分析看看,还是拿90举例。第一步是将90传送到AL寄存器中(即AX低8位寄存器)
然后将AL中的数据传送到BX寄存器中,空位用F填充。
然后也是将AL中的数据传送BX寄存器中,但空位是用零填充。
再然后是将AL寄存器中的内容传送到ECX寄存器中,空位同样用F填充。
再在然后同样是将AL寄存器中的内容传送到ECX寄存器中,但空位同样是用零填充。
然后看看XCHG命令使用格式:
XCHG 目的操作数,源操作数把源操作数和目的操作数互换。说明:XCHG指令与 MOV 指令功能上有2点不同。1是这个指令不允许使用立即数和段寄存器作为操作数
2是这个指令改变源操作数的内容
下图内容是:
eax 赋值11111111
ebx 赋值22222222
然后将两个寄存器的内容互换。请注意寄存器窗口。
下面是PUSH和POP命令 这两个命令是对应的。他们的使用格式是:PUSH 操作数POP 操作数PUSH是将操作数压栈,何为压栈?其实“栈空间”就是数据空间,也是存放数据用的,和数据段区别就在于,先进入栈的数据会被后进入栈的数据压在底下,从而栈空间就有了“先进后出”的原则。大家可以思考一下,不管你入栈多少数据,你需要其中的一个数据,那就需要一层一层的出栈。那面看看截图。
我们先入栈11112222
然后又入栈33334444
然后又入栈55556666
现在出栈操作,请看第四行,同时注意寄存器窗口的EAX。
然后执行第五行,同样注意相对应的寄存器变化。
然后执行第六行,同样注意相对应的寄存器变化。
现在是不是明白“先进后出”是怎么回事了?
那现在来讲讲我们脱壳时候经常看到了PUSHAD和POPAD
PUSHAD是将 8 个32位通用寄存器的内容顺序入栈。
入栈顺序是EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI
这时候入栈的ESP数据是执行PUSHAD之前的值。执行该指令后,ESP 值减 32 (十进制32)
POPAD是将当前堆栈内容顺序弹出,ESP 也恢复原来的值,即加32
那下面看看操作截图吧
前7行指令,我们把除ESP之外的7个寄存器都赋值,方便新手观察。
注意右侧,已经复制成功。然后我们在第8行执行了PUSHAD。
看下面的堆栈窗口,已经按照顺序入栈了。
然后我们把除ESP之外的7个寄存器都赋值为0,方便新手观察。
这里执行完第8行执行,所有数据已经不是0了,已经从堆栈中恢复回来了。
注意ESP变化,ESP也已经回复到原来的数值了。
然后是PUSHA与POPA,其实都一样,只不过就是16位的。
入栈顺序是:AX,CX,DX,BX,SP,BP,SI,DI,执行完成后同样SP 值减 16 (十进制16)POPA也是和32位一样,只不过SP不是加32,而是加16。
OK,今天就讲到这里吧,图文真的太费劲了,我都想放弃讲汇编了,真不如做视频,越往后图文越麻烦。
如果是视频的话,几句话就讲完了。图文我却用了半个多小时……
前排继续学习!~{:5_117:}
大神作品全部收录 准备闭关修炼{:5_117:}
我真觉得用视频,口说的方法讲出来更容易明白,图文看了一头雾水。每个词汇都要慢慢去理解啊!{:5_123:}
认真学习中
一头雾水- -{:5_117:}
好帖,必须顶!
如果鲨鱼哥制作第二季视频就好了{:6_224:}
这个容易一点
恒大,确实图文,你制作的费事,我们新手看起来也费事,出视频最好了,嘻嘻。
说实话,我确实也没太明白,估计能看懂3成。