news 2026/2/26 13:36:51

汇编语言全接触-54.PE教程5 Section Table(节表)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
汇编语言全接触-54.PE教程5 Section Table(节表)

请下载 范例。

理论:

到本课为止,我们已经学了许多关于 DOS header 和 PE header 的知识。接下来就该轮到 section table(节表)了。节表其实就是紧挨着 PE header 的一结构数组。该数组成员的数目由 file header (IMAGE_FILE_HEADER) 结构中 NumberOfSections 域的域值来决定。节表结构又命名为 IMAGE_SECTION_HEADER。

IMAGE_SIZEOF_SHORT_NAME equ 8

IMAGE_SECTION_HEADER STRUCT

Name1 db IMAGE_SIZEOF_SHORT_NAME dup(?)

union Misc

PhysicalAddress dd ?

VirtualSize dd ?

ends

VirtualAddress dd ?

SizeOfRawData dd ?

PointerToRawData dd ?

PointerToRelocations dd ?

PointerToLinenumbers dd ? 哦

NumberOfRelocations dw ?

NumberOfLinenumbers dw ?

Characteristics dd ?

IMAGE_SECTION_HEADER ENDS

同样,不是所有成员都是很有用的,我们只关心那些真正重要的。

Field

Meanings

Name1

事实上本域的名称是"name",只是"name"已被MASM用作关键字,所以我们只能用"Name1"代替。这儿的节名长不超过8字节。记住节名仅仅是个标记而已,我们选择任何名字甚至空着也行,注意这里不用null结束。命名不是一个ASCIIZ字符串,所以不用null结尾。

VirtualAddress

本节的RVA(相对虚拟地址)。PE装载器将节映射至内存时会读取本值,因此如果域值是1000h,而PE文件装在地址400000h处,那么本节就被载到401000h。

SizeOfRawData

经过文件对齐处理后节尺寸,PE装载器提取本域值了解需映射入内存的节字节数。(译者注: 假设一个文件的文件对齐尺寸是0x200,如果前面的 VirtualSize域指示本节长度是0x388字节,则本域值为0x400,表示本节是0x400字节长)。

PointerToRawData

这是节基于文件的偏移量,PE装载器通过本域值找到节数据在文件中的位置。

Characteristics

包含标记以指示节属性,比如节是否含有可执行代码、初始化数据、未初始数据,是否可写、可读等。

现在我们已知晓 IMAGE_SECTION_HEADER 结构,再来模拟一下 PE装载器的工作吧:

读取 IMAGE_FILE_HEADER 的 NumberOfSections域,知道文件的节数目。

SizeOfHeaders 域值作为节表的文件偏移量,并以此定位节表。

遍历整个结构数组检查各成员值。

对于每个结构,我们读取PointerToRawData域值并定位到该文件偏移量。然后再读取SizeOfRawData域值来决定映射内存的字节数。将VirtualAddress域值加上ImageBase域值等于节起始的虚拟地址。然后就准备把节映射进内存,并根据Characteristics域值设置属性。

遍历整个数组,直至所有节都已处理完毕。

注意我们并没有使用节名: 这其实并不重要。

示例:

本例程打开一PE文件遍历其节表,并在列表框控件显示各节的信息。

.386

.model flat,stdcall

option casemap:none

include \masm32\include\windows.inc

include \masm32\include\kernel32.inc

include \masm32\include\comdlg32.inc

include \masm32\include\user32.inc

include \masm32\include\comctl32.inc

includelib \masm32\lib\comctl32.lib

includelib \masm32\lib\user32.lib

includelib \masm32\lib\kernel32.lib

includelib \masm32\lib\comdlg32.lib

IDD_SECTIONTABLE equ 104

IDC_SECTIONLIST equ 1001

SEH struct

PrevLink dd ? ; the address of the previous seh structure

CurrentHandler dd ? ; the address of the new exception handler

SafeOffset dd ? ; The offset where it's safe to continue execution

PrevEsp dd ? ; the old value in esp

PrevEbp dd ? ; The old value in ebp

SEH ends

.data

AppName db "PE tutorial no.5",0

ofn OPENFILENAME <>

FilterString db "Executable Files (*.exe, *.dll)",0,"*.exe;*.dll",0

db "All Files",0,"*.*",0,0

FileOpenError db "Cannot open the file for reading",0

FileOpenMappingError db "Cannot open the file for memory mapping",0

FileMappingError db "Cannot map the file into memory",0

FileInValidPE db "This file is not a valid PE",0

template db "%08lx",0

SectionName db "Section",0

VirtualSize db "V.Size",0

VirtualAddress db "V.Address",0

SizeOfRawData db "Raw Size",0

RawOffset db "Raw Offset",0

Characteristics db "Characteristics",0

.data?

hInstance dd ?

buffer db 512 dup(?)

hFile dd ?

hMapping dd ?

pMapping dd ?

ValidPE dd ?

NumberOfSections dd ?

.code

start proc

LOCAL seh:SEH

invoke GetModuleHandle,NULL

mov hInstance,eax

mov ofn.lStructSize,SIZEOF ofn

mov ofn.lpstrFilter, OFFSET FilterString

mov ofn.lpstrFile, OFFSET buffer

mov ofn.nMaxFile,512

mov ofn.Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY

invoke GetOpenFileName, ADDR ofn

.if eax==TRUE

invoke CreateFile, addr buffer, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL

.if eax!=INVALID_HANDLE_VALUE

mov hFile, eax

invoke CreateFileMapping, hFile, NULL, PAGE_READONLY,0,0,0

.if eax!=NULL

mov hMapping, eax

invoke MapViewOfFile,hMapping,FILE_MAP_READ,0,0,0

.if eax!=NULL

mov pMapping,eax

assume fs:nothing

push fs:[0]

pop seh.PrevLink

mov seh.CurrentHandler,offset SEHHandler

mov seh.SafeOffset,offset FinalExit

lea eax,seh

mov fs:[0], eax

mov seh.PrevEsp,esp

mov seh.PrevEbp,ebp

mov edi, pMapping

assume edi:ptr IMAGE_DOS_HEADER

.if [edi].e_magic==IMAGE_DOS_SIGNATURE

add edi, [edi].e_lfanew

assume edi:ptr IMAGE_NT_HEADERS

.if [edi].Signature==IMAGE_NT_SIGNATURE

mov ValidPE, TRUE

.else

mov ValidPE, FALSE

.endif

.else

mov ValidPE,FALSE

.endif

FinalExit:

push seh.PrevLink

pop fs:[0]

.if ValidPE==TRUE

call ShowSectionInfo

.else

invoke MessageBox, 0, addr FileInValidPE, addr AppName, MB_OK+MB_ICONINFORMATION

.endif

invoke UnmapViewOfFile, pMapping

.else

invoke MessageBox, 0, addr FileMappingError, addr AppName, MB_OK+MB_ICONERROR

.endif

invoke CloseHandle,hMapping

.else

invoke MessageBox, 0, addr FileOpenMappingError, addr AppName, MB_OK+MB_ICONERROR

.endif

invoke CloseHandle, hFile

.else

invoke MessageBox, 0, addr FileOpenError, addr AppName, MB_OK+MB_ICONERROR

.endif

.endif

invoke ExitProcess, 0

invoke InitCommonControls

start endp

SEHHandler proc uses edx pExcept:DWORD,pFrame:DWORD,pContext:DWORD,pDispatch:DWORD

mov edx,pFrame

assume edx:ptr SEH

mov eax,pContext

assume eax:ptr CONTEXT

push [edx].SafeOffset

pop [eax].regEip

push [edx].PrevEsp

pop [eax].regEsp

push [edx].PrevEbp

pop [eax].regEbp

mov ValidPE, FALSE

mov eax,ExceptionContinueExecution

ret

SEHHandler endp

DlgProc proc uses edi esi hDlg:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD

LOCAL lvc:LV_COLUMN

LOCAL lvi:LV_ITEM

.if uMsg==WM_INITDIALOG

mov esi, lParam

mov lvc.imask,LVCF_FMT or LVCF_TEXT or LVCF_WIDTH or LVCF_SUBITEM

mov lvc.fmt,LVCFMT_LEFT

mov lvc.lx,80

mov lvc.iSubItem,0

mov lvc.pszText,offset SectionName

invoke SendDlgItemMessage,hDlg,IDC_SECTIONLIST,LVM_INSERTCOLUMN,0,addr lvc inc lvc.iSubItem

mov lvc.fmt,LVCFMT_RIGHT

mov lvc.pszText,offset VirtualSize

invoke SendDlgItemMessage,hDlg,IDC_SECTIONLIST,LVM_INSERTCOLUMN,1,addr lvc

inc lvc.iSubItem

mov lvc.pszText,offset VirtualAddress

invoke SendDlgItemMessage,hDlg,IDC_SECTIONLIST,LVM_INSERTCOLUMN,2,addr lvc

inc lvc.iSubItem

mov lvc.pszText,offset SizeOfRawData

invoke SendDlgItemMessage,hDlg,IDC_SECTIONLIST,LVM_INSERTCOLUMN,3,addr lvc

inc lvc.iSubItem

mov lvc.pszText,offset RawOffset

invoke SendDlgItemMessage,hDlg,IDC_SECTIONLIST,LVM_INSERTCOLUMN,4,a

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/20 14:19:43

Drogon框架实战:从单机部署到云原生架构的演进之路

Drogon框架实战&#xff1a;从单机部署到云原生架构的演进之路 【免费下载链接】drogon 项目地址: https://gitcode.com/gh_mirrors/dro/drogon 在当今高并发的Web应用开发领域&#xff0c;选择合适的框架至关重要。Drogon作为基于C14/17标准的高性能HTTP应用框架&…

作者头像 李华
网站建设 2026/2/24 16:30:20

STM32平衡车测试,定时中断读取速度

一.PWM设置接下来配置一下PWM输出HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);启动PWM然后逻辑分析仪查看结果。二.动态改变占空比因为单纯的占空比设置肯定不能满足我们对于平衡车的要求。HAL_Delay(10);a 300;if(a > 900){a 100;}//通过这个宏改变占空比__HAL_TIM_SET…

作者头像 李华
网站建设 2026/2/26 3:33:04

VS Code GitLens插件冲突终极解决方案:从功能重叠到完美协作

VS Code GitLens插件冲突终极解决方案&#xff1a;从功能重叠到完美协作 【免费下载链接】vscode-gitlens 项目地址: https://gitcode.com/gh_mirrors/vsc/vscode-gitlens 你是不是也遇到过这种情况&#xff1a;在VS Code中安装了多个Git相关插件后&#xff0c;界面变得…

作者头像 李华
网站建设 2026/2/26 10:49:05

Windows下STM32CubeMX安装全流程详细说明

从零开始部署STM32开发环境&#xff1a;手把手教你搞定 STM32CubeMX 安装 你是不是也经历过这样的场景&#xff1f;刚买回一块STM32开发板&#xff0c;兴致勃勃打开电脑准备写代码&#xff0c;结果发现——连最基本的配置工具都跑不起来。点开STM32CubeMX&#xff0c;黑窗口一…

作者头像 李华
网站建设 2026/2/25 19:52:59

企业级容器化部署架构设计与性能优化实践指南

挑战分析&#xff1a;现代企业应用部署的瓶颈与痛点 【免费下载链接】docs Source repo for Dockers Documentation 项目地址: https://gitcode.com/gh_mirrors/docs3/docs 在数字化转型浪潮中&#xff0c;企业面临着应用部署效率低下、环境不一致、资源利用率不足等核心…

作者头像 李华
网站建设 2026/2/25 12:38:14

计算机毕业设计hadoop+spark+hive共享单车可视化 共享单车数据分析 共享单车爬虫 共享单车大数据 大数据毕业设计 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 技术范围&#xff1a;Sprin…

作者头像 李华