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)
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>