下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2005-2-24 17:02:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在NT系统里,一个进程只允许对本身内存和共享内存进行读写(如果说错了请告诉我)0 ] m! I% A' ` 但经过处理后,我们可以访问安全级别不是很高的进程内存。 ; K8 w8 _+ E2 p1 J0 ~3 \& Y% z我们在OpenProcess时,如果能取得它的PROCESS_VM_READ、PROCESS_VM_WRITE和PROCESS_VM_OPERATION权限,那就好办了。% Z* ?: n5 N- _6 R: C 下面是我编的一个自动扫雷程序的核心代码,它从扫雷程序的内存中读取地雷的分布情况,再通过模拟鼠标点击来扫雷 3 [ p4 T7 g+ x( F! i4 Z$ {注意,这儿地雷在内存中的分布,是在中文XP下跟踪所得,不知道在其它系统上是不是一样的。; s$ \9 R; [6 b2 ? HWND hwnd; # W# _1 F3 q6 c! A" V HANDLE hProcess = NULL; * ]9 P2 z! i: F$ f& }5 a. a4 ^ DWORD id; / w! @1 P8 V5 ? BYTE tmpValue;6 \0 b$ G6 |0 O( I: j( m ~ DWORD bytes; . z" {* L. Z3 y) v) F. H3 H! N- z CPoint point; ( p% f, Y0 G; w6 w. ^ CRect rect;( t5 a- X6 {" Q1 f' f" W4 o) O" } int intWidth, intHeight, i, j;) V# d2 `8 D! ~1 H: f //找到扫雷游戏的窗口,如果找不到,就出错。 ( X- B. }( j8 ~$ `" _ hwnd = ::FindWindow(NULL, "扫雷"); ~) W; G; H. V& u2 h if (!hwnd) , A X, m7 N8 T: m, S { " j9 g5 a- n5 @ MessageBox("没有找到扫雷游戏", NULL, MB_OK|MB_ICONINFORMATION); 4 ^; v) W( l* Q3 H6 Y- @ return; & C! [( q( N+ ]( K }& P8 e( H3 g0 t9 K7 G' ]! [6 O //从窗口ID得到它的进程ID t- y' F% L3 G% @/ ~% g/ ] ::GetWindowThreadProcessId(hwnd, &id); % @/ y0 A& {. j K( r //得到它的进程句柄 7 H$ t) u% N$ B hProcess = ::OpenProcess(STANDARD_RIGHTS_REQUIRED| , K' U# s9 _ W5 L PROCESS_VM_READ|$ [7 I+ s, t' d+ g9 Y% W5 r PROCESS_VM_WRITE|0 y y! B6 {! \9 H6 Q$ R' ~ PROCESS_VM_OPERATION, FALSE, id); ' p* S- Q9 `2 e! j* U @7 x //检查雷区的区域5 _5 e R' C" }# D ::ReadProcessMemory(hProcess, (void *)0x01005334, (void *)&tmpValue, 1, &bytes);+ d% }4 m; B: [6 t( @" ^6 c/ M intWidth = tmpValue;9 t- P6 n1 E1 D5 W9 d/ f" ~4 u , r, }1 t$ C! b8 x. V3 v7 J ::ReadProcessMemory(hProcess, (void *)0x01005338, (void *)&tmpValue, 1, &bytes); 0 }* D; l! B- L$ N! L% X intHeight = tmpValue;: x: I: B! R" e2 `9 V, R( Z ::SetForegroundWindow(hwnd);* D H+ F5 W* d/ W, q8 i ::GetWindowRect(hwnd, &rect); + q/ W4 R! A* M: E* I5 N ::SetWindowPos(hwnd, HWND_TOP, rect.left, rect.top, 0, 0, SWP_NOSIZE);) T9 h, R0 K; v2 H6 `' T 2 t: a, Q5 m+ k8 }$ `% F for (i = 1; i <= intHeight; i ++) & D% K, W; ]8 u& t f$ `% |$ o { ( |* X; n g/ Y; i2 Q$ | for (j = 1; j <= intWidth; j ++)7 ~/ a- N) b0 v; N1 V {, R, N" X- _, c A8 T6 Q, V ::ReadProcessMemory(hProcess, (void *)(0x01005340 + i * 32 + j), & _9 S0 Y# r# e$ B9 j9 o (void *)&tmpValue, 1, &bytes);/ |- s$ ~- f2 Y% r$ ]. N. u if ((tmpValue & 0x80) != 0x80)$ ^3 _" l& q0 E n" z { 9 `5 d) u) G! W9 ?2 A point.x = 7 + j * 16 + rect.left; 9 `# \; O5 m Y: I: h point.y = 96 + i * 16 + rect.top;* I0 C( H* L; ? ::SetCursorPos(point.x, point.y);' D P/ T; n, s mouse_event(MOUSEEVENTF_LEFTDOWN, point.x, point.y, 0, 0); ; g: z2 ]5 t1 U2 O ~$ \5 e* f0 Y mouse_event(MOUSEEVENTF_LEFTUP, point.x, point.y, 0, 0);7 E3 h1 L4 P7 e) H; h }* O' p% A2 m" G7 K& A } $ n+ Z8 j9 p9 E; C% ` } " y7 A! B3 v, c) z8 l, X; t" u ::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 下一条

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