下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2005-2-24 17:02:00 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
在NT系统里,一个进程只允许对本身内存和共享内存进行读写(如果说错了请告诉我)& ^ z5 T0 N* n w6 x1 \+ d 但经过处理后,我们可以访问安全级别不是很高的进程内存。 5 |5 f# s) y$ u3 M* C7 z0 n, g我们在OpenProcess时,如果能取得它的PROCESS_VM_READ、PROCESS_VM_WRITE和PROCESS_VM_OPERATION权限,那就好办了。8 q3 `& {) J8 i9 T1 J 下面是我编的一个自动扫雷程序的核心代码,它从扫雷程序的内存中读取地雷的分布情况,再通过模拟鼠标点击来扫雷 6 {7 t& E( l3 o- s! Z4 H, H4 r注意,这儿地雷在内存中的分布,是在中文XP下跟踪所得,不知道在其它系统上是不是一样的。2 C+ q$ c3 J' {+ J/ s9 F HWND hwnd; 6 z3 q! `4 e Q* |; l) r3 `2 J$ ~ HANDLE hProcess = NULL; ; X* ^$ D$ \( y9 A$ {4 M: G DWORD id; $ V7 A' w. i, }/ U- X BYTE tmpValue; 4 x+ Q% w4 {. J0 d DWORD bytes; ) r# C7 c) K: P8 V CPoint point; $ n* \6 L8 B' j) D2 l R' ~. ] CRect rect;, D$ x- \- s1 h# R int intWidth, intHeight, i, j; " g2 d. G2 r* U //找到扫雷游戏的窗口,如果找不到,就出错。9 m M# t; R. j; | v hwnd = ::FindWindow(NULL, "扫雷");' q' E8 g! H* S t) x4 E" k0 V if (!hwnd)/ k) X E s0 J" l2 n. o { ! L3 x" k- F3 S, Z MessageBox("没有找到扫雷游戏", NULL, MB_OK|MB_ICONINFORMATION);% j: Z( F7 I7 k& |- ~% {0 f* m" P% B0 K return; ; n! x+ M$ b+ c. [ } 0 B! ?# O/ n; h5 K' U) S //从窗口ID得到它的进程ID n% p6 J( I2 J( ^: Z) X/ E ::GetWindowThreadProcessId(hwnd, &id);( n+ J8 k8 m& e9 C) A* ~$ J //得到它的进程句柄 ; ~) H9 p1 D( t" _. S F hProcess = ::OpenProcess(STANDARD_RIGHTS_REQUIRED|7 j- C/ H5 x% a9 z0 H PROCESS_VM_READ| 3 W& E }, Z, Z' l2 |! ] PROCESS_VM_WRITE| / q8 W# F0 U9 a; s& Q PROCESS_VM_OPERATION, FALSE, id); 8 p- H7 ^+ h/ g8 E a //检查雷区的区域 9 x/ h; I5 z9 C. p4 O2 z% ~ ::ReadProcessMemory(hProcess, (void *)0x01005334, (void *)&tmpValue, 1, &bytes); : Y" `; Z. n# O) r4 A6 ?: e intWidth = tmpValue;+ g0 ]# k) Y1 J# A' F & e0 s: A7 B+ W& s ::ReadProcessMemory(hProcess, (void *)0x01005338, (void *)&tmpValue, 1, &bytes); , e1 K- c- X. O g- z4 n7 `4 Z# l intHeight = tmpValue; % s' O2 g. v/ O& c' [8 { ::SetForegroundWindow(hwnd); ( T! y' L. v/ {) m ::GetWindowRect(hwnd, &rect);1 G6 @! O/ t! w% X+ ~4 c ::SetWindowPos(hwnd, HWND_TOP, rect.left, rect.top, 0, 0, SWP_NOSIZE);, z5 g. N6 o/ W) B( w4 X: Z; [0 \ 4 `, h5 }5 A1 E2 N8 \ for (i = 1; i <= intHeight; i ++) 9 t- V% v" w8 _* i1 w" l { + ^! z1 }# d5 i/ e. @4 T for (j = 1; j <= intWidth; j ++)2 G! l, _1 {! k7 Q/ x { " H: h4 j8 U$ I9 F) h. z3 D# R+ {0 _ ::ReadProcessMemory(hProcess, (void *)(0x01005340 + i * 32 + j), % v9 E2 L8 O+ w. d1 g+ z( q) Z (void *)&tmpValue, 1, &bytes); ' n8 q9 o( M# R9 m# K8 e if ((tmpValue & 0x80) != 0x80) + x1 Y: n3 O, Y3 l {1 Q) j+ i7 z+ U# i8 r' d, ] point.x = 7 + j * 16 + rect.left;: ]1 h$ D' i+ C B( ~8 }- i, Z2 L point.y = 96 + i * 16 + rect.top; ! m4 ~& j: c0 t: y( U ::SetCursorPos(point.x, point.y); / ~9 v- m# j# @" c; R mouse_event(MOUSEEVENTF_LEFTDOWN, point.x, point.y, 0, 0);8 U& Y8 I3 W( b' Y% F mouse_event(MOUSEEVENTF_LEFTUP, point.x, point.y, 0, 0); . U4 r5 Y7 q% z, Z1 n2 W: K } : o( G% I- H- g- M5 b; J }$ ?( g. ]$ _0 e* K& \. n$ t- m- ~ }+ L- A! j0 n6 B+ e2 l4 X9 f ::CloseHandle(hProcess);
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩 转发到微博

该用户从未签到

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

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

还有olldbg的教程,哪里有?

该用户从未签到

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

该用户从未签到

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

该用户从未签到

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

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

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