下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2005-2-24 17:02:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在NT系统里,一个进程只允许对本身内存和共享内存进行读写(如果说错了请告诉我) 9 t2 c" Y2 h+ t但经过处理后,我们可以访问安全级别不是很高的进程内存。) ^ p4 ?; l! H+ E8 f 我们在OpenProcess时,如果能取得它的PROCESS_VM_READ、PROCESS_VM_WRITE和PROCESS_VM_OPERATION权限,那就好办了。% I% Y4 h( F% V. q 下面是我编的一个自动扫雷程序的核心代码,它从扫雷程序的内存中读取地雷的分布情况,再通过模拟鼠标点击来扫雷 7 m. l# N9 `0 r) J* }# C k注意,这儿地雷在内存中的分布,是在中文XP下跟踪所得,不知道在其它系统上是不是一样的。/ d& a5 Q. n1 r0 e( h6 U HWND hwnd;4 r4 W' b8 |4 N& e HANDLE hProcess = NULL;! l+ L" L% h4 d0 ^( N* r/ K- @$ m DWORD id; / e9 A" _. \0 H1 J, {" a' r- E BYTE tmpValue; ) z! [. k6 S+ V" _ DWORD bytes;1 x" _5 O# O) U) M- x CPoint point; / {/ m2 }# {8 W" Z2 ~ CRect rect; ; w3 q8 W$ ~9 L+ r int intWidth, intHeight, i, j; ; q7 Z3 D+ E6 V //找到扫雷游戏的窗口,如果找不到,就出错。 * h4 `" j$ ?0 A: m1 C. }, J# A hwnd = ::FindWindow(NULL, "扫雷"); ( C' M# X6 f% v# E if (!hwnd); a& P* [" e3 \ { : ?* g0 Q5 H) L4 n% y* X MessageBox("没有找到扫雷游戏", NULL, MB_OK|MB_ICONINFORMATION); 2 b6 ]. r3 m! b return;4 Z" t0 U1 z, e% S4 e# X }" o; j$ j6 @( j* D$ B# G4 U //从窗口ID得到它的进程ID- T! F. d5 A. d6 U0 B6 m/ f+ o ::GetWindowThreadProcessId(hwnd, &id);0 m4 i5 e( v- i! D //得到它的进程句柄' o3 q+ Z( _" C- E0 `9 Q. J hProcess = ::OpenProcess(STANDARD_RIGHTS_REQUIRED| % X! \4 s) h8 j* ~/ Y PROCESS_VM_READ| ' D8 G, d# T+ r* G7 \: ] PROCESS_VM_WRITE|4 B d! k$ M: |4 b/ V' H; }, { PROCESS_VM_OPERATION, FALSE, id);% {1 J6 w( [5 ?$ L5 Y //检查雷区的区域4 R$ ?+ e2 }1 E b& w ::ReadProcessMemory(hProcess, (void *)0x01005334, (void *)&tmpValue, 1, &bytes);$ M$ G: d& n' X9 O8 [8 E9 { intWidth = tmpValue; 7 _3 Z0 N# o0 K* K. P _$ p0 a 6 h# o0 C/ Z- H: p/ `4 p$ ^ ::ReadProcessMemory(hProcess, (void *)0x01005338, (void *)&tmpValue, 1, &bytes);7 c' z2 s$ N0 ~3 v8 f: _( |, A7 z; k2 j intHeight = tmpValue; 1 Z& P% ^2 |1 {) `1 _1 K9 n; O ::SetForegroundWindow(hwnd);) |5 S! D% I" c, \ ::GetWindowRect(hwnd, &rect);2 E$ m. f* @: U. c) d: O ::SetWindowPos(hwnd, HWND_TOP, rect.left, rect.top, 0, 0, SWP_NOSIZE);% Z# T ^0 j8 r3 o ! q8 `9 O% G- O8 M5 F for (i = 1; i <= intHeight; i ++) 9 T7 J9 u }& z6 k( x( b# Z { 7 U: M6 q; A$ ?) J" ^' z! G) r for (j = 1; j <= intWidth; j ++)5 w! y1 |7 W2 @4 z+ [ { 7 ?) F2 G, @/ Z: |/ d" L ::ReadProcessMemory(hProcess, (void *)(0x01005340 + i * 32 + j),: ` \- }" b+ Q (void *)&tmpValue, 1, &bytes);! Q- m$ Y# ~: @# D if ((tmpValue & 0x80) != 0x80)$ |5 Y5 _. w0 Y1 M5 y { L& V5 L1 C" b5 ^8 b( I point.x = 7 + j * 16 + rect.left;' _; W) { s2 q2 O# Z3 ?% C) @ point.y = 96 + i * 16 + rect.top;( r; _3 Y9 h1 p) c* R7 M2 _ ::SetCursorPos(point.x, point.y); 2 j& C3 J; d$ A mouse_event(MOUSEEVENTF_LEFTDOWN, point.x, point.y, 0, 0); / B" B7 J: A% m H mouse_event(MOUSEEVENTF_LEFTUP, point.x, point.y, 0, 0); - R: j* \# p A }* b+ D# G# D/ L/ F- } } 7 m% E$ c* r8 e- f4 _/ \ }" g' i% g: N- M+ |. M ::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 下一条

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