用户层下API的逆向分析及重构

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 	mov eax,0x115 // 对应操作系统内核中某一函数的编号
  77A162FD  BA 0003FE7F 	mov edx,0x7FFE0300 // 该地方是一个函数,该函数决定了什么方式进零环
  77A16302  FF12     		call dword ptr ds:[edx] ; ntdll.KiFastSystemCall

ntdll.KiFastSystemCall 中 调用 sysenter

  77A170B0  8BD4     mov edx,esp
  77A170B2  0F34     sysenter
  77A170B4  C3       retn

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值