原文:https://www.pediy.com/kssd/pediy12/140213.html
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 这里执行。
我自己写的老出错。。
不知道为什么。。。
那个函数不好用。。。单次执行啥问题没有,,,但是我大量执行,问题就来了。。总是出错。。大家看看我那里没有写好。
大概执行 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");
}
你的代码有几个问题
tmpaddr是带符号整数,所以那个while永远为真,不过这不是那个错误信息的原因
问题可能在&cc上,cc已经是数组了,不需要这个&,有可能是你用的编译器比较老,编译器把&cc编译成了一个独立变量,造成堆栈错误,导致tmpaddr,以及堆栈中的0被重写了,看那个地址似乎是函数在尝试写入lpNumberOfBytesRead
另外还有个不是问题的问题,数组长度一会1024, 一会0x1024,统一起来比较好
拿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)
这么写就不会有问题了
终于可以了。。感谢楼上所有大虾们。。。我基础太差了。。。
不过加了 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...
抱歉是我疏忽了,
把void去掉或是放在WINAPI前面