-
-
[原创]关于X64程序中RUNTIME_FUNCTION,UNWIND_INFO,UNWIND_CODE结构理解
-
发表于:
2021-2-3 19:27
6621
-
[原创]关于X64程序中RUNTIME_FUNCTION,UNWIND_INFO,UNWIND_CODE结构理解
X64程序会生成一个Pdata段,用于记录每个函数的栈帧和异常信息,结构如下:
struct RUNTIME_FUNCTION
{
void __ptr32 FunctionStart;
void ptr32 FunctionEnd;
void *ptr32 UnwindInfo;
};
FunctionStart起始位置(RVA)
FunctionEnd结束位置(RVA)
UnwindInfo信息描述(RVA)
本人ida反汇编中RUNTIME_FUNCTION的一条信息(以下就用这条信息做介绍)
RUNTIME_FUNCTION <rva sub_180006840, rva loc_180006874, rva stru_1801FADC8>
起始位置
text:0000000180006840 sub_180006840 proc near
.text:0000000180006840 4C 89 44 24 18 mov [rsp+arg_10], r8
.text:0000000180006845 4C 89 4C 24 20 mov [rsp+arg_18], r9
.text:000000018000684A 53 push rbx
.text:000000018000684B 55 push rbp
.text:000000018000684C 56 push rsi
.text:000000018000684D 48 83 EC 40 sub rsp, 40h
.text:0000000180006851 33 DB xor ebx, ebx
结束位置(这里结束并不是函数结束)
loc_180006874: ; DATA XREF:
.text:0000000180006874 ; .rdata:00000001801FADF0↓o ...
.text:0000000180006874 48 89 7C 24 38 mov [rsp+58h+var_20], rdi
信息描述数据
stru_1801FADC8 UNWIND_INFO <1, 11h, 4, 0>
1801FADCC 11 72 UNWIND_CODE <11h, 72h> ; UWOP_ALLOC_SMALL
1801FADCE 0D 60 UNWIND_CODE <0Dh, 60h> ; UWOP_PUSH_NONVOL
1801FADD0 0C 50 UNWIND_CODE <0Ch, 50h> ; UWOP_PUSH_NONVOL
1801FADD2 0B 30 UNWIND_CODE <0Bh, 30h> ; UWOP_PUSH_NONVOL
信息描述是一个UNWIND_INFO结构体,其中第三个参数4代表有四个UNWIND_CODE 数据,UNWIND_CODE可以理解成伪指令,用于描述这段代码对栈的操作,第一个UNWIND_CODE是在栈上分配内存(sub rsp,*),11代表起始位置偏移,也就是(180006840+11),地址0x180006851这条地址的上一条指令就是sub rsp,40h,第二个UNWIND_CODE的0D是可以理解成伪指令,对应的操作是push rsi,第三条OC代表push rbp,第四条 0B代表push rbx,所以X86没有像X86一样通过ebp来进行栈回溯,而是通过.pdata段中的RUNNING_FUNCTION 直接找到栈中的返回地址,从而实现栈回溯,编译器已经把所有函数的结构生成在PE文件中
以上如有错误希望大佬指出
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)