Kernel32.dll!BaseProcessStart汇编代码如下: 7C817054 ; __stdcall BaseProcessStart(x) 7C817054 _BaseProcessStart@4 proc near ; CODE XREF: BaseProcessStartThunk(x,x)+5j 7C817054 7C817054 ms_exc = CPPEH_RECORD ptr -18h 7C817054 arg_0 = dword ptr 8 7C817054 7C817054 push 0Ch //在__SEH_prolog中被更改为EBP 7C817056 push offset stru_7C817080 //暂时把ScopeTable保存在这里 7C81705B call __SEH_prolog // 设置EBP,安装SEH 7C817060 and [ebp+ms_exc.disabled], 0 // 这时的EBP已经指向7C817054所在位置 7C817064 push 4 // 入口函数所在地址所占的空间大小 7C817066 lea eax, [ebp+arg_0]// 入口函数所在地址 7C817069 push eax 7C81706A push 9 // 查询并设置线程的入口函数 7C81706C push 0FFFFFFFEh // GetCurrentThread() 7C81706E call ds:__imp__NtSetInformationThread@16 ; 设置线程的入口点函数为mainCRTStartup 7C817074 call [ebp+arg_0] // 调用mainCRTStartup 7C817077 push eax // dwExitCode 7C817078 7C817078 loc_7C817078: // CODE XREF: .text:7C84390Dj 7C817078 call _ExitThread@4 // 退出线程 7C817078 _BaseProcessStart@4 endp 翻译成C/C++代码大概如下: //'*'表示待分析 #define SET_THREAD_ENTRY_ROUTINE 9 __stdcall BaseProcessStart(LPVOID lpfnStartRoutine) { DWORD retValue = 0; __try { //将主线程的入口函数设置为mainCRTStartup NtSetInformationThread(GetCurrentThread(),SET_THREAD_ENTRY_ROUTINE, &lpfnStartRoutine,sizeof(lpfnStartRoutine)); retValue = lpfnStartRoutine(); } __except(/*... ...*/) { /*... ...*/ } } 再来看一下__SEH_prolog函数,它的作用就是安装SEH,设置新的EBP。 7C8024D6 __SEH_prolog proc near