下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2005-2-24 17:02:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在NT系统里,一个进程只允许对本身内存和共享内存进行读写(如果说错了请告诉我) , \# e I2 q0 T! V0 Z但经过处理后,我们可以访问安全级别不是很高的进程内存。+ J: C9 X3 ]0 \/ p" c( Q 我们在OpenProcess时,如果能取得它的PROCESS_VM_READ、PROCESS_VM_WRITE和PROCESS_VM_OPERATION权限,那就好办了。/ }) D. t2 L% d7 }" j 下面是我编的一个自动扫雷程序的核心代码,它从扫雷程序的内存中读取地雷的分布情况,再通过模拟鼠标点击来扫雷1 o! |% d3 t) L$ W 注意,这儿地雷在内存中的分布,是在中文XP下跟踪所得,不知道在其它系统上是不是一样的。& B4 A* z8 V8 O) s HWND hwnd;: u1 a+ ~! C' H0 o! H$ h HANDLE hProcess = NULL;2 ~4 N% V/ a8 z. | DWORD id;1 V/ Y0 @! r; W C7 U8 z BYTE tmpValue;4 x; @' Q: |& U4 n DWORD bytes;& w- |, D! `" [! [ CPoint point;% \( q& V0 S% u( ]$ H$ g7 G$ x CRect rect; % ~5 p3 U9 M3 [. X( [* n. M int intWidth, intHeight, i, j; i: I- { k) F! Y9 n; l8 [ //找到扫雷游戏的窗口,如果找不到,就出错。 # d4 g. X0 d" R. t5 G L, { hwnd = ::FindWindow(NULL, "扫雷"); 5 i) r! v; \: r; r& y if (!hwnd) + K$ L3 P# T0 o7 C+ L/ Y; h7 y {6 ^: g# ~# u) h5 J- ~ MessageBox("没有找到扫雷游戏", NULL, MB_OK|MB_ICONINFORMATION); V% y- M* k& Q, M0 O4 E return;3 g, f' n# e0 t9 W; ` } % r! Q; l# A" j1 R //从窗口ID得到它的进程ID: i0 J/ c2 ?( U2 M ::GetWindowThreadProcessId(hwnd, &id);# b; P! E) ]8 |8 s; \ //得到它的进程句柄 6 M* I" \% H" u* w% K) f# l hProcess = ::OpenProcess(STANDARD_RIGHTS_REQUIRED| * X- L1 y' ]* V% F8 I' X* \ PROCESS_VM_READ|( u% }5 y7 }3 T! Z PROCESS_VM_WRITE|7 {" ?) Z3 m7 t+ T4 } PROCESS_VM_OPERATION, FALSE, id); 6 w# q. h* g2 m# X6 L" m3 i9 R //检查雷区的区域 . {. C0 E2 C4 j" i1 {) ?6 L. ^ ::ReadProcessMemory(hProcess, (void *)0x01005334, (void *)&tmpValue, 1, &bytes); * N1 r, {8 o0 {) T, N& M# o; u intWidth = tmpValue; % |6 L e9 x6 [4 s% q+ s 1 @* R) O' o6 p: W- p ::ReadProcessMemory(hProcess, (void *)0x01005338, (void *)&tmpValue, 1, &bytes);$ |6 B M& G, z0 ^2 f' t! B9 U intHeight = tmpValue;/ ?- ~6 V) _& \ ::SetForegroundWindow(hwnd);3 Z% R" ~+ I$ R4 m+ t ::GetWindowRect(hwnd, &rect);( ?) m, r; S. [$ R ::SetWindowPos(hwnd, HWND_TOP, rect.left, rect.top, 0, 0, SWP_NOSIZE); * W7 a0 D0 y* X) I9 L t 2 U6 t+ s' l8 o for (i = 1; i <= intHeight; i ++)2 b: Y! y3 m' _, R0 D B; C { , u U1 O3 ?& u! H3 S' c for (j = 1; j <= intWidth; j ++)7 s$ ]: i& R/ \ {- F' b8 X1 m9 G# y h. b ::ReadProcessMemory(hProcess, (void *)(0x01005340 + i * 32 + j), 9 O& i/ t% n! J) N* i4 b3 j1 w, F (void *)&tmpValue, 1, &bytes);6 Z* p) |" [: a3 ~: y: I if ((tmpValue & 0x80) != 0x80) 6 z- P/ ?! D3 u! | {* M4 \6 u7 Q; Y point.x = 7 + j * 16 + rect.left; J; b. q- O/ c! ?2 E5 v point.y = 96 + i * 16 + rect.top; ^" e) O: V& J8 {* p8 t7 U ::SetCursorPos(point.x, point.y); $ u8 D$ H$ p! U2 H! | mouse_event(MOUSEEVENTF_LEFTDOWN, point.x, point.y, 0, 0); $ a/ ]5 X$ G) ?3 k mouse_event(MOUSEEVENTF_LEFTUP, point.x, point.y, 0, 0); * `$ }4 E4 n+ V }/ X2 ]! L5 W8 s5 U& s% |4 |. K } + l% D' d8 I) S' k# s' w+ |( m } ! ?. L/ C9 s7 }0 y$ G ::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 下一条

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