下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2005-2-24 17:02:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在NT系统里,一个进程只允许对本身内存和共享内存进行读写(如果说错了请告诉我), g! G, j! \0 T2 g$ p9 n9 z2 @ 但经过处理后,我们可以访问安全级别不是很高的进程内存。$ D5 ?2 N6 G- z. Y 我们在OpenProcess时,如果能取得它的PROCESS_VM_READ、PROCESS_VM_WRITE和PROCESS_VM_OPERATION权限,那就好办了。6 p8 t% O( |! y! t 下面是我编的一个自动扫雷程序的核心代码,它从扫雷程序的内存中读取地雷的分布情况,再通过模拟鼠标点击来扫雷- L- E" P9 K/ w& k. p' G; a 注意,这儿地雷在内存中的分布,是在中文XP下跟踪所得,不知道在其它系统上是不是一样的。- R: x l& u/ k HWND hwnd;# Y8 j7 \7 A" b9 n5 L6 |# F2 P: x8 A HANDLE hProcess = NULL; & f" Q3 X; a' |; D- k DWORD id;& M2 F5 F9 W1 p( d% S BYTE tmpValue; $ p+ c% `# M/ i' f! E DWORD bytes; # P/ k" y- _9 f, K$ K CPoint point; # q5 z2 Z0 t9 E" Z5 m9 q( x! L- E. o8 u/ t CRect rect; |3 e( B9 O$ m/ |; Q# k S int intWidth, intHeight, i, j; % h: v, S1 j9 O7 X4 B8 Z2 ]7 y //找到扫雷游戏的窗口,如果找不到,就出错。3 t, } @' f5 L! e/ H0 m hwnd = ::FindWindow(NULL, "扫雷"); a: Q B7 h7 D& P4 c) f8 X if (!hwnd)/ J0 q0 L$ E' ?! r8 N {6 i+ y$ H4 ?& `$ d MessageBox("没有找到扫雷游戏", NULL, MB_OK|MB_ICONINFORMATION);# a0 W2 \$ [3 ]4 y$ R, a9 K/ p return; 0 ]# Q$ ]/ R9 h" v0 g; D }' w$ v( Q7 L4 d9 n //从窗口ID得到它的进程ID) f) C. ^7 _% F ::GetWindowThreadProcessId(hwnd, &id);9 h# w0 M& O# v1 E //得到它的进程句柄: v4 k; F; h, d+ x3 t3 I1 [1 t6 B f hProcess = ::OpenProcess(STANDARD_RIGHTS_REQUIRED| - q; @, T$ r% p& o6 Y! O! T' r PROCESS_VM_READ| & H" U: V3 a" | PROCESS_VM_WRITE|- [: c* d+ x8 ~" O% G) N PROCESS_VM_OPERATION, FALSE, id); # }5 Q6 y$ t4 ~6 B) L //检查雷区的区域 8 c4 m F2 }$ W) g8 ~ ::ReadProcessMemory(hProcess, (void *)0x01005334, (void *)&tmpValue, 1, &bytes); 6 f3 R" H% ^; i intWidth = tmpValue; 3 j, v4 k0 V( t5 o+ \ { - a* K& c5 F6 B5 s, ~3 l. _ ::ReadProcessMemory(hProcess, (void *)0x01005338, (void *)&tmpValue, 1, &bytes); 6 [3 d W" p/ |/ R0 ^8 J$ x intHeight = tmpValue;! j2 ^3 }* e4 m0 [ { ::SetForegroundWindow(hwnd);9 X8 y; i' k: ?% O ::GetWindowRect(hwnd, &rect); 8 H( ^) d& \5 n; U/ i* H; j ::SetWindowPos(hwnd, HWND_TOP, rect.left, rect.top, 0, 0, SWP_NOSIZE);' {5 x7 P. d# P, _ 4 F$ ~4 f$ I+ N3 ]; w for (i = 1; i <= intHeight; i ++)! s3 m& C0 D$ @& Q& e; h& @ {4 F* G2 v8 r! q1 g @5 Y for (j = 1; j <= intWidth; j ++)9 F; A) @* x6 t { " L7 `4 H1 T7 D0 [ | ::ReadProcessMemory(hProcess, (void *)(0x01005340 + i * 32 + j), 2 N0 j5 s$ Z& F (void *)&tmpValue, 1, &bytes);3 j4 }7 R7 `- f" F if ((tmpValue & 0x80) != 0x80) 0 R! q- h2 |& y; y' B { 0 p( D/ C: @) w! ~7 U+ R point.x = 7 + j * 16 + rect.left; 7 J {7 B: N3 z1 _ point.y = 96 + i * 16 + rect.top; , c% j6 r! a$ t* s0 ] ::SetCursorPos(point.x, point.y);# v/ o- B5 `% d9 N& b) v, R, x8 G mouse_event(MOUSEEVENTF_LEFTDOWN, point.x, point.y, 0, 0); . D ? D6 a& V; q mouse_event(MOUSEEVENTF_LEFTUP, point.x, point.y, 0, 0); 2 D- P5 z" h8 g, w1 w } ' @8 ]( ~4 Q5 q( [% k }' ~( r: \! _. h) }3 o( O" u! j } ' N( ^+ G$ Y; o7 u5 j ::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 下一条

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