zoukankan      html  css  js  c++  java
  • 在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 ",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.根据参数在栈中的变化,以及分析执行完后栈要怎么平衡回去才能让我们的函数正常返回

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

  • 相关阅读:
    可持久化线段树学习笔记
    GDI+学习之路
    tcpdump——分析tcp关闭4次过程
    nasm过程调用
    ios学习:NSURLConnection 和 Json数据解析
    ios学习:文件简单读写
    JSONP原理及其简单封装
    JSP使用JSTL
    JDBC
    Apache无法正常启动的原因
  • 原文地址:https://www.cnblogs.com/dubh3/p/13322156.html
Copyright © 2011-2022 走看看