下沙论坛

 找回密码
 注册论坛(EC通行证)

QQ登录

QQ登录

下沙大学生网QQ群8(千人群)
群号:6490324 ,验证:下沙大学生网。
用手机发布本地信息严禁群发,各种宣传贴请发表在下沙信息版块有问必答,欢迎提问 提升会员等级,助你宣传
新会员必读 大学生的论坛下沙新生必读下沙币获得方法及使用
查看: 8963|回复: 4
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2005-2-24 17:02:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在NT系统里,一个进程只允许对本身内存和共享内存进行读写(如果说错了请告诉我) + s5 N u# W$ e7 g但经过处理后,我们可以访问安全级别不是很高的进程内存。 / i+ w6 ]& T! i3 q5 G. X4 D9 A1 }7 F我们在OpenProcess时,如果能取得它的PROCESS_VM_READ、PROCESS_VM_WRITE和PROCESS_VM_OPERATION权限,那就好办了。 ( N" t1 x" P5 I' e下面是我编的一个自动扫雷程序的核心代码,它从扫雷程序的内存中读取地雷的分布情况,再通过模拟鼠标点击来扫雷 # ^# q& _. _% S/ f: a+ A; `注意,这儿地雷在内存中的分布,是在中文XP下跟踪所得,不知道在其它系统上是不是一样的。 , q3 f$ b, L7 p& J' g- M: t, G HWND hwnd; : J$ s1 v7 g2 @9 S+ {1 i3 m0 J HANDLE hProcess = NULL;2 @/ `" q5 ^5 l. ^% y8 j8 ~/ ~& t DWORD id;! U) H6 X$ s; S4 G$ i BYTE tmpValue; ! W9 i; c' y" X2 t+ E: f j DWORD bytes;9 x) Y! V% x4 E3 K CPoint point; - ~, F( o0 i$ o7 q- M( S CRect rect;# R# g; F; `) `/ g6 {9 Q( y! r/ X) a int intWidth, intHeight, i, j;5 I+ w$ B' x9 ~0 l //找到扫雷游戏的窗口,如果找不到,就出错。+ l3 q' ~4 J2 u0 x; H8 Y hwnd = ::FindWindow(NULL, "扫雷");% R. W& O ~# n" ~$ O, } if (!hwnd) ; L- _7 [1 i/ \' l" o% ^ {+ C ]7 t/ V) _ MessageBox("没有找到扫雷游戏", NULL, MB_OK|MB_ICONINFORMATION); ) t0 f/ I6 T- x& C `* j return;! h7 Q( Z, O# ^ Q/ S }, k5 A# @, Q$ j //从窗口ID得到它的进程ID + g6 W8 U. d1 g# l$ T X ::GetWindowThreadProcessId(hwnd, &id);# @% y6 x. Z, X: R //得到它的进程句柄9 ]# t; ^' k8 E! g4 e/ x hProcess = ::OpenProcess(STANDARD_RIGHTS_REQUIRED|& K3 B/ E; o% Z. W* Q% ^; y PROCESS_VM_READ|5 V6 _# c# I8 _. R PROCESS_VM_WRITE| 0 `. D& z' N. ?6 f PROCESS_VM_OPERATION, FALSE, id); - r4 t* @. T5 r2 u& I* x //检查雷区的区域 a W5 P6 h2 u; e7 } ::ReadProcessMemory(hProcess, (void *)0x01005334, (void *)&tmpValue, 1, &bytes); 8 z& O5 t, q: F; N3 R intWidth = tmpValue; 7 t# i8 Z8 f; u4 w ( p0 \1 X5 b- O ::ReadProcessMemory(hProcess, (void *)0x01005338, (void *)&tmpValue, 1, &bytes); 0 K# @0 [( i5 `: [6 _( t, M/ d intHeight = tmpValue; ( s; j1 |7 l* p* z ::SetForegroundWindow(hwnd); : C- D! c( r& J& F4 C" f# N ::GetWindowRect(hwnd, &rect); : U p8 J1 A+ n3 N( o ::SetWindowPos(hwnd, HWND_TOP, rect.left, rect.top, 0, 0, SWP_NOSIZE);/ U0 W0 o" G$ c0 l0 o4 z& L. ~ ' G$ o: g5 w0 B0 Q for (i = 1; i <= intHeight; i ++)% g# f+ D8 H4 i8 z# h {2 g0 W. @+ Q5 M) Z e) R for (j = 1; j <= intWidth; j ++) / m4 c! B) v/ j7 ^ J { - G+ W; b8 q8 e- ~4 d- o. g ::ReadProcessMemory(hProcess, (void *)(0x01005340 + i * 32 + j),' J) a/ n) p1 ~& P6 ] (void *)&tmpValue, 1, &bytes);3 f6 b/ h6 k. c% O2 a1 m- k if ((tmpValue & 0x80) != 0x80) " O6 x) ?9 i0 k) n) s/ Y+ d2 @! Z { ) S7 ^1 ?, F! X' W. h point.x = 7 + j * 16 + rect.left; 4 [+ S2 {( U" v+ o; [& Y7 V; z point.y = 96 + i * 16 + rect.top;* y) c. Z. y4 f# q ::SetCursorPos(point.x, point.y);7 s. ^7 x. F/ c9 U1 w! w mouse_event(MOUSEEVENTF_LEFTDOWN, point.x, point.y, 0, 0); ( J4 k) _: \7 V. Q3 r mouse_event(MOUSEEVENTF_LEFTUP, point.x, point.y, 0, 0);" K- O8 ]7 }0 n } 0 S) u. s u8 P0 t3 G; i }' N& y7 n N1 l7 A9 } }4 B7 y% E+ h2 X ::CloseHandle(hProcess);
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩

该用户从未签到

2
发表于 2005-2-25 08:45:00 | 只看该作者
既然没有Write,要那个权限干吗……

该用户从未签到

3
 楼主| 发表于 2005-2-25 13:00:00 | 只看该作者
不好意思,另一个模块是用来重排雷区的,那就要写权限了。我这一句是从那儿直接Ctrl+C过来的。

该用户从未签到

4
发表于 2005-3-19 02:36:00 | 只看该作者
程序是我最弱的方面~~  向你们学习

该用户从未签到

5
发表于 2005-3-19 09:05:00 | 只看该作者

我对这个东西放弃了,Eagle,给个怎么查找想要的内存地址的教程,比如你找到雷排列的地址的过程

还有olldbg的教程,哪里有?

本版积分规则

关闭

下沙大学生网推荐上一条 /1 下一条

快速回复 返回顶部 返回列表