WEB开发网
开发学院网络安全黑客技术 压缩与脱壳-PE文件格式 四 阅读

压缩与脱壳-PE文件格式 四

 2007-01-12 20:12:08 来源:WEB开发网   
核心提示: ShowTheFunctions proc uses esi ecx ebx hDlg:DWORD, pNTHdr:DWORDLOCAL temp[512]:BYTE保留 512 字节堆栈空间用于字符串操作,invoke SetDlgItemText,hDlg,IDC_EDIT,0清除编辑
ShowTheFunctions proc uses esi ecx ebx hDlg:DWORD, pNTHdr:DWORD
LOCAL temp[512]:BYTE

保留 512 字节堆栈空间用于字符串操作。

invoke SetDlgItemText,hDlg,IDC_EDIT,0

清除编辑控件内容。

invoke AppendText,hDlg,addr buffer

将 PE 文件名插入编辑控件。 AppendText 通过传递一个 EM_REPLACESEL 消息以通知向编辑控件添加文本。然后它又向编辑控件发送一个设置了 wParam=-1 和 lParam=0 的 EM_SETSEL 消息,使光标定位到文本末。

mov edi,pNTHdr
assume edi:ptr IMAGE_NT_HEADERS
mov edi, [edi].OptionalHeader.DataDirectory[sizeof IMAGE_DATA_DIRECTORY].VirtualAddress

获取 import symbols 的 RVA 。 edi 起初指向 PE header ,以此我们可以定位到数据目录数组的第二个数组元素来得到虚拟地址值。

invoke RVAToOffset,pMapping,edi
mov edi,eax
add edi,pMapping

这儿对PE编程初学者来说可能有点困难。在PE文件中大多数地址多是RVAs 而 RVAs 只有当 PE 文件被 PE 装载器装入内存后才有意义。 本例中,我们直接将文件映射到内存而不是通过PE装载器载入,因此我们不能直接使用那些RVAs。必须先将那些RVAs转换成文件偏移量,RVAToOffset函数就起到这个作用。 这里不准备详细分析。指出的是,它还将给定的RVA和PE文件所有节的始末RVA作比较(检验RVA的有效性),然后通过 IMAGE_SECTION_HEADER 结构中的 PointerToRawData 域(当然是所在节的那个 PointerToRawData 域啦)将RVA转换成文件偏移量。

函数使用需要传递两个参数: 内存映射文件指针和所要转换的RVA。eax里返回文件偏移量。上面代码中,我们必须将文件偏移量加上内存映射文件指针以转换成虚拟地址。是不是有点复杂? :)

上一页  1 2 3 4  下一页

Tags:压缩 脱壳 PE

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接