7C8021CE      90            nop
7C8021CF      90            nop
7C8021D0 >    8BFF          mov edi,edi                              ;  ReadProcessMemory
7C8021D2      55            push ebp
7C8021D3      8BEC          mov ebp,esp
7C8021D5      8D45 14       lea eax,dword ptr ss:[ebp+0x14]        我要从这里执行
7C8021D8   .  50            push eax
7C8021D9   .  FF75 14       push dword ptr ss:[ebp+0x14]
7C8021DC   .  FF75 10       push dword ptr ss:[ebp+0x10]



不直接调用  ReadProcessMemory  因为有可能被 inline hook 呢。


直接写入参数   然后  转到    ReadProcessMemory+5  这里执行。


我自己写的老出错。。

  • 标 题:答复
  • 作 者:kissxrl
  • 时 间:2011-09-17 02:02:17

不知道为什么。。。

那个函数不好用。。。单次执行啥问题没有,,,但是我大量执行,问题就来了。。总是出错。。大家看看我那里没有写好。

大概执行  5次就会出错。。。



使用   test_ReadProcessMemory   大量执行的时候总出错,,,,但是用   ReadProcessMemory 就没问题。




vodi test_ReadProcessMemory(  HANDLE hProcess,    LPCVOID lpBaseAddress,    LPVOID lpBuffer,    DWORD nSize,    LPDWORD lpNumberOfBytesRead)
{
    __asm
    {
      mov edi,edi
      push ebp
      mov ebp,esp
      mov eax,ReadProcessMemory
      add eax,5
      jmp eax
    }
}

void main()
{
  char cc[0x1024] ;
  int tmpaddr = 0x400000;
  
  while(tmpaddr < 0x7FFFFFFF)
  {
    tmpaddr = tmpaddr + 0x1024;
    test_ReadProcessMemory((LPVOID)-1, (LPCVOID)tmpaddr, (LPVOID)&cc, 1024, 0);
    printf(" %x %x \n" ,  tmpaddr, &cc);
  }
  
  system("pause");
}

  • 标 题:答复
  • 作 者:mstwugui
  • 时 间:2011-09-17 19:10:09

你的代码有几个问题

tmpaddr是带符号整数,所以那个while永远为真,不过这不是那个错误信息的原因
问题可能在&cc上,cc已经是数组了,不需要这个&,有可能是你用的编译器比较老,编译器把&cc编译成了一个独立变量,造成堆栈错误,导致tmpaddr,以及堆栈中的0被重写了,看那个地址似乎是函数在尝试写入lpNumberOfBytesRead
另外还有个不是问题的问题,数组长度一会1024, 一会0x1024,统一起来比较好

  • 标 题:答复
  • 作 者:mstwugui
  • 时 间:2011-09-17 20:00:48

拿vc6编译了一下,是堆栈被重写导致的,但前面关于&cc的猜测是错的,而是因为test_ReadProcessMemory是个普通函数,你需要再加一个WINAPI的声明,否则VC6会在函数调用后调整ESP(5个参数,所以加了0x14)

__declspec(naked) WINAPI void test_ReadProcessMemory(  HANDLE hProcess,    LPCVOID lpBaseAddress,    LPVOID lpBuffer,    DWORD nSize,    LPDWORD lpNumberOfBytesRead)

这么写就不会有问题了

  • 标 题:答复
  • 作 者:mstwugui
  • 时 间:2011-09-17 21:37:32

引用:
最初由 kissxrl发布 查看帖子
我用 ReadProcessMemory   就可以的。。


但是用 test_ReadProcessMemory   就不行,,,大概循环几次就 出错呢。
因为test_ReadProcessMemory每次调用结束后esp都会增加0x14, 你改成如下声明就没事了


__declspec(naked) WINAPI void test_ReadProcessMemory(  HANDLE hProcess,    LPCVOID lpBaseAddress,    LPVOID lpBuffer,    DWORD nSize,    LPDWORD lpNumberOfBytesRead)

  • 标 题:答复
  • 作 者:kissxrl
  • 时 间:2011-09-17 21:56:23

终于可以了。。感谢楼上所有大虾们。。。我基础太差了。。。


不过加了 WINAPI 就有这个提示。。。编译器提示  不过程序可以正常运行。



__declspec(naked) WINAPI void test_ReadProcessMemory(  HANDLE hProcess,    LPCVOID lpBaseAddress,    LPVOID lpBuffer,    DWORD nSize,    LPDWORD lpNumberOfBytesRead)


Compiling...
tcp.cpp
d:\program files\vc6\myprojects\tcp\tcp.cpp(379) : warning C4518: 'void ' : storage-class or type specifier(s) unexpected here; ignored
d:\program files\vc6\myprojects\tcp\tcp.cpp(379) : warning C4230: anachronism used : modifiers/qualifiers interspersed, qualifier ignored
Linking...



  • 标 题:答复
  • 作 者:mstwugui
  • 时 间:2011-09-17 22:04:57

抱歉是我疏忽了,
把void去掉或是放在WINAPI前面