下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2005-2-24 17:02:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在NT系统里,一个进程只允许对本身内存和共享内存进行读写(如果说错了请告诉我) 4 |" G, n' ?* B, `2 v |但经过处理后,我们可以访问安全级别不是很高的进程内存。) u1 Q. ~& m8 L2 b. S4 L 我们在OpenProcess时,如果能取得它的PROCESS_VM_READ、PROCESS_VM_WRITE和PROCESS_VM_OPERATION权限,那就好办了。 - i, n" B: O2 y, J; w. C下面是我编的一个自动扫雷程序的核心代码,它从扫雷程序的内存中读取地雷的分布情况,再通过模拟鼠标点击来扫雷 % V4 _8 Y1 G; r e: E$ J注意,这儿地雷在内存中的分布,是在中文XP下跟踪所得,不知道在其它系统上是不是一样的。 : E t( t9 Q: n HWND hwnd;- x: C5 U& b0 ^ `% Z HANDLE hProcess = NULL; ! {7 B; @$ _5 }/ r& z DWORD id; - l! b" ]+ o( ? BYTE tmpValue; 5 V; L* W; E/ U& ~ k- }/ R' }/ \ DWORD bytes;$ h" f3 M- ~7 C4 q. `9 Z2 S CPoint point;6 z" C ~. K4 w0 c9 c* c CRect rect;, b2 ]9 D5 e- \ int intWidth, intHeight, i, j; % G6 D4 }( q5 a9 L6 N, I //找到扫雷游戏的窗口,如果找不到,就出错。5 z" e9 O* W U hwnd = ::FindWindow(NULL, "扫雷"); D0 L4 p; m! }: H. n( q F3 v if (!hwnd): K, n! R6 @% G! {: ~& z! Y; @ {! X7 L0 H2 \; E8 c9 d* W MessageBox("没有找到扫雷游戏", NULL, MB_OK|MB_ICONINFORMATION); $ a4 D0 o8 W, \2 n! R return;' \ M* D; Q* ? }* F8 Z0 C. j4 s1 a6 u& U1 c //从窗口ID得到它的进程ID+ B1 c& o% ?5 T# t* _; c ::GetWindowThreadProcessId(hwnd, &id); ) c2 j7 _& }3 n& }2 M y; L //得到它的进程句柄5 `; d4 h7 R8 V7 C hProcess = ::OpenProcess(STANDARD_RIGHTS_REQUIRED| ' w% u- y' W6 Z$ D* c0 _& k PROCESS_VM_READ| : d. J: b% ?6 D" r PROCESS_VM_WRITE| 0 h& ~# y! L# @* m2 \' Z7 m PROCESS_VM_OPERATION, FALSE, id);* ]$ L, \) V8 i) k, ? //检查雷区的区域 ( N4 C$ d' a+ p B$ T ::ReadProcessMemory(hProcess, (void *)0x01005334, (void *)&tmpValue, 1, &bytes); ; f% `' i! r3 f0 j+ O Y" H intWidth = tmpValue; 8 E6 x5 ~$ f) ? # E& M: v+ c$ E$ U; Z ::ReadProcessMemory(hProcess, (void *)0x01005338, (void *)&tmpValue, 1, &bytes);4 a8 X7 k) J8 @# S' Q5 q intHeight = tmpValue; ! r* g1 q4 K5 p% ?) E. e3 s8 A ::SetForegroundWindow(hwnd);& v9 z, O- ^+ y ::GetWindowRect(hwnd, &rect); 9 `2 {# z" i3 e9 R$ \) ` M ::SetWindowPos(hwnd, HWND_TOP, rect.left, rect.top, 0, 0, SWP_NOSIZE);) B% H. D) F& Q4 F: M& a" X8 E+ m0 v$ h 2 `) M$ c2 x! ]" ~ for (i = 1; i <= intHeight; i ++) 4 s5 K: n$ B9 w+ ]) I: h, H { ; \3 L n" [! L/ f# S8 H1 t, I for (j = 1; j <= intWidth; j ++) 6 u( x5 c: @9 P2 F6 ~! q. O { # y% }7 A! ^" V1 ^- @$ i ::ReadProcessMemory(hProcess, (void *)(0x01005340 + i * 32 + j),, c# W K6 G+ L+ U (void *)&tmpValue, 1, &bytes);- y4 x7 Z9 Z- `* ~, V+ J if ((tmpValue & 0x80) != 0x80) 1 {7 r$ P. y/ [7 ~+ [( Q { * z( k. h0 {0 T* T8 X point.x = 7 + j * 16 + rect.left;! t5 V0 f9 O' @/ g: ^# b point.y = 96 + i * 16 + rect.top; : w- z2 X `' }! x& P9 N5 d: V ::SetCursorPos(point.x, point.y);4 c0 N& H7 t4 E O4 ^% k6 U, i mouse_event(MOUSEEVENTF_LEFTDOWN, point.x, point.y, 0, 0); 5 U: q& L0 K3 R mouse_event(MOUSEEVENTF_LEFTUP, point.x, point.y, 0, 0); 0 E0 d- _4 O8 V } : b0 H& s% ]" T6 J }2 ], ^1 a" u! |- e+ Q4 `6 p+ F }* S8 Q( g: ~& g$ Z ::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 下一条

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