下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2005-2-24 17:02:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在NT系统里,一个进程只允许对本身内存和共享内存进行读写(如果说错了请告诉我) % i, L: e3 p2 l, m: m. T! m9 h但经过处理后,我们可以访问安全级别不是很高的进程内存。 " z! }% A8 u" R5 z- C& i3 O我们在OpenProcess时,如果能取得它的PROCESS_VM_READ、PROCESS_VM_WRITE和PROCESS_VM_OPERATION权限,那就好办了。 ! M5 ?( V# o$ h' J ?2 R1 c下面是我编的一个自动扫雷程序的核心代码,它从扫雷程序的内存中读取地雷的分布情况,再通过模拟鼠标点击来扫雷 8 k# T7 O. r; j X/ K0 ^) g d$ R注意,这儿地雷在内存中的分布,是在中文XP下跟踪所得,不知道在其它系统上是不是一样的。( {; ?6 D6 j" ?/ {; U+ _1 B HWND hwnd; A% R/ N3 ^% {- y# @5 J HANDLE hProcess = NULL; + Z. |% D- g6 {( G DWORD id; / X( q' C0 ]- U BYTE tmpValue; : N; R0 E( V* q DWORD bytes;4 |# H6 g* K" k/ ^2 v$ i3 R# v CPoint point;6 l+ R& g/ t( b! s! Y$ @ CRect rect;" E0 r- ]' C9 }) u* }1 a3 l4 d int intWidth, intHeight, i, j; ; O1 A1 y' z0 i6 n1 L //找到扫雷游戏的窗口,如果找不到,就出错。# Z% p! E) |7 ]+ @' {' V hwnd = ::FindWindow(NULL, "扫雷"); ! w( o& ^$ H$ I9 N0 A5 B4 U( K if (!hwnd) 5 o4 ]" N, y% v- p1 C { 6 q$ S& i1 G3 h* R. j( E2 q3 x5 F MessageBox("没有找到扫雷游戏", NULL, MB_OK|MB_ICONINFORMATION);, e2 `* D8 A2 a return;: u Y* g# i' F6 z7 a0 x! c& q } 3 N' H; A+ e A$ H' B( m //从窗口ID得到它的进程ID 9 T/ V) F/ q6 E! S% D# y ::GetWindowThreadProcessId(hwnd, &id);5 W0 {6 E, u8 t, \* K' a //得到它的进程句柄# W3 n+ O s, J. f hProcess = ::OpenProcess(STANDARD_RIGHTS_REQUIRED| ! M& \2 r+ [' W/ } {$ N% ?. W PROCESS_VM_READ| 6 T5 L0 l- A7 {+ h0 z! ~ PROCESS_VM_WRITE|9 y5 a6 w! R0 K4 i( ]+ ? |: N PROCESS_VM_OPERATION, FALSE, id);4 M9 a* X2 [4 K- `' J; w9 W4 ? //检查雷区的区域 6 J- c w' h5 d$ C7 v% l- r ::ReadProcessMemory(hProcess, (void *)0x01005334, (void *)&tmpValue, 1, &bytes); K b5 E* V/ b. N$ u. i intWidth = tmpValue; 4 x$ K: r: R) [" o. n - r8 e' I, r5 l6 `& m ::ReadProcessMemory(hProcess, (void *)0x01005338, (void *)&tmpValue, 1, &bytes);8 t9 x- n9 ~$ l: B0 b! Z ~2 ~ intHeight = tmpValue; r7 j3 m, D( e2 l6 D: ^ ::SetForegroundWindow(hwnd); 8 ]+ R! J, C# J+ Q$ q, H- a( L" x6 v ::GetWindowRect(hwnd, &rect); ' C: M [5 p V& w$ l; L ::SetWindowPos(hwnd, HWND_TOP, rect.left, rect.top, 0, 0, SWP_NOSIZE); 6 J* R" p7 i' D7 ^& q+ Q . [/ V8 J) H0 _' L for (i = 1; i <= intHeight; i ++)1 z9 P) Y, Q" }1 _9 Y1 M, i1 u { ! r7 {% m: r$ h1 E5 h7 ?! { for (j = 1; j <= intWidth; j ++); i* Q8 L3 ?# m" ?5 c/ N5 b# v. m { , ]9 s1 g# _! I* T2 V" D6 ~# w ::ReadProcessMemory(hProcess, (void *)(0x01005340 + i * 32 + j)," d. X+ @* W( D9 H& A5 Q (void *)&tmpValue, 1, &bytes); 8 g" ^( w+ n) E7 i5 E if ((tmpValue & 0x80) != 0x80) ; l0 y1 a% O5 y+ u- Y0 P { ' K/ N1 ^% X8 n0 j7 d! ~ point.x = 7 + j * 16 + rect.left;2 l) E) O; m. g& B point.y = 96 + i * 16 + rect.top;: }% y6 p" a- d0 I8 j$ u0 J& { ::SetCursorPos(point.x, point.y);& U' V9 x" R7 [% v! z' k8 U mouse_event(MOUSEEVENTF_LEFTDOWN, point.x, point.y, 0, 0); - w' R0 P) {" U6 Z+ t- G mouse_event(MOUSEEVENTF_LEFTUP, point.x, point.y, 0, 0); $ b6 E3 L9 g" D$ I5 W }0 U0 z5 Y% R( s- Z9 B% W3 B, | }9 k$ ~( P) p2 P& [/ X0 q }% j$ X, h" q# P2 k6 d ::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 下一条

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