首页
社区
课程
招聘
[旧帖] 对lea 不甚理解 0.00雪花
发表于: 2008-8-14 23:22 4212

[旧帖] 对lea 不甚理解 0.00雪花

2008-8-14 23:22
4212
看雪crackme中有如下代码

00401548  |> BF BC020000    MOV EDI,2BC
0040154D  |. BE 30000000    MOV ESI,30
00401552  |. B8 48000000    MOV EAX,48
00401557  |. 99             CDQ
00401558  |. F7FB           IDIV EBX
0040155A  |. 29C6           SUB ESI,EAX
0040155C  |. 8D34B6         LEA ESI,DWORD PTR DS:[ESI+ESI*4]
0040155F  |. 29F7           SUB EDI,ESI
00401561  |. 6BFF 6B        IMUL EDI,EDI,6B
00401564  |. 81EF 6CCF0000  SUB EDI,0CF6C

对  LEA ESI,DWORD PTR DS:[ESI+ESI*4]  
执行后  ESI = ESI+ESI*4
这句不太理解。

lea 将源操作数给出的有效地址传送到指定的的寄存器中 后 寄存器中是一个数据,还是地址?
也就是说 将 传过去的 有效地址 当什么用?

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

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
2
opcode 8D是LEA
ModR/M 34是ESI并且后续接了一个SIB字节
SIB    B6是ESI+ESI*4

LEA和MOV的区别就是前者传递是地址,而后者传递的是该地址指向的数据
这个传入ESI的地址单独而言可能没有意义
但结合上下文很可能是用于指针的相对地址,例如*(ptr+i*5)
2008-8-14 23:31
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习了`````
2008-8-15 00:05
0
雪    币: 254
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
没错,这命令有点特别,好像以前有人讨论过好激烈。
有中括号括起来的,直接把结果送过去,
没括号的就把地址送过去

个人理解
2008-8-15 02:22
0
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
5
楼上的理解是针对mov的,lea是load effective address的缩写,这条指令是用来计算第二个操作数的有效地址并存入第一个操作数内,因此只是传递指针并不会传递指针指向的数据
2008-8-15 02:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
楼上可否帮个忙  
将这段代码执行后 EDI的计算式写出来  以方便我好好分析一下,感谢。
0401548  |> BF BC020000    MOV EDI,2BC
0040154D  |. BE 30000000    MOV ESI,30
00401552  |. B8 48000000    MOV EAX,48
00401557  |. 99             CDQ
00401558  |. F7FB           IDIV EBX
0040155A  |. 29C6           SUB ESI,EAX
0040155C  |. 8D34B6         LEA ESI,DWORD PTR DS:[ESI+ESI*4]
0040155F  |. 29F7           SUB EDI,ESI
00401561  |. 6BFF 6B        IMUL EDI,EDI,6B
00401564  |. 81EF 6CCF0000  SUB EDI,0CF6C
2008-8-15 09:13
0
雪    币: 6092
活跃值: (654)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
7
http://www.pediy.com/bbshtml/BBS5/pediy50552.htm

http://bbs.pediy.com/showthread.php?s=&threadid=31840
自己去看
人家哪有时间帮你看原理和运算
如果你连自己看的兴趣都没有
告诉你答案 你会有兴趣吗
你连探索的意思都没有
求的结果 你的感觉是什么
2008-8-15 09:59
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
0040155C  |. 8D34B6         LEA ESI,DWORD PTR DS:[ESI+ESI*4]
个人觉得是把ESI+ESI*4所指向地址的数据长度给ESI
2008-8-15 10:28
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
7楼的批评有点自以为是了吧!
答案我有 只是和自己做出来的不一样 才有了上面的请求。
不是想和你争辩,只是想为自己澄清一下。。。。
2008-8-15 13:46
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
10
http://bbs.pediy.com/showthread.php?t=40504
第3帖
2008-8-15 13:59
0
雪    币: 107
活跃值: (13)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
你这段少了ebx的值,LEA ESI,DWORD PTR DS:[ESI+ESI*4]是可以的,将5*esi的值直接传给esi。
00401548  |> BF BC020000    MOV EDI,2BC
0040154D  |. BE 30000000    MOV ESI,30
00401552  |. B8 48000000    MOV EAX,48 //以上是三个常数
00401557  |. 99             CDQ //双字扩展
00401558  |. F7FB           IDIV EBX //48/ebx,商入ex, 余数入dx//(注)如果ebx=6,那么运算后eax=C.
0040155A  |. 29C6           SUB ESI,EAX //esi=esi-eax (注)esi=30-C=24
0040155C  |. 8D34B6         LEA ESI,DWORD PTR DS:[ESI+ESI*4] //esi=5*esi=5*(esi-eax) (注):esi=5*24=B4
0040155F  |. 29F7           SUB EDI,ESI //edi=edi-esi=edi-5*(esi-eax) (注):edi=2BC-B4=208
00401561  |. 6BFF 6B        IMUL EDI,EDI,6B //edi=edi*6B=[edi-5*(esi-eax)]*6B (注)edi=208*6B=D958
00401564  |. 81EF 6CCF0000  SUB EDI,0CF6C //edi=edi-0CF6C=[edi-5*(esi-eax)]*6B-0CF6C (注)edi=D958-CF6C=9EC(十进制就是2540)
2008-8-15 15:39
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
12
[QUOTE=锐捷技术;496708]0040155C  |. 8D34B6         LEA ESI,DWORD PTR DS:[ESI+ESI*4]
个人觉得是把ESI+ESI*4所指向地址的数据长度给ESI[/QUOTE]

esi = esi * 5

lea是专业计算这类公式的
2008-8-15 17:19
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
感谢11楼的兄弟!!!
2008-8-15 19:29
0
游客
登录 | 注册 方可回帖
返回
//