下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2005-2-24 17:02:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在NT系统里,一个进程只允许对本身内存和共享内存进行读写(如果说错了请告诉我)9 u& C7 F& w. ~, b( A) ], Y 但经过处理后,我们可以访问安全级别不是很高的进程内存。4 I$ y, Y0 F0 ]- L& V9 C6 X 我们在OpenProcess时,如果能取得它的PROCESS_VM_READ、PROCESS_VM_WRITE和PROCESS_VM_OPERATION权限,那就好办了。 . R$ G: N5 p8 c: p# f8 U下面是我编的一个自动扫雷程序的核心代码,它从扫雷程序的内存中读取地雷的分布情况,再通过模拟鼠标点击来扫雷8 `8 k$ x, A" Y" ?, b0 J 注意,这儿地雷在内存中的分布,是在中文XP下跟踪所得,不知道在其它系统上是不是一样的。 : c: G4 k4 x4 @ q0 q% j HWND hwnd; 4 \# ]0 X5 f- r HANDLE hProcess = NULL; ! i' g9 W' \' v, r8 o% q! L DWORD id; % v1 G, \, O& i% A! A& `6 y BYTE tmpValue;& ~. [0 x# j- Z0 Q5 o* V* r DWORD bytes; . j/ p; V5 e7 E; \+ \ CPoint point;, j4 y% {# o, M5 f" l3 Z/ q1 T2 B CRect rect; ) i. w+ v. M9 f @) P int intWidth, intHeight, i, j;4 V# \% g5 y$ y0 @; J0 Q //找到扫雷游戏的窗口,如果找不到,就出错。' p$ _4 K) i5 |# R/ |8 }7 A hwnd = ::FindWindow(NULL, "扫雷"); + a1 K5 v8 w o; W0 O6 E if (!hwnd)- z* j i4 ?6 Q+ X% r1 b3 s0 \ {/ x7 y% m! Z" b9 R MessageBox("没有找到扫雷游戏", NULL, MB_OK|MB_ICONINFORMATION);3 x6 q! `5 I- ~8 H. f4 I return; 5 t, K7 f) K7 B( y) K/ @ } ! y; f8 C8 c- D1 _ //从窗口ID得到它的进程ID* |! x9 A0 \% Z; l1 Q( B3 @; \ ::GetWindowThreadProcessId(hwnd, &id);- @1 M# w Y* G4 L //得到它的进程句柄* u9 I5 s* `# F! o E- B, J" `/ f hProcess = ::OpenProcess(STANDARD_RIGHTS_REQUIRED|* Y$ f: t! @ w% S2 t3 i PROCESS_VM_READ| ( I$ {; h) g$ h% g* ^' t3 [& p PROCESS_VM_WRITE| ' s+ ^! t; w# P( P8 n$ i2 N PROCESS_VM_OPERATION, FALSE, id);8 X1 S6 J" y9 E B& O | //检查雷区的区域6 a) A& \- u' V* C ::ReadProcessMemory(hProcess, (void *)0x01005334, (void *)&tmpValue, 1, &bytes);# \1 j, f5 f1 b$ D! Y* V1 S& v intWidth = tmpValue;3 S# p {$ w) I3 p5 R - Q4 l/ F/ R; F5 a6 Y7 Q ::ReadProcessMemory(hProcess, (void *)0x01005338, (void *)&tmpValue, 1, &bytes); ; B' b2 y) \! t4 L6 } k* n intHeight = tmpValue;9 k2 l& P1 E7 a3 X# w* ? ::SetForegroundWindow(hwnd);$ n; }( s* l" J3 g* C ::GetWindowRect(hwnd, &rect);+ ] Q* B* z, l ::SetWindowPos(hwnd, HWND_TOP, rect.left, rect.top, 0, 0, SWP_NOSIZE); 1 W- a3 k- w% B& Y/ a. {1 g ) f0 R3 j/ s3 {# K* E5 q: x) a$ e for (i = 1; i <= intHeight; i ++) 7 {$ P0 q: u2 X% h9 f, o: t4 E. M { ) C8 `# w, m3 g8 N" Q0 q for (j = 1; j <= intWidth; j ++)5 E) e, n+ a% G0 O: t; R0 [ { B2 m6 W( r' {7 b6 d ::ReadProcessMemory(hProcess, (void *)(0x01005340 + i * 32 + j), 6 P. K4 J2 }/ G2 u (void *)&tmpValue, 1, &bytes); 6 n i. L, s! ^; i& |$ U8 J7 f if ((tmpValue & 0x80) != 0x80)0 W4 }8 c# t! H% c2 O7 e {8 P, F) M+ G: j$ e. I* n% L point.x = 7 + j * 16 + rect.left;7 B' ]- {5 D, E$ Y3 G( m point.y = 96 + i * 16 + rect.top; ( ]! m+ x2 X: u3 X& l6 B) [ ::SetCursorPos(point.x, point.y); 6 H5 K4 {( c8 u2 m) Z! o mouse_event(MOUSEEVENTF_LEFTDOWN, point.x, point.y, 0, 0); 1 d4 _$ h9 L- j( V" t2 b mouse_event(MOUSEEVENTF_LEFTUP, point.x, point.y, 0, 0);! B2 y# C$ A/ o# o }& e) W" C; n* n8 z { } # Q& {# b2 h0 n; S" x Q }- Q1 \4 B9 M1 d. s! X ::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 下一条

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