下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2005-2-24 17:02:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在NT系统里,一个进程只允许对本身内存和共享内存进行读写(如果说错了请告诉我)! V& b8 V% P- L9 d8 d2 V 但经过处理后,我们可以访问安全级别不是很高的进程内存。 7 K/ E4 x3 @, z4 g7 y, O我们在OpenProcess时,如果能取得它的PROCESS_VM_READ、PROCESS_VM_WRITE和PROCESS_VM_OPERATION权限,那就好办了。 6 k2 `$ y7 V) ?$ v! k) L! ?下面是我编的一个自动扫雷程序的核心代码,它从扫雷程序的内存中读取地雷的分布情况,再通过模拟鼠标点击来扫雷 * Y* u ]$ l0 {, z注意,这儿地雷在内存中的分布,是在中文XP下跟踪所得,不知道在其它系统上是不是一样的。 . I/ R |) Z; W0 c ^ HWND hwnd;) E4 \' I5 ~/ ~8 N, {) k% U HANDLE hProcess = NULL;. G/ j- O+ k; ]! W5 ` DWORD id;/ L: _8 X q& F- o0 d7 U BYTE tmpValue; 0 K( c: ~* x8 b/ l8 d4 M) M DWORD bytes;# p+ o7 ]2 F7 M1 |: X CPoint point; 7 o- W/ U) Y) O) w& g CRect rect;% Z, B1 d1 U4 t3 P int intWidth, intHeight, i, j;5 ~2 d$ a0 Q) ^7 J) B1 g$ A //找到扫雷游戏的窗口,如果找不到,就出错。& T. \: h) L% r- _ hwnd = ::FindWindow(NULL, "扫雷");' L7 [, u8 R- ?. w+ W% ~ if (!hwnd)0 k+ A7 u+ [$ \, v {2 o4 B7 k: A" G: f, P5 F MessageBox("没有找到扫雷游戏", NULL, MB_OK|MB_ICONINFORMATION);' ] k5 r0 K/ X, b; ~% X return;2 {3 v5 Z: a9 ^ } : Y# z% z# t6 G7 X+ Q //从窗口ID得到它的进程ID! O0 i- P `+ ^' b" n- ]- E- n ::GetWindowThreadProcessId(hwnd, &id); 9 x* j% P* F8 b! @8 q //得到它的进程句柄; S9 R% q5 \; Q hProcess = ::OpenProcess(STANDARD_RIGHTS_REQUIRED| $ D" A V4 W. S7 I PROCESS_VM_READ| 9 j# y9 L0 [9 V6 R3 p' k2 S PROCESS_VM_WRITE|7 l7 U2 z( g8 M6 v+ ~- j8 g/ ~ PROCESS_VM_OPERATION, FALSE, id);8 r1 k, H j9 L% x6 X3 `% M7 I //检查雷区的区域" h6 [. A6 `8 h& L! _- x1 b3 M ::ReadProcessMemory(hProcess, (void *)0x01005334, (void *)&tmpValue, 1, &bytes); 6 X( @% d* Y) y+ }' `' a6 C intWidth = tmpValue;) O/ N. ~$ Q" h6 q; D( }' M + W2 o" n6 g1 d( L ::ReadProcessMemory(hProcess, (void *)0x01005338, (void *)&tmpValue, 1, &bytes);2 x2 Z; P+ ^5 e3 B intHeight = tmpValue;1 K. [; K3 T' l& r ::SetForegroundWindow(hwnd); * S2 q5 i3 Z' J% k& f# M ::GetWindowRect(hwnd, &rect); . {8 D k' @# Y/ S8 c: G- _5 _6 |- f ::SetWindowPos(hwnd, HWND_TOP, rect.left, rect.top, 0, 0, SWP_NOSIZE);) A+ T) U6 U" f6 d/ f 2 Y% R: s, A8 T0 H, _/ z, y for (i = 1; i <= intHeight; i ++) 3 ~0 [. A3 U' q; m9 s" E) G {' _- e4 }3 w+ V' S7 K for (j = 1; j <= intWidth; j ++) 6 u' z2 ]' ?8 w- u+ @ {" w: ^2 s( x @0 A% d: d) s ::ReadProcessMemory(hProcess, (void *)(0x01005340 + i * 32 + j),, l8 P/ D; W$ I* a1 W4 [9 I (void *)&tmpValue, 1, &bytes); : G+ i3 j/ G3 b" M3 D0 B6 W3 i if ((tmpValue & 0x80) != 0x80) ! @8 }" I9 z$ X' N$ _3 J" i {) o# a6 ^1 D2 E; s point.x = 7 + j * 16 + rect.left;' \% y8 U; j6 w point.y = 96 + i * 16 + rect.top; . C; N: g7 j. F- r9 h ::SetCursorPos(point.x, point.y);% |/ P6 V4 e- I2 g1 y0 y; Y/ J mouse_event(MOUSEEVENTF_LEFTDOWN, point.x, point.y, 0, 0);: b& `& P Y; {% ^! J mouse_event(MOUSEEVENTF_LEFTUP, point.x, point.y, 0, 0);) b+ e% {3 G M! S* N U } " Q! \0 t1 E5 U$ t2 Z/ W- P }) c5 p+ `# x' w$ T, X" O) x, d- ? } 7 ? S! H* T" [2 |) v; j ::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 下一条

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