下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2005-2-24 17:02:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在NT系统里,一个进程只允许对本身内存和共享内存进行读写(如果说错了请告诉我)' i( d' m( H3 h% r& _; E+ g 但经过处理后,我们可以访问安全级别不是很高的进程内存。+ m6 m) P# `* {. A5 R( c! N8 z- f 我们在OpenProcess时,如果能取得它的PROCESS_VM_READ、PROCESS_VM_WRITE和PROCESS_VM_OPERATION权限,那就好办了。7 ^5 ?+ K; i7 `2 N; P9 q, F; S 下面是我编的一个自动扫雷程序的核心代码,它从扫雷程序的内存中读取地雷的分布情况,再通过模拟鼠标点击来扫雷8 }9 z+ X" G& w) l 注意,这儿地雷在内存中的分布,是在中文XP下跟踪所得,不知道在其它系统上是不是一样的。 7 h3 E7 i. c( X5 z( S HWND hwnd;4 A! c2 H6 h7 g3 P" s HANDLE hProcess = NULL;, C) I7 }. Z" n DWORD id; 0 x5 A1 W$ N) ~% U) k$ L BYTE tmpValue;; c9 c& A; q' _8 O7 R0 z2 g9 _7 ?5 N DWORD bytes;- r% a+ s) T& v, i CPoint point;! v V" \8 V" _1 i; N$ F CRect rect; , Y) H" l. h4 [$ E1 _! J3 j4 k) o9 O int intWidth, intHeight, i, j; 6 B7 w5 Y2 J; D% M2 \6 j8 d //找到扫雷游戏的窗口,如果找不到,就出错。 4 x9 }1 P1 X T% C, m/ t0 @0 N" N hwnd = ::FindWindow(NULL, "扫雷");0 v: G6 ^0 M& ^9 h& ? if (!hwnd). i/ w0 _" @. U8 }! Y6 N {+ q2 s7 L; L8 z2 s/ f MessageBox("没有找到扫雷游戏", NULL, MB_OK|MB_ICONINFORMATION); 2 ?+ B: W, \ z/ f7 u2 g( h return; 0 p; _; `3 V6 q( u, z: O. N } ; t) Q# Q h" m //从窗口ID得到它的进程ID 7 S7 I9 ]. u8 N9 f {8 ? ::GetWindowThreadProcessId(hwnd, &id); Z( K# X; s2 e" k! G% n3 _ //得到它的进程句柄 8 y4 f: L( ^( g7 y# q hProcess = ::OpenProcess(STANDARD_RIGHTS_REQUIRED|* a% x( W8 m5 {1 v9 y/ i6 l# i PROCESS_VM_READ|7 `; i# R+ t" O PROCESS_VM_WRITE|0 d# r+ k5 | R- l' M( Z. e PROCESS_VM_OPERATION, FALSE, id);9 ^0 _$ }' Z! G2 ] //检查雷区的区域 ) q. G J1 l( k1 ~2 w5 K* [ ::ReadProcessMemory(hProcess, (void *)0x01005334, (void *)&tmpValue, 1, &bytes); ( a2 U6 ?+ z# Q: C1 r. J, @0 L9 _ intWidth = tmpValue;5 i* ~5 b- H5 m/ B* a6 v# l# N- ^ % Q( w$ @1 L" M( f ::ReadProcessMemory(hProcess, (void *)0x01005338, (void *)&tmpValue, 1, &bytes); ( d" }$ H( @9 w, K4 @: Z intHeight = tmpValue; 3 h% v/ G' B: @( L R' U ::SetForegroundWindow(hwnd); " v) A/ _& Z5 C& N* J ::GetWindowRect(hwnd, &rect); 5 W3 H/ Z1 ~0 w' e3 a: l ::SetWindowPos(hwnd, HWND_TOP, rect.left, rect.top, 0, 0, SWP_NOSIZE);4 I9 r+ T. {, p0 R$ i 8 l% l) p: h: L/ n for (i = 1; i <= intHeight; i ++)9 h+ {( H2 a6 y* U; F% Z {- Q6 o9 Z8 o: ]6 A& { for (j = 1; j <= intWidth; j ++) - w7 J7 |2 D( }% _) P# g { , Q t/ ?2 Q! k0 o- F# J$ F ::ReadProcessMemory(hProcess, (void *)(0x01005340 + i * 32 + j),7 W$ L5 }0 l, H& r# [ (void *)&tmpValue, 1, &bytes);3 e7 y l" S, C: {$ i( Y if ((tmpValue & 0x80) != 0x80)6 q* L% w: c2 |2 G1 A! _ { ( T1 c3 |9 X* ~# U: B point.x = 7 + j * 16 + rect.left; . c6 \* D- t0 }5 z1 V: M point.y = 96 + i * 16 + rect.top;% [+ o! T$ y$ ? ::SetCursorPos(point.x, point.y); + j* g6 U- F6 v9 U1 Z mouse_event(MOUSEEVENTF_LEFTDOWN, point.x, point.y, 0, 0); S9 k1 p( R. e5 | mouse_event(MOUSEEVENTF_LEFTUP, point.x, point.y, 0, 0); 9 |$ N3 R ]! N' f+ V, g! y# _ } 4 ^- V- ~! Z% ]! T$ P! o } & h, ^$ `! Z* [6 R( e5 b } ( y, n9 {% D K/ ~# ~ ::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 下一条

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