在R3环自己实现快速调用WriteProcessMemory函数

这里仅简单讲下原理和分析过程中的注意点,你先用已有的思路结合我的注释大概理解一下这段实现代码:

 1 #include "stdio.h"
 2 #include "windows.h"
 3 
 4 void MyWriteProcessMemory(HANDLE hProcess,LPVOID lpBaseAddress,LPVOID lpBuffer,DWORD nSize,LPDWORD lpNumberOfBytesWritten)
 5 {
 6     _asm
 7     {
 8         lea eax,[ebp+0x18]
 9         push eax         //lpNumberOfBytesWritten
10 push [ebp+0x14]     //nSize 11 push [ebp+0x10]    //lpBuffer 12 push [ebp+0xc]    //lpBaseAddress 13 push [ebp+8]      //hProcess 14 sub esp,4        //平衡堆栈,因为在call NtWriteProcessMemory后,栈中会压入一个4字节数据(我们不用管这4字节数据干嘛的) 15 mov eax,0x115      //把服务号保存在eax中 16 mov edx,0x7FFE0300    //获取SystemCall中的地址 17 call dword ptr [edx] //调用SystemCall  
18 add esp,0x18      //本来这个call后面是跟retn 0x14的,我们是自己写的程序,不能反悔到它那里去,我们只需要平衡到这段代码执行之前的esp就行了 19 } 20 } 21 22 int main(int argc, char* argv[]) 23 { 24 char inBuffer[10] = "abcdefg";  //要写入的数据 25 char strA[10] = {0};  //要写入数据的缓冲区   26 SIZE_T size = 0;    //接收实际的数据长度 27 MyWriteProcessMemory((HANDLE)-1,strA,inBuffer,9,&size);  //其实和WriteProcessMemory的参数一样,我们采用这种方式来调用自己的函数,开头的-1表示操作的进程是自己 28 printf("%s\n",strA);    //打印strA,如果写入成功,会打印出上面的 abcdefg 29 getchar(); 30 return 0; 31 }

看完了估计你还是一头雾水,不过不用担心,因为这里面的代码是通过 OllyDbg 逐个断点分析堆栈后写出来的,你自己分析一遍后就恍然大悟了。

我参考的文章是这篇:https://www.cnblogs.com/onetrainee/p/11704626.html,虽然他讲的是 ReadProcessMemory 的实现,但 WriteProcessMemory 的分析思路和它完全是一模一样的,建议先看下那篇文章再来读下面的分析方法。总体来讲,分析过程如下:

1.先正常的调用WriteProcessMemory函数,然后在OllyDbg中跟踪它,看他执行到 NtWriteProcessMemory 时的堆栈是什么样的,观察我们传进去的每一个参数在栈中此时的位置

2.进入 NtWriteProcessMemory ,看下此时我们的栈又发生了什么变化

3.根据参数在栈中的变化,以及分析执行完后栈要怎么平衡回去才能让我们的函数正常返回

 当然,有什么不懂的欢迎通过邮箱和我交流,笔者一定尽快回复。

posted @ 2020-07-16 13:25  Dubh3  阅读(582)  评论(0编辑  收藏  举报