从汇编角度识别与还原静态局部变量

msvc x86

.text:00468FC1                 mov     eax, large fs:2Ch ;这一段代码不知道有啥用,反正每次都会跳入00469033
.text:00468FC7                 mov     ecx, TlsIndex
.text:00468FCD                 mov     byte ptr [ebp+var_4], 7
.text:00468FD1                 mov     ecx, [eax+ecx*4]
.text:00468FD4                 mov     eax, dword_5F0AE0
.text:00468FD9                 cmp     eax, [ecx+0Ch]
.text:00468FDF                 jg      short loc_469033

.text:00469033                 push    offset dword_5F0AE0
.text:00469038                 call    __Init_thread_header
.text:0046903D                 add     esp, 4
.text:00469040                 cmp     dword_5F0AE0, 0FFFFFFFFh
.text:00469047                 jnz     short loc_468FE1
.text:00469049                 push    0               ; <<
.text:0046904B                 mov     ecx, offset mainWindowHelper
.text:00469050                 mov     byte ptr [ebp+var_4], 8
.text:00469054                 call    sub_44DE60      ; 局部静态变量
.text:00469059                 push    offset sub_4A6EF0
.text:0046905E                 call    _atexit         ; <<
.text:00469063                 push    offset dword_5F0AE0
.text:00469068                 mov     byte ptr [ebp+var_4], 7
.text:0046906C                 call    __Init_thread_footer
.text:00469071                 add     esp, 8

两个 << 之间就是静态局部变量初始化代码
dword_5F0AE0是判断是否初始化的标志,若dword_5F0AE0为0xFFFFFFFF则表示为初始化,所以在比较初始化标志的判断后是静态局部变量的初始化代码
在末尾会将dword_5F0AE0调用__Init_thread_footer初始化,所以00469063之前为静态局部变量的初始化代码

posted @ 2023-02-20 00:19  乘舟凉  阅读(45)  评论(0编辑  收藏  举报