关于pe导出表的一个问题

mizihu 2011-10-23 10:15:40
罗云斌老师讲pe的导出表的时候有这么一段代码:
mov edi,@lpAddressOfNameOrdinals
repnz scasw
.if ZERO? ;找到函数名称
sub edi,@lpAddressOfNameOrdinals
sub edi,2
shl edi,1
add edi,@lpAddressOfNames

首先,由于AddressOfNameOrdinals指定的数组是word类型的,所以查找指令用的是scasw而不是scasb或scasd,当查找结束后,如果标志位为0则表示查找成功,这时edi的值指向找到的项目后面一个word的位置,将edi减去数组的基址并减去2(一个word的长度),得到的就是找到的项目的位置偏移。由于这个数组是word类型的,而AddressOfNames指向的数组是dword类型的,所以还要将偏移乘以2来修正一下(使用shl edi,1指令),用修正后的偏移在AddressOfNames表中就可以得到指向函数名称字符串的RVA了。

"由于这个数组是word类型的,而AddressOfNames指向的数组是dword类型的,所以还要将偏移乘以2来修正一下(使用shl edi,1指令)"这一句我没搞懂, 为什么通过shl 就可以将word类型修正成dword类型啊? 还请大家不吝赐教, 不胜感激.
...全文
57 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuirh 2011-10-25
  • 打赏
  • 举报
回复
这个edi就是一个指针的偏移,
如果是一个int类型的指针, 在偏移edi个位置的时候就是 offset_int = baseAddress + (4*edi),
如果是一个double类型的指针, 在偏移edi个位置的时候就是offset_double = baseAddress + (8*edi)

offset_double = offset_int * 2, 所以你上面的代码中要shl edi, 1

希望我说得够清楚, 楼主可以看懂.
G_Spider 2011-10-23
  • 打赏
  • 举报
回复
word类型偏移->dword类型偏移
0,2,4,6,...对应0,4,8,12,...
所以还要将偏移乘以2来修正.
shl edi,1指令,逻辑左移1,相当于乘2.

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧