5) kernel32!SetLastError() 用IDA Pro 4.6.0.785反汇编kernel32!SetLastError: -------------------------------------------------------------------------- 77E7A3B0 ; __stdcall SetLastError(x) 77E7A3B0 _SetLastError@4 proc near 77E7A3B0 77E7A3B0 dwErrCode= dword ptr 0Ch 77E7A3B0 77E7A3B0 push esi ; VOID SetLastError 77E7A3B0 ; ( 77E7A3B0 ; DWORD dwErrCode // per-thread error code 77E7A3B0 ; ); 77E7A3B1 push edi 77E7A3B2 mov eax, large fs:18h ; _NT_TIB.Self,也就是_TEB 77E7A3B8 mov edi, [esp+dwErrCode] ; 第一形参dwErrCode 77E7A3BC mov esi, eax ; _NT_TIB.Self,也就是_TEB 77E7A3BE mov eax, _g_dwLastErrorToBreakOn 77E7A3C3 test eax, eax ; if ( g_dwLastErrorToBreakOn ) 77E7A3C3 ; { 77E7A3C3 ; goto SetLastError_0 77E7A3C3 ; } 77E7A3C5 jnz SetLastError_0 77E7A3C5 77E7A3CB 77E7A3CB SetLastError_1: ; +0x034 LastErrorValue : Uint4B 77E7A3CB cmp [esi+34h], edi 77E7A3CE jnz SetLastError_2 77E7A3CE 77E7A3D4 77E7A3D4 SetLastError_exit: 77E7A3D4 pop edi 77E7A3D5 pop esi 77E7A3D6 retn 4 77E7A3D6 77E7A3D6 _SetLastError@4 endp 77E7A6E8 SetLastError_2: ; +0x034 LastErrorValue : Uint4B 77E7A6E8 mov [esi+34h], edi ; 77E7A6E8 ; 把第一形参写入这里 77E7A6EB jmp SetLastError_exit 77E97B27 SetLastError_0: ; 比较第一形参与g_dwLastErrorToBreakOn 77E97B27 cmp edi, eax 77E97B29 jnz SetLastError_1 77E97B29 77E97B2F call _DbgBreakPoint@0 ; 给调试器一个机会 77E97B2F 77E97B34 jmp SetLastError_1 -------------------------------------------------------------------------- 下面是C风格的伪代码: -------------------------------------------------------------------------- /* * 这是kernel32.dll中定义的一个全局变量 */ extern DWORD g_dwLastErrorToBreakOn; /* * This function does not return a value */ VOID WINAPI SetLastError ( DWORD dwErrCode // per-thread error code ) { if ( ( 0 != g_dwLastErrorToBreakOn ) && ( dwErrCode == g_dwLastErrorToBreakOn ) ) { /* * 给调试器一个机会 */ DbgBreakPoint(); } /* * +0x034 LastErrorValue : Uint4B * * kernel32!SetLastError()所做的惟一一件正经事,该处是线程相关的。 */ if ( _TEB.LastErrorValue != dwErrCode ) { _TEB.LastErrorValue = dwErrCode; } return; } /* end of SetLastError */ --------------------------------------------------------------------------