Eagle 发表于 2005-2-24 17:02:00

[VC孤芳自赏]XP下的内存读写技术--扫雷外挂的制作

在NT系统里,一个进程只允许对本身内存和共享内存进行读写(如果说错了请告诉我)
但经过处理后,我们可以访问安全级别不是很高的进程内存。
我们在OpenProcess时,如果能取得它的PROCESS_VM_READ、PROCESS_VM_WRITE和PROCESS_VM_OPERATION权限,那就好办了。
下面是我编的一个自动扫雷程序的核心代码,它从扫雷程序的内存中读取地雷的分布情况,再通过模拟鼠标点击来扫雷
注意,这儿地雷在内存中的分布,是在中文XP下跟踪所得,不知道在其它系统上是不是一样的。
HWND hwnd;
HANDLE hProcess = NULL;
DWORD id;
BYTE tmpValue;
DWORD bytes;
CPoint point;
CRect rect;
int intWidth, intHeight, i, j;
//找到扫雷游戏的窗口,如果找不到,就出错。
hwnd = ::FindWindow(NULL, "扫雷");
if (!hwnd)
{
MessageBox("没有找到扫雷游戏", NULL, MB_OK|MB_ICONINFORMATION);
return;
}
//从窗口ID得到它的进程ID
::GetWindowThreadProcessId(hwnd, &id);
//得到它的进程句柄
hProcess = ::OpenProcess(STANDARD_RIGHTS_REQUIRED|
    PROCESS_VM_READ|
    PROCESS_VM_WRITE|
    PROCESS_VM_OPERATION, FALSE, id);
//检查雷区的区域
::ReadProcessMemory(hProcess, (void *)0x01005334, (void *)&tmpValue, 1, &bytes);
intWidth = tmpValue;

::ReadProcessMemory(hProcess, (void *)0x01005338, (void *)&tmpValue, 1, &bytes);
intHeight = tmpValue;
::SetForegroundWindow(hwnd);
::GetWindowRect(hwnd, &rect);
::SetWindowPos(hwnd, HWND_TOP, rect.left, rect.top, 0, 0, SWP_NOSIZE);

for (i = 1; i <= intHeight; i ++)
{
for (j = 1; j <= intWidth; j ++)
{
   ::ReadProcessMemory(hProcess, (void *)(0x01005340 + i * 32 + j),
       (void *)&tmpValue, 1, &bytes);
   if ((tmpValue & 0x80) != 0x80)
   {
    point.x = 7 + j * 16 + rect.left;
    point.y = 96 + i * 16 + rect.top;
    ::SetCursorPos(point.x, point.y);
    mouse_event(MOUSEEVENTF_LEFTDOWN, point.x, point.y, 0, 0);
    mouse_event(MOUSEEVENTF_LEFTUP, point.x, point.y, 0, 0);
   }
}
}
::CloseHandle(hProcess);

游侠无极限 发表于 2005-2-25 08:45:00

既然没有Write,要那个权限干吗……

Eagle 发表于 2005-2-25 13:00:00

不好意思,另一个模块是用来重排雷区的,那就要写权限了。我这一句是从那儿直接Ctrl+C过来的。

天之血痕 发表于 2005-3-19 02:36:00

程序是我最弱的方面~~向你们学习

游侠无极限 发表于 2005-3-19 09:05:00

<P>我对这个东西放弃了,<b><FONT color=#000066>Eagle,给个怎么查找想要的内存地址的教程,比如你找到雷排列的地址的过程</FONT></b></P><P><b><FONT color=#000066>还有olldbg的教程,哪里有?</FONT></b></P>
页: [1]
查看完整版本: [VC孤芳自赏]XP下的内存读写技术--扫雷外挂的制作