启动函数反汇编

    如果随便问一个windows程序员程序的执行是从哪里开始的,最可能听到的答案是WinMain,其实这是错误的,首先接收控制的是启动代码,它是编译器在不知不觉中插入到程

序之中的,在执行了必须的初始进程以后,启动代码才在某个时刻调用_wMain,现在来说,IDA可以识别出大部分的Main函数,但是,程序的执行可能不是从WInMain开始的,启动

代码可能有一个对理解算法至关重要的操作。因此,浏览器东代码可以确定它是否含有不一般的很有必要的。现在已win32控制台程序为例

.text:00401111 ; int __cdecl _tmainCRTStartup()
.text:00401111 __tmainCRTStartup proc near             ; CODE XREF: _wmainCRTStartup+5j
.text:00401111
.text:00401111 Code            = dword ptr -20h
.text:00401111 nested          = dword ptr -1Ch
.text:00401111 ms_exc          = CPPEH_RECORD ptr -18h
.text:00401111
.text:00401111                 push    10h
.text:00401113                 push    offset unk_4021A8
.text:00401118                 call    __SEH_prolog4
.text:0040111D                 xor     ebx, ebx
.text:0040111F                 cmp     __NoHeapEnableTerminationOnCorruption, ebx
.text:00401125                 jnz     short loc_401132
.text:00401127                 push    ebx             ; HeapInformationLength
.text:00401128                 push    ebx             ; HeapInformation
.text:00401129                 push    1               ; HeapInformationClass
.text:0040112B                 push    ebx             ; HeapHandle
.text:0040112C                 call    ds:__imp__HeapSetInformation@16 ; HeapSetInformation(x,x,x,x)该函数的作用是启用堆被破坏的情况下可以被通知
.text:00401132
.text:00401132 loc_401132:                             ; CODE XREF: __tmainCRTStartup+14j
.text:00401132                 mov     [ebp+ms_exc.disabled], ebx
.text:00401135                 mov     eax, large fs:18h
.text:0040113B                 mov     esi, [eax+4]
.text:0040113E                 mov     [ebp+nested], ebx
.text:00401141                 mov     edi, offset ___native_startup_lock
.text:00401146
.text:00401146 loc_401146:                             ; CODE XREF: __tmainCRTStartup+59j
.text:00401146                 push    ebx             ; Comperand在.text:00401128是程序管理器为该进程自行分配的堆的信息
.text:00401147                 push    esi             ; Exchange
.text:00401148                 push    edi             ; Destination;锁定的内存信息,它应该和堆信息是相等的
.text:00401149                 call    ds:__imp__InterlockedCompareExchange@12 ; InterlockedCompareExchange(x,x,x)将Destination和Compare相比如果相等就将Destination和Exchange交换
.text:00401149                                                                 ;该过程锁定内存操作,执行过程中不允许其他程序访问这是函数描述,其真实意义在于检测随机取得的内存地                                                              ;址是否可用如果可用,则将esi置1作为该进程的起始地址1,如果该地址即[ebp+nested]不可用,则等待使用进程结束直到地址可用
.text:0040114F                 cmp     eax, ebx
.text:00401151                 jz      short loc_40116C
.text:00401153                 cmp     eax, esi
.text:00401155                 jnz     short loc_40115F;//Destination 和Comprand不相等,则等待时机等待使用该内存的进程释放内存
.text:00401157                 xor     esi, esi
.text:00401159                 inc     esi
.text:0040115A                 mov     [ebp+nested], esi
.text:0040115D                 jmp     short loc_40116F
.text:0040115F ; ---------------------------------------------------------------------------
.text:0040115F
.text:0040115F loc_40115F:                             ; CODE XREF: __tmainCRTStartup+44j
.text:0040115F                 push    3E8h            ; dwMilliseconds
.text:00401164                 call    ds:__imp__Sleep@4 ; Sleep(x)            ;程序等待一会儿再执行
.text:0040116A                 jmp     short loc_401146
.text:0040116C ; ---------------------------------------------------------------------------
.text:0040116C
.text:0040116C loc_40116C:                             ; CODE XREF: __tmainCRTStartup+40j
.text:0040116C                 xor     esi, esi
.text:0040116E                 inc     esi
.text:0040116F
.text:0040116F loc_40116F:                             ; CODE XREF: __tmainCRTStartup+4Cj
.text:0040116F                 mov     eax, ___native_startup_state;表示进程起始状态,为1 则表示已经准备好
.text:00401174                 cmp     eax, esi
.text:00401176                 jnz     short loc_401182;//则表示进程还未准备好
.text:00401178                 push    1Fh
.text:0040117A                 call    __amsg_exit    ;在InterlockedCompareExchange中的Destination和Comprand不相等的情况下退出
.text:0040117F                 pop     ecx
.text:00401180                 jmp     short loc_4011BD
.text:00401182 ; ---------------------------------------------------------------------------
.text:00401182
.text:00401182 loc_401182:                             ; CODE XREF: __tmainCRTStartup+65j
.text:00401182                 mov     eax, ___native_startup_state
.text:00401187                 test    eax, eax
.text:00401189                 jnz     short loc_4011B7
.text:0040118B                 mov     ___native_startup_state, esi
.text:00401191                 push    offset ___xi_z
.text:00401196                 push    offset ___xi_a
.text:0040119B                 call    __initterm_e
.text:004011A0                 pop     ecx
.text:004011A1                 pop     ecx
.text:004011A2                 test    eax, eax
.text:004011A4                 jz      short loc_4011BD
.text:004011A6                 mov     [ebp+ms_exc.disabled], 0FFFFFFFEh
.text:004011AD                 mov     eax, 0FFh
.text:004011B2                 jmp     loc_401294 ;表示程序未开始便已结束,遇到错误
.text:004011B7 ; ---------------------------------------------------------------------------
.text:004011B7
.text:004011B7 loc_4011B7:                             ; CODE XREF: __tmainCRTStartup+78j
.text:004011B7                 mov     has_cctor, esi
.text:004011BD
.text:004011BD loc_4011BD:                             ; CODE XREF: __tmainCRTStartup+6Fj
.text:004011BD                                         ; __tmainCRTStartup+93j
.text:004011BD                 mov     eax, ___native_startup_state
.text:004011C2                 cmp     eax, esi
.text:004011C4                 jnz     short loc_4011E1
.text:004011C6                 push    offset ___xc_z
.text:004011CB                 push    offset ___xc_a
.text:004011D0                 call    __initterm
.text:004011D5                 pop     ecx
.text:004011D6                 pop     ecx
.text:004011D7                 mov     ___native_startup_state, 2
.text:004011E1
.text:004011E1 loc_4011E1:                             ; CODE XREF: __tmainCRTStartup+B3j
.text:004011E1                 cmp     [ebp+nested], ebx
.text:004011E4                 jnz     short loc_4011EE
.text:004011E6                 push    ebx             ; Value
.text:004011E7                 push    edi             ; Target
.text:004011E8                 call    ds:__imp__InterlockedExchange@8 ; InterlockedExchange(x,x)
.text:004011EE
.text:004011EE loc_4011EE:                             ; CODE XREF: __tmainCRTStartup+D3j
.text:004011EE                 cmp     ___dyn_tls_init_callback, ebx
.text:004011F4                 jz      short loc_40120F
.text:004011F6                 push    offset ___dyn_tls_init_callback ; pTarget
.text:004011FB                 call    __IsNonwritableInCurrentImage
.text:00401200                 pop     ecx
.text:00401201                 test    eax, eax
.text:00401203                 jz      short loc_40120F
.text:00401205                 push    ebx
.text:00401206                 push    2
.text:00401208                 push    ebx
.text:00401209                 call    ___dyn_tls_init_callback
.text:0040120F
.text:0040120F loc_40120F:                             ; CODE XREF: __tmainCRTStartup+E3j
.text:0040120F                                         ; __tmainCRTStartup+F2j
.text:0040120F                 mov     eax, envp
.text:00401214                 mov     ecx, ds:__imp____winitenv
.text:0040121A                 mov     [ecx], eax
.text:0040121C                 push    envp
.text:00401222                 push    argv            ; argv
.text:00401228                 push    argc            ; argc
.text:0040122E                 call    _wmain                ;准备工作完成,调用主函数
.text:00401233                 add     esp, 0Ch
.text:00401236                 mov     mainret, eax
.text:0040123B                 cmp     managedapp, ebx
.text:00401241                 jnz     short $LN37
.text:00401243                 push    eax             ; Code
.text:00401244                 call    ds:__imp__exit
.text:0040124A ; ---------------------------------------------------------------------------
.text:0040124A
.text:0040124A $LN36:                                  ; DATA XREF: .rdata:004021BCo
.text:0040124A                 mov     eax, [ebp+ms_exc.exc_ptr]
.text:0040124D                 mov     ecx, [eax]
.text:0040124F                 mov     ecx, [ecx]
.text:00401251                 mov     [ebp+Code], ecx
.text:00401254                 push    eax
.text:00401255                 push    ecx
.text:00401256                 call    __XcptFilter
.text:0040125B                 pop     ecx
.text:0040125C                 pop     ecx
.text:0040125D
.text:0040125D $LN32:
.text:0040125D                 retn
.text:0040125E ; ---------------------------------------------------------------------------
.text:0040125E
.text:0040125E $LN22:                                  ; DATA XREF: .rdata:004021C0o
.text:0040125E                 mov     esp, [ebp+ms_exc.old_esp]
.text:00401261                 mov     eax, [ebp+Code]
.text:00401264                 mov     mainret, eax
.text:00401269                 xor     ebx, ebx
.text:0040126B                 cmp     managedapp, ebx
.text:00401271                 jnz     short $LN37
.text:00401273                 push    eax             ; Code
.text:00401274                 call    ds:__imp___exit
.text:0040127A ; ---------------------------------------------------------------------------
.text:0040127A
.text:0040127A $LN37:                                  ; CODE XREF: __tmainCRTStartup+130j
.text:0040127A                                         ; __tmainCRTStartup+160j
.text:0040127A                 cmp     has_cctor, ebx
.text:00401280                 jnz     short loc_401288
.text:00401282                 call    ds:__imp___cexit
.text:00401288
.text:00401288 loc_401288:                             ; CODE XREF: __tmainCRTStartup+16Fj
.text:00401288                 mov     [ebp+ms_exc.disabled], 0FFFFFFFEh
.text:0040128F                 mov     eax, mainret
.text:00401294
.text:00401294 loc_401294:                             ; CODE XREF: __tmainCRTStartup+A1j
.text:00401294                 call    __SEH_epilog4
.text:00401299                 retn
.text:00401299 __tmainCRTStartup endp
.text:00401299

检测__native_startup_state流程图

if(___native_startup_state!=1) {     loc_401182:    {                if(___native_startup_state!=0)         {                loc_4011B7:   jmp    loc_4011BD:               }        else         {             loc_401294;进程结束,未完成初始化          }     } } else {      loc_4011BD: }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世纪殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值