MmGetSystemRoutineAddress 函数源码 |
作者:阿国哥 发布于2007-3-29 20:34(星期四) |
以下代码反编译自XP+SP2内核文件ntoskrnl.exe(5.1.2600.3051)的MmGetSystemRoutineAddress函数
原代码如下(IDA反编译结果,已自动作了标识): |
; PVOID __stdcall MmGetSystemRoutineAddress(PUNICODE_STRING SystemRoutineName)
public _MmGetSystemRoutineAddress@4
_MmGetSystemRoutineAddress@4 proc near
SystemRoutineName= dword ptr 8
8B FF mov edi, edi
55 push ebp
8B EC mov ebp, esp
83 EC 20 sub esp, 20h
53 push ebx
56 push esi
57 push edi
68 D8 9F 4E 00 push offset aNtoskrnl_exe ; "ntoskrnl.exe"
8D 45 E8 lea eax, [ebp-18h]
33 F6 xor esi, esi
50 push eax
89 75 FC mov [ebp-4], esi
89 75 F8 mov [ebp-8], esi
E8 53 83 F1 FF call _RtlInitUnicodeString@8 ; RtlInitUnicodeString(x,x)
68 F4 9F 4E 00 push offset aHal_dll_0 ; "hal.dll"
8D 45 E0 lea eax, [ebp-20h]
50 push eax
E8 45 83 F1 FF call _RtlInitUnicodeString@8 ; RtlInitUnicodeString(x,x)
loc_4E9F62: ; CODE XREF: PAGE:005194DA j
6A 01 push 1
FF 75 08 push dword ptr [ebp+8]
8D 45 F0 lea eax, [ebp-10h]
50 push eax
E8 F7 D9 FB FF call _RtlUnicodeStringToAnsiString@12 ; RtlUnicodeStringToAnsiString(x,x,x)
85 C0 test eax, eax
0F 8C 56 F5 02 00 jl loc_5194CE
64 A1 24 01 00 00 mov eax, large fs:124h
6A 01 push 1
8B F8 mov edi, eax
FF 8F D4 00 00 00 dec dword ptr [edi+0D4h]
68 40 36 48 00 push offset _PsLoadedModuleResource
E8 14 84 F1 FF call _ExAcquireResourceSharedLite@8 ; ExAcquireResourceSharedLite(x,x)
8B 35 20 36 48 00 mov esi, _PsLoadedModuleList
BB 20 36 48 00 mov ebx, offset _PsLoadedModuleList
;以上两行注意,可以8B35作特征码从MmGetSystemRoutineAddress起始地址搜索,并检测之后的双字与之后移6字节的双字
是否相同作特征检测. 此特征码目前适合的平台有待进一步考核.
loc_4E9F9D: ; CODE XREF: MmGetSystemRoutineAddress(x)+A3 j
3B F3 cmp esi, ebx
74 69 jz short loc_4EA00A
6A 01 push 1
8D 46 2C lea eax, [esi+2Ch]
50 push eax
8D 45 E8 lea eax, [ebp-18h]
50 push eax
E8 ED 1E FA FF call _RtlEqualUnicodeString@12 ; RtlEqualUnicodeString(x,x,x)
84 C0 test al, al
0F 84 5A FF FF FF jz loc_4E9F12
loc_4E9FB8: ; CODE XREF: PAGE:004E9F23 j
FF 45 FC inc dword ptr [ebp-4]
8D 45 F0 lea eax, [ebp-10h]
50 push eax
FF 76 18 push dword ptr [esi+18h]
E8 F3 DA FF FF call _MiFindExportedRoutineByName@8 ; MiFindExportedRoutineByName(x,x)
85 C0 test eax, eax
89 45 F8 mov [ebp-8], eax
75 3C jnz short loc_4EA00A
83 7D FC 02 cmp dword ptr [ebp-4], 2
74 36 jz short loc_4EA00A
loc_4E9FD4: ; CODE XREF: PAGE:004E9F29 j
8B 36 mov esi, [esi]
EB C5 jmp short loc_4E9F9D
; **************************************************************************?
aNtoskrnl_exe: ; DATA XREF: MmGetSystemRoutineAddress(x)+B o
6E 00 74 00 6F 00+ unicode 0, <ntoskrnl.exe>,0
00 db 0
00 db 0
aHal_dll_0: ; DATA XREF: MmGetSystemRoutineAddress(x)+21 o
68 00 61 00 6C 00+ unicode 0, <hal.dll>,0
CC db 0CCh ; ?
CC db 0CCh ; ?
CC db 0CCh ; ?
CC db 0CCh ; ?
CC db 0CCh ; ?
CC db 0CCh ; ?
; **************************************************************************?
loc_4EA00A: ; CODE XREF: MmGetSystemRoutineAddress(x)+6C j
; MmGetSystemRoutineAddress(x)+99 j ...
B9 40 36 48 00 mov ecx, offset _PsLoadedModuleResource
E8 3C A6 F1 FF call @ExReleaseResourceLite@4 ; ExReleaseResourceLite(x)
FF 87 D4 00 00 00 inc dword ptr [edi+0D4h]
75 0B jnz short loc_4EA027
8D 47 34 lea eax, [edi+34h]
39 00 cmp [eax], eax
0F 85 B8 F4 02 00 jnz loc_5194DF
loc_4EA027: ; CODE XREF: MmGetSystemRoutineAddress(x)+E7 j
; PAGE:005194EB j
8D 45 F0 lea eax, [ebp-10h]
50 push eax
E8 4A FB FA FF call _RtlFreeAnsiString@4 ; RtlFreeAnsiString(x)
8B 45 F8 mov eax, [ebp-8]
5F pop edi
5E pop esi
5B pop ebx
C9 leave
C2 04 00 retn 4
_MmGetSystemRoutineAddress@4 endp ; sp = 3Ch