【IDA】分析 Windows CE 事件日志服务(一)

来源:互联网 发布:阿里布达年代txt百度云 编辑:程序博客网 时间:2024/04/27 17:04

笔者在开始使用 Windows CE 事件日志服务时,由于自身条件限制未能获得 Microsoft 的技术支持,故只能使用 IDA Pro 对 eventlog.dll 进行分析。

笔者感觉事件日志服务相关的注册表设置可能对嵌入式系统软件工程师比较有用,所以注重分析 StartAllLoggers、InitFormattersAndOutputters、CLogEventLog::Initialize 和 CLogHandle::AssociateEventLog 等函数/方法。

StartAllLoggers 函数

eventlog.dll 的导出函数 EventLogStart 在 .text:10001B3A 调用函数 EventLogWorkerThread;然后,函数 EventLogWorkerThread 在 .text:100030FA 调用本函数。

.text:10002CC8 ; int __cdecl StartAllLoggers(void)
.text:10002CC8 
?StartAllLoggers@@YAHXZ proc near       ; CODE XREF: EventLogWorkerThread(void *)+15
.text:10002CC8
.text:10002CC8 szName          
= word ptr -218h
.text:10002CC8 pReg            
= dword ptr -10h
.text:10002CC8
.text:10002CC8                 push    ebp
.text:10002CC9                 mov     ebp, esp
.text:10002CCB                 sub     esp, 218h
.text:10002CD1                 push    ebx
.text:10002CD2                 push    esi
.text:10002CD3                 push    edi
.text:10002CD4                 push    offset 
??_C@_1EE@DKEDOPGO@?$AAS?$AAY?$AAS?$AAT?$AAE?$AAM?$AA?2?$AAC?$AAu?$AAr?$AAr?$AAe?$AAn?$AAt?$AAC?$AAo?$AAn?$AAt?$AAr?$AAo@ ; "SYSTEM/CurrentControlSet/EventLog"
.text:10002CD9                 push    HKEY_LOCAL_MACHINE
.text:10002CDE                 lea     ecx, [ebp
+pReg]
.text:10002CE1                 call    
??0CReg@@QAE@PAUHKEY__@@PBG@Z ; CReg::CReg(HKEY__ *,ushort const *)
.text:10002CE6                 xor     ebx, ebx
.text:10002CE8                 cmp     [ebp
+pReg], ebx
.text:10002CEB                 jz      loc_10002E7A
.text:10002CF1                 push    g_pvAllocData   ; pvData
.text:10002CF7                 push    
20
.text:10002CF9                 pop     esi
.text:10002CFA                 push    esi             ; iSize
.text:10002CFB                 call    g_funcAlloc
.text:10002D01                 cmp     eax, ebx
.text:10002D03                 pop     ecx
.text:10002D04                 pop     ecx
.text:10002D05                 jz      
short loc_10002D1D
.text:10002D07                 push    esi
.text:10002D08                 push    offset 
?DeleteEntry@CLogEventLog@@SAXPAX@Z ; CLogEventLog::DeleteEntry(void *)
.text:10002D0D                 push    
52
.text:10002D0F                 mov     ecx, eax
.text:10002D11                 call    
??0SVSLinkManager@@QAE@KP6AXPAX@ZK@Z ; SVSLinkManager::SVSLinkManager(ulong,void (*)(void *),ulong)
.text:10002D16                 mov     
?g_pEventLogList@@3PAVSVSLinkManager@@A, eax ; SVSLinkManager * g_pEventLogList
.text:10002D1B                 jmp     
short loc_10002D23
.text:10002D1D ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
?
.text:10002D1D
.text:10002D1D loc_10002D1D:                           ; CODE XREF: StartAllLoggers(
void)+3D
.text:10002D1D                 mov     
?g_pEventLogList@@3PAVSVSLinkManager@@A, ebx ; SVSLinkManager * g_pEventLogList
.text:10002D23
.text:10002D23 loc_10002D23:                           ; CODE XREF: StartAllLoggers(
void)+53
.text:10002D23                 push    g_pvAllocData   ; pvData
.text:10002D29                 push    esi             ; iSize
.text:10002D2A                 call    g_funcAlloc
.text:10002D30                 cmp     eax, ebx
.text:10002D32                 pop     ecx
.text:10002D33                 pop     ecx
.text:10002D34                 jz      
short loc_10002D47
.text:10002D36                 push    esi
.text:10002D37                 push    offset 
?DeleteEntry@CLogHandle@@SAXPAX@Z ; CLogHandle::DeleteEntry(void *)
.text:10002D3C                 push    
32
.text:10002D3E                 mov     ecx, eax
.text:10002D40                 call    
??0SVSLinkManager@@QAE@KP6AXPAX@ZK@Z ; SVSLinkManager::SVSLinkManager(ulong,void (*)(void *),ulong)
.text:10002D45                 jmp     
short loc_10002D49
.text:10002D47 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
?
.text:10002D47
.text:10002D47 loc_10002D47:                           ; CODE XREF: StartAllLoggers(
void)+6C
.text:10002D47                 xor     eax, eax
.text:10002D49
.text:10002D49 loc_10002D49:                           ; CODE XREF: StartAllLoggers(
void)+7D
.text:10002D49                 cmp     eax, ebx
.text:10002D4B                 mov     
?g_pLogHandleList@@3PAVSVSLinkManager@@A, eax ; SVSLinkManager * g_pLogHandleList
.text:10002D50                 jz      loc_10002E7A
.text:10002D56                 cmp     
?g_pEventLogList@@3PAVSVSLinkManager@@A, ebx ; SVSLinkManager * g_pEventLogList
.text:10002D5C                 jz      loc_10002E7A
.text:10002D62                 call    
?InitFormattersAndOutputters@@YAHXZ ; InitFormattersAndOutputters(void)
.text:10002D67                 test    eax, eax
.text:10002D69                 jz      loc_10002E7A
.text:10002D6F                 mov     edi, 103h
.text:10002D74                 jmp     
short loc_10002DF4
.text:10002D76 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
?
.text:10002D76
.text:10002D76 loc_10002D76:                           ; CODE XREF: StartAllLoggers(
void)+13E
.text:10002D76                 lea     eax, [ebp
+szName]
.text:10002D7C                 push    offset 
??_C@_1BG@COBCHLCA@?$AAF?$AAo?$AAr?$AAm?$AAa?$AAt?$AAt?$AAe?$AAr?$AAs?$AA?$AA@ ; "Formatters"
.text:10002D81                 push    eax             ; wchar_t 
*
.text:10002D82                 call    wcscmp
.text:10002D87                 test    eax, eax
.text:10002D89                 pop     ecx
.text:10002D8A                 pop     ecx
.text:10002D8B                 jz      
short loc_10002DF4
.text:10002D8D                 lea     eax, [ebp
+szName]
.text:10002D93                 push    offset 
??_C@_1BG@KJKFEBMO@?$AAO?$AAu?$AAt?$AAp?$AAu?$AAt?$AAt?$AAe?$AAr?$AAs?$AA?$AA@ ; "Outputters"
.text:10002D98                 push    eax             ; wchar_t 
*
.text:10002D99                 call    wcscmp
.text:10002D9E                 test    eax, eax
.text:10002DA0                 pop     ecx
.text:10002DA1                 pop     ecx
.text:10002DA2                 jz      
short loc_10002DF4
.text:10002DA4                 mov     ecx, 
?g_pEventLogList@@3PAVSVSLinkManager@@A ; SVSLinkManager * g_pEventLogList
.text:10002DAA                 call    
?AllocEntry@SVSLinkManager@@QAEPAXXZ ; SVSLinkManager::AllocEntry(void)
.text:10002DAF                 mov     esi, eax
.text:10002DB1                 cmp     esi, ebx
.text:10002DB3                 jz      loc_10002E7A
.text:10002DB9                 lea     eax, [ebp
+szName]
.text:10002DBF                 push    eax
.text:10002DC0                 lea     eax, [ebp
+pReg]
.text:10002DC3                 push    eax
.text:10002DC4                 mov     ecx, esi
.text:10002DC6                 call    
?Initialize@CLogEventLog@@QAEHPAVCReg@@PBG@Z ; CLogEventLog::Initialize(CReg *,ushort const *)
.text:10002DCB                 test    eax, eax
.text:10002DCD                 jnz     
short loc_10002DDD
.text:10002DCF                 mov     ecx, 
?g_pEventLogList@@3PAVSVSLinkManager@@A ; SVSLinkManager * g_pEventLogList
.text:10002DD5                 push    esi
.text:10002DD6                 call    
?RemoveEntry@SVSLinkManager@@QAEHPAX@Z ; SVSLinkManager::RemoveEntry(void *)
.text:10002DDB                 jmp     
short loc_10002DF4
.text:10002DDD ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
?
.text:10002DDD
.text:10002DDD loc_10002DDD:                           ; CODE XREF: StartAllLoggers(
void)+105
.text:10002DDD                 lea     eax, [ebp
+szName]
.text:10002DE3                 push    eax             ; wchar_t 
*
.text:10002DE4                 call    
?IsDefaultLog@@YAHPBG@Z ; IsDefaultLog(ushort const *)
.text:10002DE9                 test    eax, eax
.text:10002DEB                 pop     ecx
.text:10002DEC                 jz      
short loc_10002DF4
.text:10002DEE                 mov     
?g_pDefaultEventLog@@3PAVCLogEventLog@@A, esi ; CLogEventLog * g_pDefaultEventLog
.text:10002DF4
.text:10002DF4 loc_10002DF4:                           ; CODE XREF: StartAllLoggers(
void)+AC
.text:10002DF4                                         ; StartAllLoggers(
void)+C3...
.text:10002DF4                 lea     eax, [ebp
+szName]
.text:10002DFA                 push    edi             ; cbName
.text:10002DFB                 lea     ecx, [ebp
+pReg]
.text:10002DFE                 push    eax             ; lpName
.text:10002DFF                 call    
?EnumKey@CReg@@QAEHPAGK@Z ; CReg::EnumKey(ushort *,ulong)
.text:10002E04                 test    eax, eax
.text:10002E06                 jnz     loc_10002D76
.text:10002E0C                 mov     eax, 
?g_pEventLogList@@3PAVSVSLinkManager@@A ; SVSLinkManager * g_pEventLogList
.text:10002E11                 cmp     [eax], ebx
.text:10002E13                 jz      
short loc_10002E7A
.text:10002E15                 cmp     
?g_pDefaultEventLog@@3PAVCLogEventLog@@A, ebx ; CLogEventLog * g_pDefaultEventLog
.text:10002E1B                 jz      
short loc_10002E7A
.text:
10002E1D                 call    ?GetHandleToEventLog@@YAHXZ ; GetHandleToEventLog(void)
.text:10002E22                 test    eax, eax
.text:10002E24                 jz      
short loc_10002E7A
.text:10002E26
.text:10002E26 loc_10002E26:                           ; CODE XREF: StartAllLoggers(
void)+191
.text:10002E26                 mov     eax, 
?g_pLogHandleList@@3PAVSVSLinkManager@@A ; SVSLinkManager * g_pLogHandleList
.text:10002E2B                 mov     edx, [eax]
.text:
10002E2D                 lea     ecx, [eax+8]
.text:10002E30                 mov     [ecx], edx
.text:10002E32                 cmp     edx, ebx
.text:10002E34                 jz      
short loc_10002E5B
.text:10002E36                 mov     esi, [eax]
.text:10002E38                 add     esi, 
4
.text:10002E3B                 jmp     
short loc_10002E6C
.text:
10002E3D ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:
10002E3D
.text:
10002E3D loc_10002E3D:                           ; CODE XREF: StartAllLoggers(void)+1A6
.text:
10002E3D                 cmp     [esi+10h], ebx
.text:10002E40                 jnz     
short loc_10002E5F
.text:10002E42                 mov     ecx, esi
.text:10002E44                 call    
?AssociateEventLog@CLogHandle@@QAEHXZ ; CLogHandle::AssociateEventLog(void)
.text:10002E49                 test    eax, eax
.text:10002E4B                 jnz     
short loc_10002E5F
.text:
10002E4D                 mov     ecx, ?g_pLogHandleList@@3PAVSVSLinkManager@@A ; SVSLinkManager * g_pLogHandleList
.text:10002E53                 push    esi
.text:10002E54                 call    
?RemoveEntry@SVSLinkManager@@QAEHPAX@Z ; SVSLinkManager::RemoveEntry(void *)
.text:10002E59                 jmp     
short loc_10002E26
.text:10002E5B ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
?
.text:10002E5B
.text:10002E5B loc_10002E5B:                           ; CODE XREF: StartAllLoggers(
void)+16C
.text:10002E5B                 xor     esi, esi
.text:
10002E5D                 jmp     short loc_10002E6C
.text:
10002E5F ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:
10002E5F
.text:
10002E5F loc_10002E5F:                           ; CODE XREF: StartAllLoggers(void)+178
.text:
10002E5F                                         ; StartAllLoggers(void)+183
.text:
10002E5F                 mov     ecx, ?g_pLogHandleList@@3PAVSVSLinkManager@@A ; SVSLinkManager * g_pLogHandleList
.text:10002E65                 call    
?GetNext@SVSLinkManager@@QAEPAXXZ ; SVSLinkManager::GetNext(void)
.text:10002E6A                 mov     esi, eax
.text:10002E6C
.text:10002E6C loc_10002E6C:                           ; CODE XREF: StartAllLoggers(
void)+173
.text:10002E6C                                         ; StartAllLoggers(
void)+195
.text:10002E6C                 cmp     esi, ebx
.text:10002E6E                 jnz     
short loc_10002E3D
.text:10002E70                 call    
?PrintInitialMessagesToEventLog@@YAHXZ ; PrintInitialMessagesToEventLog(void)
.text:10002E75                 xor     esi, esi
.text:10002E77                 inc     esi
.text:10002E78                 jmp     
short loc_10002E7C
.text:10002E7A ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
?
.text:10002E7A
.text:10002E7A loc_10002E7A:                           ; CODE XREF: StartAllLoggers(
void)+23
.text:10002E7A                                         ; StartAllLoggers(
void)+88 ...
.text:10002E7A                 xor     esi, esi
.text:10002E7C
.text:10002E7C loc_10002E7C:                           ; CODE XREF: StartAllLoggers(
void)+1B0
.text:10002E7C                 lea     ecx, [ebp
+pReg]
.text:
10002E7F                 call    ??1CReg@@QAE@XZ ; CReg::~CReg(void)
.text:10002E84                 pop     edi
.text:10002E85                 mov     eax, esi
.text:10002E87                 pop     esi
.text:10002E88                 pop     ebx
.text:10002E89                 leave
.text:10002E8A                 retn
.text:10002E8A 
?StartAllLoggers@@YAHXZ endp

代码注释:

  • 地址 .text:10002CD4 - 10002CEB,初始化注册表读取类 CReg,用于读取 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/EventLog 下的键值。
  • 地址 .text:10002CF1 - 10002D1D,初始化事件日志列表 SVSLinkManager * g_pEventLogList。
  • 地址 .text:10002D23 - 10002D50,初始化日志句柄列表 SVSLinkManager * g_pLogHandleList。
  • 地址 .text:10002D62 - 10002D69,初始化 formatter 和 outputter。
  • 地址 .text:10002D76 - 10002E06,循环枚举并初始化各事件日志,其中:
    • 地址 .text:10002D76 - 10002DA2,用来跳过 Formatter 和 Outputter 键值。
    • 地址 .text:10002DA4 - 10002DDB,用来初始化事件日志,并将其加入事件日志列表 g_pEventLogList。
    • 地址 .text:10002DDD - 10002DEE,判断枚举的当前日志是否是缺省日志 (System 日志),若是则赋予缺省日志变量 g_pDefaultEventLog。
  • 地址 .text:10002E1D,函数 GetHandleToEventLog 将事件源 EventLog 与事件日志 System 关联。
  • 地址 .text:10002E26 - 10002E6E,循环枚举事件源并将其与事件日志关联。