在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.根据参数在栈中的变化,以及分析执行完后栈要怎么平衡回去才能让我们的函数正常返回
当然,有什么不懂的欢迎通过邮箱和我交流,笔者一定尽快回复。