下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2005-2-24 17:02:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在NT系统里,一个进程只允许对本身内存和共享内存进行读写(如果说错了请告诉我) $ { B z2 @4 l$ t, n2 i d: D. K7 r5 w但经过处理后,我们可以访问安全级别不是很高的进程内存。 ) `5 W" H1 l# k' t* _$ g; ^6 c我们在OpenProcess时,如果能取得它的PROCESS_VM_READ、PROCESS_VM_WRITE和PROCESS_VM_OPERATION权限,那就好办了。 6 Y0 W% n5 E. z3 p下面是我编的一个自动扫雷程序的核心代码,它从扫雷程序的内存中读取地雷的分布情况,再通过模拟鼠标点击来扫雷 $ A& D5 y' u5 \5 c; E注意,这儿地雷在内存中的分布,是在中文XP下跟踪所得,不知道在其它系统上是不是一样的。 ) B7 Z; \0 B1 N8 Q }* N1 o HWND hwnd; & q3 A6 q; o2 P6 c HANDLE hProcess = NULL;3 o( I+ G4 p& J. ]+ F DWORD id;+ k- m* x0 i; u4 U0 S0 k BYTE tmpValue; + `* r, Q. U0 B DWORD bytes; : f& q% H6 l) M+ q) K CPoint point; " n/ k' T( e" ^" ]/ N# c CRect rect;7 ]! E) |& p* Y1 ~5 h) b$ H int intWidth, intHeight, i, j; / l# ~4 T7 {: q+ c" G! C //找到扫雷游戏的窗口,如果找不到,就出错。 + w ^0 }# N8 H$ E: q$ l hwnd = ::FindWindow(NULL, "扫雷"); . L& ^: ^) B5 I/ \ if (!hwnd) 4 f+ x6 z3 F+ ?5 C3 B! e { 1 y* S* {( q _ v2 } MessageBox("没有找到扫雷游戏", NULL, MB_OK|MB_ICONINFORMATION);; n" ], N: d7 p2 r return;8 h6 s! ?% j! `, t7 Q, K }( r e: I7 M4 A //从窗口ID得到它的进程ID ! {$ O' X- _. L ::GetWindowThreadProcessId(hwnd, &id); 2 m- T8 A" T8 U: w: F. A5 W //得到它的进程句柄2 y' t4 h o: A9 b8 W hProcess = ::OpenProcess(STANDARD_RIGHTS_REQUIRED| ' P! u. x* p5 E2 B, C PROCESS_VM_READ| ; v2 r; p# G( m, h8 g PROCESS_VM_WRITE|# C$ u4 Z$ f' V/ U6 v1 a PROCESS_VM_OPERATION, FALSE, id); 2 e: X; T# ^; Y, I/ R. Y$ k% M //检查雷区的区域 * q! H1 }/ h* {' ]) b4 h ::ReadProcessMemory(hProcess, (void *)0x01005334, (void *)&tmpValue, 1, &bytes); 5 R5 @+ `3 e4 Q. r intWidth = tmpValue;& {4 p- ?! H) u8 }0 ^& R # H( W: M2 z3 g7 b4 A0 ^9 r8 F) | ::ReadProcessMemory(hProcess, (void *)0x01005338, (void *)&tmpValue, 1, &bytes); `+ o6 g$ @. `' d. o! p2 @* e intHeight = tmpValue;! H% q2 x9 g; n' T8 m ::SetForegroundWindow(hwnd); ' x, t8 x, Y, S* @ i3 Z' J" ` ::GetWindowRect(hwnd, &rect);* ?9 h. x' P. d$ i! ] ::SetWindowPos(hwnd, HWND_TOP, rect.left, rect.top, 0, 0, SWP_NOSIZE);8 s3 a& l6 H3 h9 Y' P $ b% t6 @2 e5 g& N; [& S for (i = 1; i <= intHeight; i ++)& j$ D8 _0 {% z8 ^0 e1 q' d @ {- B" F3 V) Y+ t; H' L8 B for (j = 1; j <= intWidth; j ++)) ?7 e9 s8 _. J { ( b6 X) h9 y4 a, b4 b ::ReadProcessMemory(hProcess, (void *)(0x01005340 + i * 32 + j),, F8 V4 P& F* n$ y (void *)&tmpValue, 1, &bytes);- L I8 o2 h, I! ~- u" u if ((tmpValue & 0x80) != 0x80)+ ]/ G6 b( Q7 r. w* ? { . L5 A6 A8 |! b- B: k* q! ]. ^ point.x = 7 + j * 16 + rect.left;& [2 u- r1 }) g" J$ ^8 d7 V point.y = 96 + i * 16 + rect.top; + d; G) D0 W3 `4 o' \% k3 c: _, L ::SetCursorPos(point.x, point.y);7 M& n- O! a8 B$ O mouse_event(MOUSEEVENTF_LEFTDOWN, point.x, point.y, 0, 0); & X7 F% O7 p q4 k/ p d& N mouse_event(MOUSEEVENTF_LEFTUP, point.x, point.y, 0, 0);, P1 W% s4 W: k- j2 [5 s3 b }' s* W4 w; w1 H. B+ M } , a- V4 S/ {' |1 ~6 w- Y1 Y/ v } 7 Z, l# \ M1 z- l6 S ::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 下一条

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