?? 創建svchost_exe調用的服務原理與實踐.htm
字號:
call PrepareSvcTable<BR>.text:01001112
mov edi,
eax ; SERVICE_TABLE_ENTRY
returned<BR>.text:01001114
test edi,
edi<BR>.text:01001116
jz short
loc_1001128<BR>.text:01001118
mov eax,
[esi+10h]<BR>.text:0100111B
test eax,
eax<BR>.text:0100111D
jz short
loc_1001128<BR>.text:0100111F
push dword ptr [esi+14h] ;
dwCapabilities<BR>.text:01001122
push eax
;
int<BR>.text:01001123
call InitializeSecurity<BR>.text:01001128
<BR>.text:01001128
loc_1001128: ;
CODE XREF:
start+5Ej<BR>.text:01001128
;
start+65j<BR>.text:01001128
push esi
;
lpMem<BR>.text:01001129
call HeapFreeMem<BR>.text:0100112E
<BR>.text:0100112E
lab_doservice: ;
CODE XREF:
start+4Dj<BR>.text:0100112E
test edi,
edi<BR>.text:01001130
jz ExitProgram<BR>.text:01001136
push edi
;
lpServiceStartTable<BR>.text:01001137
call ds:StartServiceCtrlDispatcherW<BR>.text:0100113D
jmp ExitProgram<BR>.text:0100113D
start
endp<BR>; =============================== Main Funcion end
===========================================<BR><BR><BR>由于svchost為該組的所有服務都注冊了svchost中的一個處理函數,因此每次啟動任何一個服務時,服務管理器SCM都會調用FuncServiceMain()
這個函數。這個函數使用 svcTable
查詢要啟動的服務使用的DLL,調用DLL導出的ServiceMain()函數來啟動服務,然后返回。<BR><BR>;
============================== FuncServiceMain()
===========================================<BR>.text:01001504
FuncServiceMain proc
near
; DATA XREF: PrepareSvcTable+44o<BR>.text:01001504 <BR>.text:01001504
arg_0 = dword
ptr 8<BR>.text:01001504
arg_4 = dword
ptr 0Ch<BR>.text:01001504
<BR>.text:01001504
push ecx<BR>.text:01001505
mov eax,
[esp+arg_4]<BR>.text:01001509
push ebx<BR>.text:0100150A
push ebp<BR>.text:0100150B
push esi<BR>.text:0100150C
mov ebx, offset
unk_1003000<BR>.text:01001511
push edi<BR>.text:01001512
mov edi,
[eax]<BR>.text:01001514
push ebx<BR>.text:01001515
xor ebp,
ebp<BR>.text:01001517
call ds:EnterCriticalSection<BR>.text:0100151D
xor esi,
esi<BR>.text:0100151F
cmp dwGroupSize,
esi<BR>.text:01001525
jbe short
loc_1001566<BR>.text:01001527
and [esp+10h], esi<BR>.text:0100152B
<BR>.text:0100152B
loc_100152B: ;
CODE XREF:
FuncServiceMain+4Aj<BR>.text:0100152B
mov eax,
svcTable<BR>.text:01001530
mov ecx,
[esp+10h]<BR>.text:01001534
push dword ptr
[eax+ecx]<BR>.text:01001537
push edi<BR>.text:01001538
call ds:lstrcmpiW<BR>.text:0100153E
test eax,
eax<BR>.text:01001540
jz short
StartThis<BR>.text:01001542
add dword ptr [esp+10h],
0Ch<BR>.text:01001547
inc
esi<BR>.text:01001548
cmp esi,
dwGroupSize<BR>.text:0100154E
jb short
loc_100152B<BR>.text:01001550
jmp short loc_1001566<BR>.text:01001552 ;
=================================================<BR>.text:01001552
<BR>.text:01001552
StartThis: ;
CODE XREF:
FuncServiceMain+3Cj<BR>.text:01001552
mov ecx,
svcTable<BR>.text:01001558
lea eax,
[esi+esi*2]<BR>.text:0100155B
lea eax,
[ecx+eax*4]<BR>.text:0100155E
push eax<BR>.text:0100155F
call GetDLLServiceMain<BR>.text:01001564
mov ebp,
eax ; dll ServiceMain
Function address<BR>.text:01001566 <BR>.text:01001566
loc_1001566: ;
CODE XREF:
FuncServiceMain+21j<BR>.text:01001566
;
FuncServiceMain+4Cj<BR>.text:01001566
push ebx<BR>.text:01001567
call ds:LeaveCriticalSection<BR>.text:0100156D
test ebp,
ebp<BR>.text:0100156F
jz short
loc_100157B<BR>.text:01001571
push [esp+10h+arg_4]<BR>.text:01001575
push [esp+14h+arg_0]<BR>.text:01001579
call ebp<BR>.text:0100157B <BR>.text:0100157B
loc_100157B: ;
CODE XREF:
FuncServiceMain+6Bj<BR>.text:0100157B
pop
edi<BR>.text:0100157C
pop
esi<BR>.text:0100157D
pop
ebp<BR>.text:0100157E
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -