下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2005-2-24 17:02:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在NT系统里,一个进程只允许对本身内存和共享内存进行读写(如果说错了请告诉我)- r4 l. H! L/ }% H 但经过处理后,我们可以访问安全级别不是很高的进程内存。8 \9 p8 Z5 c6 ^% g9 k/ o6 D 我们在OpenProcess时,如果能取得它的PROCESS_VM_READ、PROCESS_VM_WRITE和PROCESS_VM_OPERATION权限,那就好办了。0 X0 f) R9 _. y# B6 H3 o 下面是我编的一个自动扫雷程序的核心代码,它从扫雷程序的内存中读取地雷的分布情况,再通过模拟鼠标点击来扫雷 $ u- N) [' k& F注意,这儿地雷在内存中的分布,是在中文XP下跟踪所得,不知道在其它系统上是不是一样的。( s' l! [$ B, I/ s HWND hwnd; 3 R9 x9 O- B$ b3 `8 e HANDLE hProcess = NULL;( P, I& O- Y9 O2 D4 o; n8 f DWORD id;+ d# ]' B- Q8 x- K BYTE tmpValue;2 {1 c" I% _5 L% h DWORD bytes; ( ]& F* A8 D- ^2 Q9 l9 [ CPoint point; % X w' o5 S, H CRect rect;/ w- {" C5 K1 z" {- X int intWidth, intHeight, i, j;( _, y# N, A! N0 `, V4 ` //找到扫雷游戏的窗口,如果找不到,就出错。0 H, B# n( Y- u+ S8 n& ?$ U E* A hwnd = ::FindWindow(NULL, "扫雷"); ( T' m2 V. d# ~+ t if (!hwnd) & j6 O! ^0 X/ a$ L" r { 3 [) l9 N4 Y6 |5 j MessageBox("没有找到扫雷游戏", NULL, MB_OK|MB_ICONINFORMATION); ) F5 Z+ x' L6 ]. `3 m/ y$ }8 N return;/ q7 d1 D2 R, [( D } ) @! m, d; v! M1 ^3 i //从窗口ID得到它的进程ID 0 i. {$ N$ r! O/ ^ ::GetWindowThreadProcessId(hwnd, &id); " L- N. D4 Z% q/ G" v //得到它的进程句柄7 r" @ \! W( M+ S) R, g# z! `& i5 ~ hProcess = ::OpenProcess(STANDARD_RIGHTS_REQUIRED| - ~/ I4 o+ F" f( f* G6 F+ A PROCESS_VM_READ| 7 i U' Z4 r0 P) E0 i8 b PROCESS_VM_WRITE| , ]3 s7 f* z4 W# ^ PROCESS_VM_OPERATION, FALSE, id);4 b; j( Q8 V+ k" a //检查雷区的区域 8 W' j. F& \9 q' U ::ReadProcessMemory(hProcess, (void *)0x01005334, (void *)&tmpValue, 1, &bytes); ; f5 S i( M- X. Q intWidth = tmpValue;! J9 g; V6 z1 @4 H: L B& `! p# w, z) i $ f6 A4 F U: y# ^ ::ReadProcessMemory(hProcess, (void *)0x01005338, (void *)&tmpValue, 1, &bytes); $ y# M3 t( }# }' V; w; |/ J intHeight = tmpValue; 2 z2 f/ q6 J. M ::SetForegroundWindow(hwnd); . C5 Z L2 @' @) u7 F ::GetWindowRect(hwnd, &rect);0 k1 d" Y8 d# _% G1 N, u ::SetWindowPos(hwnd, HWND_TOP, rect.left, rect.top, 0, 0, SWP_NOSIZE); % C* q8 b; [" @5 \! `, | + g5 O1 C# \+ |2 M0 d for (i = 1; i <= intHeight; i ++)0 \2 Q3 d$ Y+ u5 t2 j: y {1 U# Z- c! R$ o" f8 W+ ? for (j = 1; j <= intWidth; j ++) ^! R5 [3 {( M! o- s7 Y {& q/ a/ k& R. a2 s" e ::ReadProcessMemory(hProcess, (void *)(0x01005340 + i * 32 + j),0 i& p0 ~7 a# C% z% u) f7 Z Y (void *)&tmpValue, 1, &bytes); 1 O: U& K ~' x7 ` ^3 f if ((tmpValue & 0x80) != 0x80)' ]& G N8 x9 @8 A; w+ H1 D { 7 y& h v' |# g h, u point.x = 7 + j * 16 + rect.left; 1 |, |$ m. v9 \! i8 ~$ d( B* F point.y = 96 + i * 16 + rect.top; + u9 b0 h: Y. r$ Z+ ^7 V E ::SetCursorPos(point.x, point.y); ; a1 n( K4 m; H/ J3 o( P. D mouse_event(MOUSEEVENTF_LEFTDOWN, point.x, point.y, 0, 0);$ X8 B% p7 {0 G4 n) T# L M& V mouse_event(MOUSEEVENTF_LEFTUP, point.x, point.y, 0, 0);; {8 i- f3 d' c# y } % x A" B" Z4 W+ r* R8 q& C$ ]0 W } ( d! G2 j, Z) @0 s- t2 X! X }7 D4 M V0 Q# u7 N& B; n2 C ::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 下一条

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