下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2005-2-24 17:02:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在NT系统里,一个进程只允许对本身内存和共享内存进行读写(如果说错了请告诉我): {1 U, a+ z* Q: X8 p 但经过处理后,我们可以访问安全级别不是很高的进程内存。 % H8 ?) q5 t( K我们在OpenProcess时,如果能取得它的PROCESS_VM_READ、PROCESS_VM_WRITE和PROCESS_VM_OPERATION权限,那就好办了。5 @7 Y5 P7 S+ x) R1 |- E; m 下面是我编的一个自动扫雷程序的核心代码,它从扫雷程序的内存中读取地雷的分布情况,再通过模拟鼠标点击来扫雷 / P5 v6 [3 s" [+ {注意,这儿地雷在内存中的分布,是在中文XP下跟踪所得,不知道在其它系统上是不是一样的。* w8 ~8 g8 }; B HWND hwnd; & \# ~) E( M: O9 s HANDLE hProcess = NULL; - @8 }' f3 [7 W# J DWORD id;1 a) f; L/ K$ e BYTE tmpValue;3 Y0 ^6 O! U+ q- @, H) V, N/ V DWORD bytes;5 a! u7 c3 F# r+ ?; D CPoint point;: b n8 N7 y" [* k) R7 d CRect rect;. Z# A6 P+ a k2 J int intWidth, intHeight, i, j; - r1 O& s' U4 {% {/ C0 E' | //找到扫雷游戏的窗口,如果找不到,就出错。/ O; l( j5 r$ D' z1 l: K hwnd = ::FindWindow(NULL, "扫雷");* l( V6 \) w7 I9 n2 v* _( ]8 A if (!hwnd)2 Z/ |% J0 Y# h { $ ]5 j/ M% S5 D, b7 M MessageBox("没有找到扫雷游戏", NULL, MB_OK|MB_ICONINFORMATION);9 x% i' g T: Z8 q return; # r0 T$ | c) V1 l9 l0 G }9 ^* y0 i1 A/ `. _ //从窗口ID得到它的进程ID & z6 n; F- x. q ::GetWindowThreadProcessId(hwnd, &id);$ e9 `/ ^1 f B: S) ]; _: z //得到它的进程句柄 ( m+ g# K, y0 k- n# J, K: w hProcess = ::OpenProcess(STANDARD_RIGHTS_REQUIRED| " I# [1 Q; p4 d2 V PROCESS_VM_READ| ' G, }3 l z) z7 B0 c2 Y PROCESS_VM_WRITE| / Y- B( E3 q) z' B6 V$ W+ u" n- b PROCESS_VM_OPERATION, FALSE, id);" H2 b9 l p' P- D" `1 m! u //检查雷区的区域, @3 J7 e( }8 f$ U ::ReadProcessMemory(hProcess, (void *)0x01005334, (void *)&tmpValue, 1, &bytes);$ s r: h R% }) U. M& G8 o intWidth = tmpValue;" }6 Q6 t/ I" { ) j- ]( q" P( `! y" R ::ReadProcessMemory(hProcess, (void *)0x01005338, (void *)&tmpValue, 1, &bytes); 6 c! p# `8 i( }/ L7 n$ }5 ^* M intHeight = tmpValue;8 Z+ s. E$ k. d3 Z. C ::SetForegroundWindow(hwnd); ) g! d' C/ D0 s0 A4 [2 R ::GetWindowRect(hwnd, &rect);% M: Y) m: q0 _& E ::SetWindowPos(hwnd, HWND_TOP, rect.left, rect.top, 0, 0, SWP_NOSIZE); , p& k- ~! x5 X6 d& v9 @+ S / {* t( {, ^+ |1 A for (i = 1; i <= intHeight; i ++)) a/ d1 f# y- G' `0 f( c# H+ J0 A {. T9 n5 X; l+ D( B4 T for (j = 1; j <= intWidth; j ++) ' ^0 F3 t4 M/ n" S0 N1 c4 i6 V( ~ {) }5 o2 }- A- r M: \ ::ReadProcessMemory(hProcess, (void *)(0x01005340 + i * 32 + j), 0 j' s; G0 v" E: d# ` (void *)&tmpValue, 1, &bytes);$ N( R$ q+ m5 e1 ^" o( F7 v if ((tmpValue & 0x80) != 0x80) Y9 u6 D" d" }4 v {5 Q% _" Q1 J! U) Y6 u) v" H point.x = 7 + j * 16 + rect.left; 9 w f' A* Y5 ~5 O( W point.y = 96 + i * 16 + rect.top;; T0 T+ g. d$ ~5 h3 a# Z ::SetCursorPos(point.x, point.y);% ~" X) k# r9 B/ [2 R mouse_event(MOUSEEVENTF_LEFTDOWN, point.x, point.y, 0, 0); # u, o0 a7 ^* J" i mouse_event(MOUSEEVENTF_LEFTUP, point.x, point.y, 0, 0);, b& w. O; `1 S& f( D6 A) e }9 m' O8 ]- T6 { W$ g5 T }+ `7 X; e+ C' }& t1 U# W' H# x, W }; {$ I3 b: X1 O5 o# ?" F9 `) [ ::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 下一条

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