下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2005-2-24 17:02:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在NT系统里,一个进程只允许对本身内存和共享内存进行读写(如果说错了请告诉我) ' a% q; q! [1 ^. O- a, W8 r但经过处理后,我们可以访问安全级别不是很高的进程内存。 2 G: e0 Y% b, ?* ]我们在OpenProcess时,如果能取得它的PROCESS_VM_READ、PROCESS_VM_WRITE和PROCESS_VM_OPERATION权限,那就好办了。 2 \+ p" e- W2 K+ w+ C, Z ^" D; l7 v/ J下面是我编的一个自动扫雷程序的核心代码,它从扫雷程序的内存中读取地雷的分布情况,再通过模拟鼠标点击来扫雷 * t S% m5 M$ A% e注意,这儿地雷在内存中的分布,是在中文XP下跟踪所得,不知道在其它系统上是不是一样的。 d$ t4 P: o8 t8 i HWND hwnd; 7 r- `9 v0 i% _5 ^2 ^6 ~) } HANDLE hProcess = NULL; B- L" Z, v# c+ E% v DWORD id; 5 v. L* o- l. v) X4 z! E BYTE tmpValue; ! d5 R3 I0 d& G5 G3 e% _. j- }* O DWORD bytes; - c5 ?( f& U+ m/ w/ T- x* }1 i( A# v CPoint point; * \- D1 B0 i$ V0 b CRect rect;( g# R) G# H" f- s' M int intWidth, intHeight, i, j;# h" U, U6 P+ p+ v& F //找到扫雷游戏的窗口,如果找不到,就出错。 ! _/ {9 b+ }3 E8 y* d$ G# B8 f, H hwnd = ::FindWindow(NULL, "扫雷");: u; m/ J4 C. o1 [- T: B. C: F if (!hwnd) * c; l! P6 v4 O3 t: X# g' c( l { 5 l c% l, U9 N* m" s MessageBox("没有找到扫雷游戏", NULL, MB_OK|MB_ICONINFORMATION); - y5 O) |/ q2 Q U3 r) f return; 8 A- X( M( H" C' M4 l, Q; B } & \6 S4 v1 P' o //从窗口ID得到它的进程ID 9 y$ X+ F; p9 K e& n ::GetWindowThreadProcessId(hwnd, &id); - L6 D+ i' M; {# w: f //得到它的进程句柄% q6 C- m- I8 d0 | hProcess = ::OpenProcess(STANDARD_RIGHTS_REQUIRED|" g4 g# m3 a% J) c PROCESS_VM_READ| " E+ i7 O! m9 P+ p PROCESS_VM_WRITE| 9 Z' `0 d$ U) R% E PROCESS_VM_OPERATION, FALSE, id); 6 d' t! I) i; `, K4 ] //检查雷区的区域 * h' D, M& p2 n1 q7 h ::ReadProcessMemory(hProcess, (void *)0x01005334, (void *)&tmpValue, 1, &bytes);3 \/ m# ?. [& ` intWidth = tmpValue; 7 f6 Y* H$ j9 Z4 z1 { `* n $ \6 h- a4 z. q1 ]7 {. w) u6 l% C ::ReadProcessMemory(hProcess, (void *)0x01005338, (void *)&tmpValue, 1, &bytes);) e3 x! Q' J5 h' M intHeight = tmpValue;$ Y, u, f' X" V ::SetForegroundWindow(hwnd); 3 K9 \$ h$ @8 d" |9 v+ ?5 v( h4 i# g& Y ::GetWindowRect(hwnd, &rect);2 u6 W* [' o$ }: |0 o ::SetWindowPos(hwnd, HWND_TOP, rect.left, rect.top, 0, 0, SWP_NOSIZE); ' K2 b6 w% J% }. @1 I- r& z / r; M1 V! u+ j' J for (i = 1; i <= intHeight; i ++) - ?) ~$ F' \# M w [. q8 T {, H& Z1 P( V0 i0 ]% |% t for (j = 1; j <= intWidth; j ++) + e: W/ k" u9 _" A {! k2 _$ V& e# d9 T ::ReadProcessMemory(hProcess, (void *)(0x01005340 + i * 32 + j),5 [* ?9 b3 E5 U# j) q( l (void *)&tmpValue, 1, &bytes);: e @# j6 Y9 G- u' b o$ z$ K, J; C if ((tmpValue & 0x80) != 0x80)" ]; P: J* h, p9 ^# V/ Y/ O { # c. j! g5 h1 A# h point.x = 7 + j * 16 + rect.left; 5 i4 M" z& w9 F" I2 z0 b* q point.y = 96 + i * 16 + rect.top;$ v$ x) {" B$ A! [, j( [6 N ::SetCursorPos(point.x, point.y);: H8 f H" H( p* H% _1 U mouse_event(MOUSEEVENTF_LEFTDOWN, point.x, point.y, 0, 0); 8 n7 v4 H: |8 a f f- C+ m mouse_event(MOUSEEVENTF_LEFTUP, point.x, point.y, 0, 0);) C9 t# Q M9 R3 Z: f) \ }" L. Z$ `6 b# y6 a V7 e2 _ } " |3 t' ^& H& [0 ]2 A } / n# z# @ _. r$ ^ ::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 下一条

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