Windows所提供给R3环的API,实质就是对操作系统接口的封装,其实现部分都是在R0实现的。很多恶意程序会利用钩子来钩取这些API,从而达到截取内容,修改数据的意图。现在我们使用ollydbg对ReadProcessMemory进行跟踪分析,查看其在R3的实现。
测试
od
我们首先在od里面跟一下在ring3层ReadProcessMemory
的调用过程
首先在 exe 中 调用 kernel32.ReadProcessMemory
函数,我们可以看到这一部分主要是call dword ptr ds:[<&KERNEL32.ReadProcessMemory>]; kernel32.ReadProcessMemory
这一行代码比较关键,调用了kernel32.ReadProcessMemory
,继续往里面跟
01314E3E 8BF4 mov esi,esp
01314E40 6A 00 push 0x0
01314E42 6A 04 push 0x4
01314E44 8D45 DC lea eax,dword ptr ss:[ebp-0x24]
01314E47 50 push eax
01314E48 8B4D C4 mov ecx,dword ptr ss:[ebp-0x3C]
01314E4B 8D548D E8 lea edx,dword ptr ss:[ebp+ecx*4-0x18]
01314E4F 52 push edx
01314E50 6A FF push -0x1
01314E52 FF15 64B0310 call dword ptr ds:[<&KERNEL32.ReadProcessMemory>]; kernel32.ReadProcessMemory
01314E58 3BF4 cmp esi,esp
在 ReadProcessMemory
函数 中调用 jmp.&API-MS-Win-Core-Memory-L1-1-0.ReadProcessMemory>
函数,在kenel32.dll
中,mov edi,edi
是用于热补丁技术所保留的,这段代码仔细看其实除了jmp
什么也没干,继续跟jmp
7622C1CE 8BFF mov edi,edi
7622C1D0 55 push ebp
7622C1D1 8BEC mov ebp,esp
7622C1D3 5D pop ebp
7622C1D4 E9 F45EFCFF jmp <jmp.&API-MS-Win-Core-Memory-L1-1-0.ReadProcessMemory>
在 API-MS-Win-Core-Memory-L1-1-0.ReadProcessMemo
中调用 KernelBase.ReadProcessMemory
函数,这里的调用链就是从kernel32.dll
到了kernelBase.dll
761F20CD FF25 0C191F7
jmp dword ptr ds:[<&API-MS-Win-Core-Memory-L1-1-0.ReadProcessMemory>; KernelBase.ReadProcessMemory
在KernelBase.ReadProcessMemory
中 调用 <&ntdll.NtReadVirtualMemory>
函数,将ReadProcessMemory
中传入的参数再次入栈,调用ntdll.ZwReadVirtualMemory
函数,再往里面走
75DA9A0A 8BFF mov edi,edi
75DA9A0C 55 push ebp
75DA9A0D 8BEC mov ebp,esp
75DA9A0F 8D45 14 lea eax,dword ptr ss:[ebp+0x14]
75DA9A12 50 push eax
75DA9A13 FF75 14 push dword ptr ss:[ebp+0x14]
75DA9A16 FF75 10 push dword ptr ss:[ebp+0x10]
75DA9A19 FF75 0C push dword ptr ss:[ebp+0xC]
75DA9A1C FF75 08 push dword ptr ss:[ebp+0x8]
75DA9A1F FF15 C411DA7
call dword ptr ds:[<&ntdll.NtReadVirtualMemory>] ; ntdll.ZwReadVirtualMemory
在 <&ntdll.NtReadVirtualMemory>
中调用 ntdll.KiFastSystemCall
函数,这里往eax里存放了一个编号,对应在内核中ReadProcessMemory
的实现,在 0x7FFE0300
处存放了一个函数指针,该函数指针决定了以什么方式进入0环(中断/快速调用)
77A162F8 B8 15010000