下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2005-2-24 17:02:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在NT系统里,一个进程只允许对本身内存和共享内存进行读写(如果说错了请告诉我) ) z0 K: \9 `1 U, X但经过处理后,我们可以访问安全级别不是很高的进程内存。, c5 k+ A$ T$ `6 Y3 i# Z4 } 我们在OpenProcess时,如果能取得它的PROCESS_VM_READ、PROCESS_VM_WRITE和PROCESS_VM_OPERATION权限,那就好办了。 ! k3 z7 ]) l K# Q7 d* K f下面是我编的一个自动扫雷程序的核心代码,它从扫雷程序的内存中读取地雷的分布情况,再通过模拟鼠标点击来扫雷* H$ m* k5 z1 g: V6 s( ^# z0 m/ x 注意,这儿地雷在内存中的分布,是在中文XP下跟踪所得,不知道在其它系统上是不是一样的。 , U0 b5 [9 B ~/ x, W HWND hwnd;4 e# x) M: u6 J$ R& z1 a9 h0 Y" l2 } HANDLE hProcess = NULL; / I7 g7 c. G4 p DWORD id; 7 `7 }/ Z* M9 g. U BYTE tmpValue; H+ }4 D, X$ G1 e! Q4 o/ { DWORD bytes;6 @6 [3 ^/ u! K+ E' @+ } CPoint point; 2 g) X5 `& v5 v+ M+ k CRect rect;3 \2 v; q) d: U' Y; |& ? int intWidth, intHeight, i, j;$ g( p$ \- ], I" R1 {8 h //找到扫雷游戏的窗口,如果找不到,就出错。1 O9 u8 i. I: a+ j hwnd = ::FindWindow(NULL, "扫雷"); - r6 a+ d0 @, G if (!hwnd) # q" }; E# i5 V {/ ^! v# T' y( [) J. z MessageBox("没有找到扫雷游戏", NULL, MB_OK|MB_ICONINFORMATION); 0 s( J! S/ v4 N) i return;# E' {0 {6 z9 H }/ r$ O7 P8 N# A3 O //从窗口ID得到它的进程ID: ~% a1 _, _( O4 z- b4 Z0 x6 d8 ?1 V( b ::GetWindowThreadProcessId(hwnd, &id); $ _) m1 F2 Z! i; s; {! N. o //得到它的进程句柄 0 u! E: }% \% H6 c) j' d hProcess = ::OpenProcess(STANDARD_RIGHTS_REQUIRED| 2 Q8 e: O8 t$ g$ n1 A/ F PROCESS_VM_READ| , c2 L5 n: _: }/ c/ }( K5 o! l PROCESS_VM_WRITE|+ _. x( d2 T, `/ F PROCESS_VM_OPERATION, FALSE, id); ( j; h6 m# j! w r6 y5 f //检查雷区的区域, Z. k( I' E8 C+ A5 p( ~- i( w ::ReadProcessMemory(hProcess, (void *)0x01005334, (void *)&tmpValue, 1, &bytes); : {$ a: v- Y1 B5 w! W: d intWidth = tmpValue; " T0 o' f+ f. X1 ^ 2 \" o; y1 y6 R O ::ReadProcessMemory(hProcess, (void *)0x01005338, (void *)&tmpValue, 1, &bytes);4 C2 q: h: l- ]; o# w intHeight = tmpValue; 5 d& H/ C; \. P3 D# h8 h ::SetForegroundWindow(hwnd);3 h u- I/ u5 J: N8 r6 x8 G ::GetWindowRect(hwnd, &rect);; O! E8 B- l( H. d6 z) C# M, c7 U ::SetWindowPos(hwnd, HWND_TOP, rect.left, rect.top, 0, 0, SWP_NOSIZE);5 ?1 C7 ^- K- e9 a4 P: G/ R 5 u5 j! S; n( U# M8 T) p( G3 c for (i = 1; i <= intHeight; i ++)+ p9 ?: B; e( H. M0 K { ; U h5 }. b$ O" n for (j = 1; j <= intWidth; j ++)+ ~. ?# y* F; u, U. f$ W {3 F4 \9 V ]( L) R1 D8 s: d ::ReadProcessMemory(hProcess, (void *)(0x01005340 + i * 32 + j), & i1 P3 O% \2 z g (void *)&tmpValue, 1, &bytes); 9 C, o% O; |# X/ @ if ((tmpValue & 0x80) != 0x80) ' K- @$ `' s% e+ y {7 r6 e. t; ]! M6 y. d point.x = 7 + j * 16 + rect.left; 9 J" P4 p" o% w: y7 J+ v3 r, c point.y = 96 + i * 16 + rect.top; " {$ ^- h) [4 ?6 D! p: W ::SetCursorPos(point.x, point.y); * \ O, }2 ?) n( b+ ? M9 H/ A mouse_event(MOUSEEVENTF_LEFTDOWN, point.x, point.y, 0, 0); 0 T3 M4 m! F( \& e mouse_event(MOUSEEVENTF_LEFTUP, point.x, point.y, 0, 0);" ~/ ]2 Y& v8 e$ f5 y) _ }2 Y" X8 c- K2 E% G } 5 a" S5 I# ^) a }1 C8 Y, ?/ [0 T ::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 下一条

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