下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2005-2-24 17:02:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在NT系统里,一个进程只允许对本身内存和共享内存进行读写(如果说错了请告诉我) 5 f X3 i+ Q) W: c' ]+ I但经过处理后,我们可以访问安全级别不是很高的进程内存。% g! u1 S" ^6 m3 r 我们在OpenProcess时,如果能取得它的PROCESS_VM_READ、PROCESS_VM_WRITE和PROCESS_VM_OPERATION权限,那就好办了。( n1 ^" q4 }/ n, b$ ~ 下面是我编的一个自动扫雷程序的核心代码,它从扫雷程序的内存中读取地雷的分布情况,再通过模拟鼠标点击来扫雷 - D0 C& C2 G: n0 {注意,这儿地雷在内存中的分布,是在中文XP下跟踪所得,不知道在其它系统上是不是一样的。# J7 C# m! a; ] HWND hwnd;) V* ?% q0 d* C HANDLE hProcess = NULL;+ L8 \) ~( i) [! C DWORD id;# ]7 L. E. t8 C9 R3 |% F, M. a BYTE tmpValue; 0 l: k8 B2 T& q; y" h1 N DWORD bytes;3 {7 P, H# d' c" J CPoint point;; f0 d, b: _; G CRect rect; n( ~- A: _% z, I: D+ |1 y* T int intWidth, intHeight, i, j; $ \3 | z* Q2 m! m9 I, G) Z+ x9 [ //找到扫雷游戏的窗口,如果找不到,就出错。5 r u, r5 c. ^$ d# [5 x hwnd = ::FindWindow(NULL, "扫雷");# D# V7 E! V; z- B! C) }2 J if (!hwnd) $ V6 M: A: m, P6 I# P1 Q# ~ {* P* n3 b6 F4 L' A+ [ MessageBox("没有找到扫雷游戏", NULL, MB_OK|MB_ICONINFORMATION);& U8 `, M9 Y, X return;; p: }& D2 c9 E2 ? B6 D5 f }/ ?0 N6 a Y% J8 l //从窗口ID得到它的进程ID$ g6 u; i1 q0 V, t ::GetWindowThreadProcessId(hwnd, &id); 1 Q& \7 b/ _6 \- i% g) v9 w: d //得到它的进程句柄4 Z4 g$ y, n# [+ O9 ^ hProcess = ::OpenProcess(STANDARD_RIGHTS_REQUIRED| 7 b, _- u% u: ~: k) G PROCESS_VM_READ|% a3 e! W/ u4 B: C- y6 S PROCESS_VM_WRITE| - s9 C' T- @- v/ C7 c# X PROCESS_VM_OPERATION, FALSE, id); 7 g7 ~. f" K) w G //检查雷区的区域 : _% N0 Y% n. z; u ::ReadProcessMemory(hProcess, (void *)0x01005334, (void *)&tmpValue, 1, &bytes);( k9 ~* l2 c& _- O* E$ b8 ^ B) y3 C intWidth = tmpValue;" z- _6 q" E- x + U0 j& l& }% w7 x& F% t f ::ReadProcessMemory(hProcess, (void *)0x01005338, (void *)&tmpValue, 1, &bytes); 9 R; w7 d1 y+ [' F/ E intHeight = tmpValue;. }8 x9 v- ^7 t. [. `- g ::SetForegroundWindow(hwnd);1 d' b0 ~" _$ F8 t& b$ y2 u% M ::GetWindowRect(hwnd, &rect); 0 s- j2 z$ w A6 S8 G ::SetWindowPos(hwnd, HWND_TOP, rect.left, rect.top, 0, 0, SWP_NOSIZE);! f3 B+ N# S. q) V5 X! A& Q $ o; N2 v: V! U for (i = 1; i <= intHeight; i ++)) Z- L8 G M0 t+ z5 c) _* }" |: Y {9 G/ I' A# f5 v2 i9 J5 ]2 k1 I3 E( @ for (j = 1; j <= intWidth; j ++) V/ v0 p7 j3 [5 { {8 p& i0 E r# U' ]2 @" {' ^$ y- | ::ReadProcessMemory(hProcess, (void *)(0x01005340 + i * 32 + j), . h* B+ X1 c. n; a (void *)&tmpValue, 1, &bytes);$ y: f% S* p# r( V i" W& S if ((tmpValue & 0x80) != 0x80) 4 p5 x2 x& H3 H" K, Y {" R) ^+ l& |+ U, |0 K7 h point.x = 7 + j * 16 + rect.left;8 l3 Y. I7 l% ~ point.y = 96 + i * 16 + rect.top; 9 j! m, d8 x4 X7 N8 s, h ::SetCursorPos(point.x, point.y); 3 g' p/ Q% q4 I2 r# h5 I; u* W mouse_event(MOUSEEVENTF_LEFTDOWN, point.x, point.y, 0, 0); % Z& }; s' X. ], { mouse_event(MOUSEEVENTF_LEFTUP, point.x, point.y, 0, 0); p/ [: C9 e# s, ^0 f& `# f }& e* a2 B! p$ o, B J }% G- F; | L: T* d }: E G$ f% e9 T) e( D ::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 下一条

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