1分析消息循环后面的一个最重要的 call 00403400,它处理游戏中子弹,背景星星,飞机 的运动,和它们的碰撞等理解了这些做外挂就不成问题了(比如:炸不死的飞机,甚至 可以让飞机自动躲子弹) 流程概述 1. 显示一闪一闪的星星 2. 控制子弹的运行,控制子弹和飞机的碰撞 3. 飞机位移,方向,姿势的控制 流程分析 004034C1 |. 8B3D FC694000 mov edi, dword ptr [4069FC] 004034C7 |. 8BD0 mov edx, eax 004034C9 |. C1E2 06 shl edx, 6 004034CC |. 8D1492 lea edx, dword ptr [edx+edx*4] 004034CF |. 8B0D 006A4000 mov ecx, dword ptr [406A00] 004034D5 |. 03D1 add edx, ecx 004034D7 |. B9 F0000000 mov ecx, 0F0 004034DC |. 2BC8 sub ecx, eax 004034DE |. 8BC1 mov eax, ecx 004034E0 |. C1E0 06 shl eax, 6 004034E3 |. 8D0480 lea eax, dword ptr [eax+eax*4] 004034E6 |. 85C0 test eax, eax 004034E8 |. 7E 0B jle short 004034F5 004034EA |> 8A0A /mov cl, byte ptr [edx] 004034EC |. 880F |mov byte ptr [edi], cl 004034EE |. 42 |inc edx 004034EF |. 47 |inc edi 004034F0 |. 48 |dec eax 004034F1 |. 85C0 |test eax, eax 004034F3 |.^ 7F F5 \jg short 004034EA 4069FC 里面放的变量就是前面 CreateDIBSection 创建的可绘图内存的首地址,上面的操作 就是把计算好的星星的位置放入这个可给图内存里(这个内存的 DC 可以用 BitBlt 直接贴 到前台游戏画面上去) 。
004035FB |> \BA 002C0100 mov edx, 12C00 00403600 |. A1 FC694000 mov eax, dword ptr [4069FC] 00403605 |. E8 4AEBFFFF call 00402154 0040360A |> E8 ADF9FFFF call 00402FBC 4069FC->可绘图内存,call 00402154 是用来清除屏幕的,如果没这个函数的话我们看 到的子弹(还有飞机)将的一条线状的慢慢地被拉的很长 call 00402FBC 是用来控制子弹的 跟进去:00402FD2 |. C70424 106E40>mov dword ptr [esp], 00406E10 把子弹信息数组的 首地址传给了局部变量 00403040 |> \8B1424 |mov edx, dword ptr [esp] 00403043 |. 8B0424 |mov eax, dword ptr [esp] 00403046 |. 8B0D 806D4000 |mov ecx, dword ptr [406D80] 0040304C |. 8B1A |mov ebx, dword ptr [edx]20040304E |. 8B50 04 |mov edx, dword ptr [eax+4] 00403051 |. C1EA 06 |shr edx, 6 00403054 |. C1EB 06 |shr ebx, 6 00403057 |. 83EA 04 |sub edx, 4 0040305A |. 83EB 04 |sub ebx, 4 0040305D |. 85C9 |test ecx, ecx 0040305F |. 895424 04 |mov dword ptr [esp+4], edx 00403063 /0F85 D0000000 jnz 00403139 把子弹的坐标信息提取出来。
mov ebx, dword ptr [edx]提取 X 坐标, mov edx, dword ptr [eax+4]提取 Y 坐标这里的坐标信息是压缩的通过位移来还原 00403046 |. 8B0D 806D4000 |mov ecx, dword ptr [406D80]是把全局变量的标识传给了 ecx 在下面做了判断这个变量就是用来标识飞机是否死的如果把上面的 jnz 改为 jmp 这个 飞机就永远死不了了 我们顺带把子弹的信息格式说一下: 一共 15 个字节:前 4 个是 X 坐标信息,接着 4 个字节是 Y 坐标信息,接着 1 个字节是方 向信息 在下面也会判断飞机是否死亡然后给死亡标识变量,赋值: 00403115 |. /73 12 |jnb short 00403129 00403117 |. |FF05 0C6E4000 |inc dword ptr [406E0C] 0040311D |. |EB 0A |jmp short 00403129 0040311F |> |C705 0C6E4000>|mov dword ptr [406E0C], 1 _______________________________________________________________________________ 004030D9 |. 8B1424 |mov edx, dword ptr [esp] 004030DC |. C642 09 00 |mov byte ptr [edx+9], 0 004030E0 |. FF0D B46D4000 |dec dword ptr [406DB4] 004030E6 |. A1 B46D4000 |mov eax, dword ptr [406DB4] 004030EB |. 85C0 |test eax, eax 004030ED |. 74 4A |je short 00403139 004030EF |. 0105 B86D4000 |add dword ptr [406DB8], eax 004030F5 |. C705 046E4000>|mov dword ptr [406E04], 64 004030FF |. 8B5424 0C |mov edx, dword ptr [esp+C] 00403103 |. 8B0D 086E4000 |mov ecx, dword ptr [406E08] 00403109 |. 3BD1 |cmp edx, ecx 0040310B |. 73 12 |jnb short 0040311F 0040310D |. A1 0C6E4000 |mov eax, dword ptr [406E0C] 00403112 |. 83F8 0A |cmp eax, 0A 00403115 |. 73 12 |jnb short 00403129 00403117 |. FF05 0C6E4000 |inc dword ptr [406E0C] 0040311D |. EB 0A |jmp short 00403129 上面拿飞机和子弹的坐标进行对比。
碰撞就在全局标识里赋值了 这里子弹的运动就是程序上面在子弹信息数组里完成的 0040328E |. 8B35 FC694000 |mov esi, dword ptr [4069FC] 00403294 |. C1E0 06 |shl eax, 6 00403297 |. 03F3 |add esi, ebx300403299 |. 8D5424 10 |lea edx, dword ptr [esp+10] 0040329D |. 8D0480 |lea eax, dword ptr [eax+eax*4] 004032A0 |. 03F0 |add esi, eax 004032A2 |. 33FF |xor edi, edi 004032A4 |> 8B4424 04 |/mov eax, dword ptr [esp+4] 004032A8 |. 03C7 ||add eax, edi 004032AA |. 85C0 ||test eax, eax 004032AC |. 72 33 ||jb short 004032E1 004032AE |. 3D F0000000 ||cmp eax, 0F0 004032B3 |. 73 2C ||jnb short 004032E1 004032B5 |. 33C0 ||xor eax, eax 004032B7 |> 8A0A ||/mov cl, byte ptr [edx] 004032B9 |. 84C9 |||test cl, cl 004032BB |. 74 14 |||je short 004032D1 004032BD |. 8BC8 |||mov ecx, eax 004032BF |. 03CB |||add ecx, ebx 004032C1 |. 85C9 |||test ecx, ecx 004032C3 |. 72 0C |||jb short 004032。