Windows系统调用中API的3环部分(依据分析重写ReadProcessMemory函数)展开全文Windows内核分析索引目录:https:///onetrainee/p/11675224.html Windows系统调用中API的3环部分一、R3环API分析的重要性1.Windows所提供给R3环的API,实质就是对操作系统接口的封装,其实现部分都是在R0实现的。
2.很多恶意程序会利用钩子来钩取这些API,从而达到截取内容,修改数据的意图。
3.现在我们使用olldbg对ReadProcessMemory进行跟踪分析,查看其在R3的实现,并根据我们的分析来重写一个ReadProcessMemory。
4.重写ReadProcessMemory之后,这就会加大恶意代码截获的难度。
5.当然,对于自己来说也有很多弊端,比如只能在指定的操作系统中运行(32位与64位操作系统,其运行ReadProcessMemory的执行动作是不一样的,在64位运行32位程序,其中间会调用wow64cpu.dll来进行转换)二、调试代码1 #include "pch.h"2 #include <iostream>3 #include <algorithm>4 #include <Windows.h>56 int main() {7 getchar();8 getchar();9 int a[4],t;10 printf("hello world!");11 getchar();12 getchar();13 // 依次往 p 指针中写入数据,再用ReadProcessMemory 读取数据14 for (int i = 0; i < 4; i ) {15 WriteProcessMemory(INVALID_HANDLE_VALUE, &a[i], &i, sizeof(int),NULL);1617 }18 for (int i = 0; i < 4; i ) {19 ReadProcessMemory(INVALID_HANDLE_VALUE, &a[i], &t, sizeof(int), NULL);20 printf("%d\n", t);21 }22 getchar();23 getchar();2425 }三、调试中的关键汇编代码(系统环境:在Windows7 32位操作系统 / 调试器:olldbg)1. 在exe 中调用 kernel32.ReadProcessMemroy函数01314E3E 8BF4 mov esi,esp01314E40 6A 00 push 0x001314E42 6A 04 push 0x401314E44 8D45 DC lea eax,dword ptr ss:[ebp-0x24]01314E47 50 push eax01314E48 8B4D C4 mov ecx,dword ptr ss:[ebp-0x3C]01314E4B 8D548D E8 lea edx,dword ptr ss:[ebp ecx*4-0x18]01314E4F 52 push edx01314E50 6A FF push -0x101314E52 FF15 64B0310>call dword ptr ds:[<&KERNEL32.ReadProcessMemory>];kernel32.ReadProcessMemory01314E58 3BF4 cmp esi,esp2. 在kernel32.ReadProcessMemroy函数中调用jmp.&API-MS-Win-Core-Memory-L1-1-0.ReadProcessMemory> 函数// 该函数相当于什么也没做...7622C1CE > 8BFF mov edi,edi7622C1D0 55 push ebp7622C1D1 8BEC mov ebp,esp7622C1D3 5D pop ebp ;7622C1D4 ^ E9 F45EFCFF jmp <jmp.&API-MS-Win-Core-Memory-L1-1-0.ReadProcessMemory>3. 在API-MS-Win-Core-Memory-L1-1-0.ReadProcessMemo 中调用 KernelBa.ReadProcessMemory 函数761F20CD - FF25 0C191F7>jmp dword ptr ds:[<&API-MS-Win-Core-Memory-L1-1-0.ReadProcessMemo>;KernelBa.ReadProcessMemory4. 在KernelBa.ReadProcessMemory 调用<&ntdll.NtReadVirtualMemory> 函数75DA9A0A > 8BFF mov edi,edi// 这两部分在编写函数时就会使用75DA9A0C 55 push ebp75DA9A0D 8BEC mov ebp,esp75DA9A0F 8D45 14 lea eax,dword ptr ss:[ebp 0x14]75DA9A12 50 push eax75DA9A13 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.ZwReadVirtualMemory5. 在<&ntdll.NtReadVirtualMemory> 中调用ntdll.KiFastSystemCall 函数77A162F8 > B8 15010000 mov eax,0x115 // 对应操作系统内核中某一函数的编号。