本帖最后由 以南 于 2018-4-14 09:11 编辑
额。先说一下,如果要认真说不能算原创。有借鉴的地方。
但是嘛,API用来用去还是这样的,就厚脸皮说下是原创了
起因就是最近看了些E的源码,老是ReadProcessMemory里面套ReadProcessMemory,全是10进制。
所以,呵呵哒。
很简单直接上源码。
[C++] 纯文本查看 复制代码 DWORD ReadAddress(HANDLE &hProcess,DWORD &dwBase, int Numb, ...)
{
DWORD Address = dwBase;
va_list dw_Ptr;
va_start(dw_Ptr, Numb);
__try
{
for (int nArg = 0; nArg <= Numb; nArg++)
{
if (!nArg)
ReadProcessMemory(hProcess, (PBYTE*)(Address), &Address, sizeof(DWORD), 0);
DWORD Dr = va_arg(dw_Ptr, DWORD);
if (nArg!= Numb)
ReadProcessMemory(hProcess, (PBYTE*)(Address + Dr), &Address, sizeof(DWORD), 0);
}
va_end(dw_Ptr);
return Address;
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
return NULL;
}
}
调用。
[C++] 纯文本查看 复制代码 DWORD base = ReadAddress(hpros, addrse, 3, 12,6640, pc5);
说明一下,带入第一个函数就不用说了,第二个是基址。第三个是你要读取的指针数,比如我这里写的就是3级指针。
你第三个参数是多少个,后面就带多少个偏移。我这里前2个用的都是整型,最后一个是DWORD。
但是呢,ReadProcessMemory这个函数在读的时候,如果是个空指针它不会把空地址赋值给里面的Address,所以它依旧是之前的值。
比如我的6640是个偏移上读进去之后为空,它不会赋值。并保留原来的值。继续读下一个PC5。
然后就是,你如果要读一个数据,你依旧要自己单独写。多的就不解释了,经常用这个函数的比较明白。
对了,,也可以用0x11这样,16进制为参数多的自己试试吧,这几个应该够用了。
付个效果图。
|