Windows系统调用中API的3环部分(依据分析重写ReadProcessMemory函数)

时间:2022-05-01 20:03:49

Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html

Windows系统调用中API的3环部分

一、R3环API分析的重要性

Windows所提供给R3环的API,实质就是对操作系统接口的封装,其实现部分都是在R0实现的。

很多恶意程序会利用钩子来钩取这些API,从而达到截取内容,修改数据的意图。

现在我们使用olldbg对ReadProcessMemory进行跟踪分析,查看其在R3的实现,并根据我们的分析来重写一个ReadProcessMemory。

重写ReadProcessMemory之后,这就会加大恶意代码截获的难度。

当然,对于自己来说也有很多弊端,比如只能在指定的操作系统中运行(32位与64位操作系统,其运行ReadProcessMemory的执行动作是不一样的,在64位运行32位程序,其中间会调用wow64cpu.dll来进行转换)

二、调试代码

1 #include "pch.h" 2 #include <iostream> 3 #include <algorithm> 4 #include <Windows.h> 5 6 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); 16 17 } 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(); 24 25 }

三、调试中的关键汇编代码(系统环境:在Windows7 32位操作系统 / 调试器:olldbg)

Windows系统调用中API的3环部分(依据分析重写ReadProcessMemory函数)

1. 在exe 中 调用 kernel32.ReadProcessMemroy函数
  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

2. 在 kernel32.ReadProcessMemroy函数 中调用 jmp.&API-MS-Win-Core-Memory-L1-1-0.ReadProcessMemory> 函数
  // 该函数相当于什么也没做...
  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>