首页
社区
课程
招聘
[旧帖] [讨论][原创]关于对MOV(指令组)与LEA指令的讨论! 0.00雪花
发表于: 2008-8-11 12:30 9738

[旧帖] [讨论][原创]关于对MOV(指令组)与LEA指令的讨论! 0.00雪花

2008-8-11 12:30
9738
首先在这里喊句口号:中国加油!奥运加油!
     前几天在整理笔记,偶尔看到之前学破解时做的一下读书笔记,感觉对新手来说还是不错的
     接下来我给大家讲讲我几年前学汇编写的一些读书笔记,同时也给新手一些启发吧.
  
    关于对MOV指令组与LEA指令理解!

   相信大家在破解追码时,特别是追入算法时,经常会看到如下组合
mov ecx,dword ptr ss:[ebp-4]
movzx ecx,byte ptr ds:[ecx+edx-1] ;  逐位取"wangshuang"的每位ascii送到ecx
lea ecx,dword ptr ds:[ecx+ecx*4]    ;  ecx=ecx+4*ecx
lea ecx,dword ptr ds:[ecx+ecx*4]    ;  ecx=ecx+4*ecx
add ebx,ecx                                     ;  ebx=ebx+ecx(即等于971225+ecx)
add ebx,esi                                      ;  上面的值加上机器码
inc edx                                              ;  指向下一位字符(edx=edx+1)
dec eax                                             ;  字符长度减一(eax=eax-1)
jnz short Unpacked.0050EEAE         ;  循环取数

这个组合很经典,所以我们要充份理解每条指令的功能,在这里我只说说MOV 与LEA

*数值传送指令MOV
mov ecx,dword ptr ss:[ebp-4]
在上面指令中,目的操作数ECX为寄存器寻址 ,原源操作数我们统称之为存储器寻址
所以 我们在操作这条指令后 ECX 中的内容为SS段中偏移量为EBP-4的双字单元内容
这里我们可以得到MOV只是传送数据,注意该数据可以是个地址,可以是个数值,当我们
用D ECX时查看数据时,ECX中存的只是一个地址!

*装入有效地址指令LEA
  关于这条指令,实在对很多初学者来说,是非常难理解的
这里我把清华版[杨季文]的80X86中的关于该指令的重点写下来
LEA:有效地址传送指令
格式:LEA  REG,OPRT
  功能:该指令是把操作数OPRT的有效地址传送到操作数REG

请注意,LEA指令与把存储单元中的数据传送到寄存器的MOV指令有本质上的区别.
假设变量BUFFER的偏移是1234H,该字变量的值为5678H,那么在执行完指令
'LEA AX,BUFFER'后,AX寄存器中的值为1234H而不是5678H;
在执行完指令'MOV AX,BUFFER'后,AX寄存器中的值为5678H,而不是1234H.

书上说是非常明白,LEA指令是传送地址的,那么我们回来头看上面指令
lea ecx,dword ptr ds:[ecx+ecx*4]    ;  ecx=ecx+4*ecx
那么执行完上面指令时后,ecx里存的就是一个地址,在破解时,这个地址一般指向我们的真码和假码

我们有了这个认识后,请看到下面某软件关键算法指令组(算法片段取自[PYG]算法分析入门第五课)

/mov al,byte ptr ds:[ecx+ebp]    ;  逐位取注册名ascii
|and eax,7F                                 ;  上面取得值和7F做and运算
|imul eax,eax,82E3B                  ;  然后*82E3B
|mov esi,eax                               ;  送到esi保存
|mov eax,B81702E1                   ;  初始eax=B81702E1
|imul esi                                      ;  与esi的值相乘
|add edx,esi                               ;  edx=edx+esi
|sar edx,6                                  ;  edx的值算术右移6位后保存到edx
|mov eax,edx                            ;  送到eax
|shr eax,1F                               ;  逻辑右移1F位
|add edx,eax                            ;  edx=eax+edx
|inc ecx                                    ;  计数器加1
|cmp ecx,1E                              ;  和1E(即30)比较
|lea edi,dword ptr ds:[edi+edx+8>
\jl short x-cut.004014C7         ;  循环
mov eax,dword ptr ds:[415C54]    ;  假码16进制送到eax
pop ebp
cmp eax,edi                      ;  edi中的值转换成10进制就是你要的东西~~
je short x-cut.00401513          ;  ★★爆破点★★

细心的朋友 不难发现
上面红色示记的cmp eax,edi 的指令句语是个经典比较语句
而此时eax中是ds:[415C54]指向的双字数据
而edi中取放的是上面循环中lea edi,dword ptr ds:[edi+edx+8>执行后给edi传送一地址
一个是地址,一个是数,如何比较,在这里我也不知如何跟朋友们说,小弟不才,望请大家原谅!

本贴不段更新中......

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
2
lea edi,dword ptr ds:[edi+edx+8]

这样比较好学:
        lea 换成 mov 去掉中括号
变成 mov edi, edi+edx+8
2008-8-11 12:51
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=sessiondiy;495189]lea edi,dword ptr ds:[edi+edx+8]

这样比较好学:
        lea 换成 mov 去掉中括号
变成 mov edi, edi+edx+8[/QUOTE]

好像没有这种寻址方法吧?
2008-8-11 12:57
0
雪    币: 260
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼上的正解,LEA当MOV用。
2008-8-11 13:06
0
雪    币: 260
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
别看8086的寻址方式了,要看32位寻址。以下转自网络:
“在用16位寄存器来访问存储单元时,只能使用基地址寄存器(BX和BP)和变址寄存器(SI和DI)来作为地址偏移量的一部分,但在用32位寄存器寻址时,不存在上述限制,所有32位寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP)都可以是地址偏移量的一个组成部分。

当用32位地址偏移量进行寻址时,内存地址的偏移量可分为三部分:一个32位基址寄存器,一个可乘1、2、4或8的32位变址寄存器,一个8位/32位的偏移常量,并且这三部分还可进行任意组合,省去其中之一或之二。

32位基址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP;
32位变址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI和EBP(除ESP之外)。”
32位地址的寻址方式
2008-8-11 13:16
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
mov edi, edi+edx+8  在OD中测试不行而
mov edi, [edi+edx+8]就可以
2008-8-11 14:38
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
7
你没弄懂
常见于算法里的 lea edi, [edi+edx+8]
是要实现 edi = edi+edx+8
跟address无关. 亦即可看成 mov edi, edi+edx+8
你在 OD 输入 mov edi, edi+edx+8 当然不行

lea edi, [edi+edx+8]
看成
mov edi, edi+edx+8
是一种习惯. 再怎么变脑子都不用去想.
(lea -> mov 去掉括号)
2008-8-11 15:58
0
雪    币: 350
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
有些高级语言上的数据结构会被优化成类似的形式吧.
2008-8-11 19:08
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
学习了 谢谢楼主``` 
2008-8-12 09:08
0
游客
登录 | 注册 方可回帖
返回
//