下沙论坛

标题: [VC孤芳自赏]XP下的内存读写技术--扫雷外挂的制作 [打印本页]

作者: Eagle    时间: 2005-2-24 17:02
标题: [VC孤芳自赏]XP下的内存读写技术--扫雷外挂的制作
在NT系统里,一个进程只允许对本身内存和共享内存进行读写(如果说错了请告诉我)/ Q9 W+ ]8 O- T. I 但经过处理后,我们可以访问安全级别不是很高的进程内存。% L# z' @( q/ w+ c 我们在OpenProcess时,如果能取得它的PROCESS_VM_READ、PROCESS_VM_WRITE和PROCESS_VM_OPERATION权限,那就好办了。6 c4 a: q- ?- `) T& }1 ^5 r 下面是我编的一个自动扫雷程序的核心代码,它从扫雷程序的内存中读取地雷的分布情况,再通过模拟鼠标点击来扫雷& e2 D: I+ d: X4 U. u 注意,这儿地雷在内存中的分布,是在中文XP下跟踪所得,不知道在其它系统上是不是一样的。0 j3 Z0 P5 k; X& F HWND hwnd; $ G" `3 H* n; D4 \7 ~) s HANDLE hProcess = NULL; . W7 e3 c+ \* S/ A DWORD id;, D# O. J" D }" e$ V BYTE tmpValue; # c6 c4 m* ~% N4 w$ j6 h5 a- e! c# C1 h DWORD bytes; + i" T) m; L& f( z; o% _9 J }0 o CPoint point; ; Q# ?! `9 r6 C: L( l ^8 E CRect rect; * C E8 Q- m- s* X: n int intWidth, intHeight, i, j;+ K2 {- Q/ g0 N7 y //找到扫雷游戏的窗口,如果找不到,就出错。. B: { {& U% H& C hwnd = ::FindWindow(NULL, "扫雷"); u1 j8 Q9 T' X3 ?/ b' g" e if (!hwnd). \% J" S. S1 I6 `3 K {# ] `1 a$ [/ ^9 a MessageBox("没有找到扫雷游戏", NULL, MB_OK|MB_ICONINFORMATION);1 X) w- I- w) h/ x |- R2 h return; 4 t# f( h7 S( g$ C: E: } } / [* q. m+ m+ R+ l //从窗口ID得到它的进程ID % _$ S0 x# U8 x) f1 f. @8 o ::GetWindowThreadProcessId(hwnd, &id); 6 F7 M4 p2 _5 u; Q# \. s //得到它的进程句柄 ) g1 C* M+ D, \6 W$ F) u hProcess = ::OpenProcess(STANDARD_RIGHTS_REQUIRED| , E0 d. s3 q. L! K# X. q0 b, @ C+ _ PROCESS_VM_READ|% q" i/ t' W$ Y4 b6 O& _6 H PROCESS_VM_WRITE|! I. E0 d' C1 b7 t PROCESS_VM_OPERATION, FALSE, id); 5 y( X! ?* @6 J9 l6 U+ Z7 c+ Z //检查雷区的区域 $ s+ h _$ \' s. T$ { ::ReadProcessMemory(hProcess, (void *)0x01005334, (void *)&tmpValue, 1, &bytes); 3 w4 j) C' z/ ]3 F) F; ` intWidth = tmpValue;. g% h I% F" C0 |( N8 S/ P; Z ; w2 M2 l G) e9 U# p; {1 M ::ReadProcessMemory(hProcess, (void *)0x01005338, (void *)&tmpValue, 1, &bytes); 4 r7 C0 J8 |/ V intHeight = tmpValue; ( f7 L' G$ m. A V& P; s ::SetForegroundWindow(hwnd); ) k3 ?7 L+ `; S5 F; k ::GetWindowRect(hwnd, &rect); ) G' h0 _$ ?- A* J* y+ s# S8 V! `0 r ::SetWindowPos(hwnd, HWND_TOP, rect.left, rect.top, 0, 0, SWP_NOSIZE);( F- P5 r4 [+ e [0 ]% D& c" \8 Q `5 {" x# Q for (i = 1; i <= intHeight; i ++)! Y4 }/ l6 E8 t1 S4 |. |' V4 q {& U7 ?- [3 O+ {* \, C" p6 e0 i+ d for (j = 1; j <= intWidth; j ++) 0 h$ v& J0 z% y3 h$ ? { 4 J3 L( ?6 Q- a3 P) u+ i$ X ::ReadProcessMemory(hProcess, (void *)(0x01005340 + i * 32 + j), ; z+ D5 l; O9 n9 X# x! d/ x* i$ B (void *)&tmpValue, 1, &bytes);6 K/ Y- q; z2 ^: A/ D0 E5 f if ((tmpValue & 0x80) != 0x80) * d R( S3 b/ J2 W4 w( B; J {: ^# y; n0 M. Q- t, N. Y' Y& z point.x = 7 + j * 16 + rect.left;1 B7 n' F+ y9 z2 F8 g! U! x# `/ _. d point.y = 96 + i * 16 + rect.top;9 K+ R }! a2 m/ j5 u! V/ ^ ::SetCursorPos(point.x, point.y); 7 S$ j% d4 Y% G* |2 u mouse_event(MOUSEEVENTF_LEFTDOWN, point.x, point.y, 0, 0);0 ^ P: Z! d1 k$ `4 r- w mouse_event(MOUSEEVENTF_LEFTUP, point.x, point.y, 0, 0); 7 ^, ~5 R% Q3 e* K- w( u } - h# i# S6 ?4 ? {- I& a } 0 J- m2 i8 ?' ^5 e" z7 A1 {! x8 c5 K }0 J; g% ^9 D% q4 Q+ q; m: d! j ::CloseHandle(hProcess);
作者: 游侠无极限    时间: 2005-2-25 08:45
既然没有Write,要那个权限干吗……
作者: Eagle    时间: 2005-2-25 13:00
不好意思,另一个模块是用来重排雷区的,那就要写权限了。我这一句是从那儿直接Ctrl+C过来的。
作者: 天之血痕    时间: 2005-3-19 02:36
程序是我最弱的方面~~  向你们学习
作者: 游侠无极限    时间: 2005-3-19 09:05

我对这个东西放弃了,Eagle,给个怎么查找想要的内存地址的教程,比如你找到雷排列的地址的过程

还有olldbg的教程,哪里有?






欢迎光临 下沙论坛 (http://bbs.xiasha.cn/) Powered by Discuz! X3.3