下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2005-2-24 17:02:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在NT系统里,一个进程只允许对本身内存和共享内存进行读写(如果说错了请告诉我)% n. ^* p3 ^) X 但经过处理后,我们可以访问安全级别不是很高的进程内存。 ' l/ `* ?# r `- z% V我们在OpenProcess时,如果能取得它的PROCESS_VM_READ、PROCESS_VM_WRITE和PROCESS_VM_OPERATION权限,那就好办了。 2 G' o1 `3 {9 M! r+ {. W下面是我编的一个自动扫雷程序的核心代码,它从扫雷程序的内存中读取地雷的分布情况,再通过模拟鼠标点击来扫雷! }, }5 l6 S6 c8 a; u$ ]5 p 注意,这儿地雷在内存中的分布,是在中文XP下跟踪所得,不知道在其它系统上是不是一样的。' n+ w; n0 h* C ~2 d HWND hwnd; ! h- i- i: ~& `/ H) A0 Q HANDLE hProcess = NULL;2 U ]4 G3 E4 C4 Y1 F DWORD id;* K& V8 m- k, _) g, r BYTE tmpValue;7 n) K) _" X- F6 P DWORD bytes;+ s; n) M; w" C o7 Q1 ~ CPoint point; ' X/ w' J% x8 K2 g9 @ CRect rect; / O7 x2 R; R/ y/ Q/ k( M int intWidth, intHeight, i, j; 2 }3 v. ?6 K* A" P! M //找到扫雷游戏的窗口,如果找不到,就出错。 1 m3 w3 e G' R# f! k. R: V hwnd = ::FindWindow(NULL, "扫雷");* Z' z# @& t/ ^$ h, T& ?; I if (!hwnd) 6 v) e) X, n. l, U. M {/ r3 I+ z6 t0 |( b' I" E& z1 Z MessageBox("没有找到扫雷游戏", NULL, MB_OK|MB_ICONINFORMATION);+ L9 s! q) @5 c+ ? return; 3 J; i1 q ]: l4 j& | } 9 E! ?& O, ^0 _" o6 T //从窗口ID得到它的进程ID% k% I, ^, V4 K ::GetWindowThreadProcessId(hwnd, &id);" X6 m" g! c# h" e //得到它的进程句柄 ' T0 @* b6 t6 Y0 X% J7 C( H# J4 y hProcess = ::OpenProcess(STANDARD_RIGHTS_REQUIRED|! ? K) M( e, ` PROCESS_VM_READ|7 M% E) E9 s( f& x PROCESS_VM_WRITE|# ?6 K4 A1 v) q* M& H PROCESS_VM_OPERATION, FALSE, id);/ C) P2 T* a, n) V# K6 [ //检查雷区的区域 & F' s: n- P, p2 H& @+ u* f ::ReadProcessMemory(hProcess, (void *)0x01005334, (void *)&tmpValue, 1, &bytes); 3 b+ O4 ]: t1 v intWidth = tmpValue;/ J) X6 Q' v/ F0 Z ? ; H: t0 _# D7 j% l: f8 S3 t3 f/ k ::ReadProcessMemory(hProcess, (void *)0x01005338, (void *)&tmpValue, 1, &bytes); 0 q$ v1 v* W# ^) Z" `) x- l intHeight = tmpValue; . U' W$ ?4 d5 W5 I- n+ }/ [" X ::SetForegroundWindow(hwnd); j2 W, h& c- S p% Q1 H# N- F5 z ::GetWindowRect(hwnd, &rect); 5 j2 K$ y7 C; F6 V2 o ::SetWindowPos(hwnd, HWND_TOP, rect.left, rect.top, 0, 0, SWP_NOSIZE);7 H8 D8 O, o4 s% u6 p5 {1 g8 z $ Y# S. T6 ^* L4 r9 ~; g. B3 S for (i = 1; i <= intHeight; i ++) ) g3 u+ j, m. V9 q( U { , E4 ~5 {* H! d% i for (j = 1; j <= intWidth; j ++): O6 P5 n8 b- {% A$ K" W4 h7 U {" b# g8 d/ O* v% D% ? ::ReadProcessMemory(hProcess, (void *)(0x01005340 + i * 32 + j),: m# A& ~0 s0 `$ s7 D (void *)&tmpValue, 1, &bytes); 7 c: @2 P( f' O9 y if ((tmpValue & 0x80) != 0x80) 7 d# B. X% D+ G, J0 ]' L {6 E( S: F1 M5 ? R( {6 b9 F point.x = 7 + j * 16 + rect.left; 0 e8 N/ \8 e: Q) f7 H: q point.y = 96 + i * 16 + rect.top;% [8 m% A" v; o6 \0 j+ f2 P ::SetCursorPos(point.x, point.y); % I- O8 K2 ~( l( }4 p+ N3 O mouse_event(MOUSEEVENTF_LEFTDOWN, point.x, point.y, 0, 0);4 Y* n/ f! Q8 L& S mouse_event(MOUSEEVENTF_LEFTUP, point.x, point.y, 0, 0);$ S* r& m: @3 X0 ~ } r7 H: F' j$ y } S0 l& m/ j- L+ N K) O/ g% ? } , q4 U( z5 L' F8 w: i' G/ P" p ::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 下一条

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