首页
社区
课程
招聘
[旧帖] [原创]连连看分析(一)(二)(三) 0.00雪花
发表于: 2015-5-23 13:51 8210

[旧帖] [原创]连连看分析(一)(二)(三) 0.00雪花

2015-5-23 13:51
8210
收藏
免费 3
支持
分享
最新回复 (52)
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
准备购买个邀请码好好学习技术!
2015-5-26 17:06
0
雪    币: 42
活跃值: (196)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27
mark !
2015-5-26 17:29
0
雪    币: 1626
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
28
感觉好有意思的样子...
2015-5-26 17:30
0
雪    币: 247
活跃值: (141)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
mark~
2015-5-26 17:30
0
雪    币: 1626
活跃值: (148)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
30
分享了不错,支持一下!

GO on!
2015-5-26 18:01
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31
mark一下
2015-5-26 19:25
0
雪    币: 222
活跃值: (739)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
32
下面我们分析一下菜单中对应的功能,看看都做了些什么呢?
先上菜单图,看看菜单长什么样子



我们先来分析下高级选项,也就是高级难度开局
00404AB0  /$  56            PUSH ESI
00404AB1  |.  8BF1          MOV ESI,ECX
00404AB3  |.  B8 01000000   MOV EAX,1
00404AB8  |.  C786 B40A0000>MOV DWORD PTR DS:[ESI+AB4],3            ;  难度
00404AC2  |.  C786 C40A0000>MOV DWORD PTR DS:[ESI+AC4],0           ;  得分
00404ACC  |.  C786 BC0A0000>MOV DWORD PTR DS:[ESI+ABC],4           ;  生命
00404AD6  |.  C786 C00A0000>MOV DWORD PTR DS:[ESI+AC0],8           ;  提示
00404AE0  |.  8986 B80A0000 MOV DWORD PTR DS:[ESI+AB8],EAX         ;关卡
00404AE6  |.  8986 DC050000 MOV DWORD PTR DS:[ESI+5DC],EAX        ;开局标志
00404AEC  |.  E8 EF2F0000   CALL llk4.00407AE0                  
  ;  menu的一些处理,
;比如灰化初级,中级,高级。。。这些选项
;激活放弃,洗牌这些选项
00404AF1  |.  8BCE          MOV ECX,ESI
00404AF3  |.  E8 38F8FFFF   CALL llk4.00404330                     
  ;  填充棋盘棋子ID等一些操作
00404AF8  |.  8B46 1C       MOV EAX,DWORD PTR DS:[ESI+1C]
00404AFB  |.  6A 00         PUSH 0                                   ; /Timerproc = NULL
00404AFD  |.  68 20030000   PUSH 320                                 ; |Timeout = 800. ms
00404B02  |.  6A 02         PUSH 2                                   ; |TimerID = 2
00404B04  |.  50            PUSH EAX                                 ; |hWnd
00404B05  |.  FF15 E0B44300 CALL DWORD PTR DS:[<&USER32.SetTimer>]   ; \SetTimer
;设置了1个定时器
00404B0B  |.  8B4E 1C       MOV ECX,DWORD PTR DS:[ESI+1C]
00404B0E  |.  6A 00         PUSH 0                                   ; /Erase = FALSE
00404B10  |.  6A 00         PUSH 0                                   ; |pRect = NULL
00404B12  |.  51            PUSH ECX                                 ; |hWnd
00404B13  |.  FF15 B8B44300 CALL DWORD PTR DS:[<&USER32.InvalidateRe>; \InvalidateRect
;刷新
00404B19  |.  5E            POP ESI
00404B1A  \.  C3            RETN

高级开局的结构很简单吧?哈哈,初级,中级都是一样的

看了开局,我们再看个结束游戏,也就是放弃,
00404B20  /$  83EC 54       SUB ESP,54
00404B23  |.  56            PUSH ESI                                 ;  llk4.0043BB18
00404B24  |.  8BF1          MOV ESI,ECX
00404B26  |.  6A 02         PUSH 2                                   ; /TimerID = 2
00404B28  |.  8B46 1C       MOV EAX,DWORD PTR DS:[ESI+1C]            ; |
00404B2B  |.  50            PUSH EAX                                 ; |hWnd
00404B2C  |.  FF15 80B44300 CALL DWORD PTR DS:[<&USER32.KillTimer>]  ; \KillTimer
;销毁定时器
00404B32  |.  8BCE          MOV ECX,ESI
00404B34  |.  C786 DC050000>MOV DWORD PTR DS:[ESI+5DC],0           
  ;  开局标志置零
00404B3E  |.  C786 94000000>MOV DWORD PTR DS:[ESI+94],1
00404B48  |.  E8 932F0000   CALL llk4.00407AE0
;菜单的一些处理
00404B4D  |.  8B46 64       MOV EAX,DWORD PTR DS:[ESI+64]
00404B50  |.  85C0          TEST EAX,EAX
00404B52  |.  74 3A         JE SHORT llk4.00404B8E
;可能是检查它的背景大图是否已经加载了,它跳转去下面了
00404B54  |.  6A 00         PUSH 0
00404B56  |.  8D4C24 0C     LEA ECX,DWORD PTR SS:[ESP+C]
00404B5A  |.  68 EC664400   PUSH llk4.004466EC                       ;  ASCII "img\z%d.jpg"
00404B5F  |.  51            PUSH ECX
00404B60  |.  C746 68 00000>MOV DWORD PTR DS:[ESI+68],0
00404B67  |.  E8 A9970100   CALL llk4.0041E315
00404B6C  |.  83C4 08       ADD ESP,8
00404B6F  |.  8D5424 0C     LEA EDX,DWORD PTR SS:[ESP+C]
00404B73  |.  8BCC          MOV ECX,ESP
00404B75  |.  896424 08     MOV DWORD PTR SS:[ESP+8],ESP
00404B79  |.  52            PUSH EDX
00404B7A  |.  E8 A4CC0200   CALL llk4.00431823
00404B7F  |.  8D4E 7C       LEA ECX,DWORD PTR DS:[ESI+7C]
00404B82  |.  E8 09E0FFFF   CALL llk4.00402B90
00404B87  |.  C746 64 00000>MOV DWORD PTR DS:[ESI+64],0
;;跳转到这里
00404B8E  |>  8B46 1C       MOV EAX,DWORD PTR DS:[ESI+1C]
00404B91  |.  6A 00         PUSH 0                                   ; /Erase = FALSE
00404B93  |.  6A 00         PUSH 0                                   ; |pRect = NULL
00404B95  |.  50            PUSH EAX                                 ; |hWnd
00404B96  |.  FF15 B8B44300 CALL DWORD PTR DS:[<&USER32.InvalidateRe>; \InvalidateRect
;刷新
00404B9C  |.  5E            POP ESI
00404B9D  |.  83C4 54       ADD ESP,54
00404BA0  \.  C3            RETN

结束和开始的过程基本上都是对应的,先分析到这里,休息一下
上传的附件:
2015-5-27 10:48
0
雪    币: 206
活跃值: (85)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
33
不错,感谢分享!
2015-5-27 16:53
0
雪    币: 222
活跃值: (739)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
34
休息好了,我们继续分析其他的内容,提示功能,先看图


第一张是正常的提示图,可消除的2个棋子背景色变了
第二张图中的2个棋子背景色变了,但是不可消除,
恩,我在提示函数中动了下手脚
看提示函数
00406020  /$  56            PUSH ESI
00406021  |.  8BF1          MOV ESI,ECX
00406023  |.  8B86 C00A0000 MOV EAX,DWORD PTR DS:[ESI+AC0]         
;  可用提示个数
00406029  |.  85C0          TEST EAX,EAX
0040602B  |.  7E 51         JLE SHORT llk4.0040607E                 
;  没有就跳至返回
0040602D  |.  8D86 C0000000 LEA EAX,DWORD PTR DS:[ESI+C0]            
;  16字节空间,用来返回2个可消除的棋子位置(列数,列中位置)
;1个棋子位置结构占8字节
;[ESI+C0] (第一个棋子列数,列中的位置也就是行数),8字节
;[ESI+C8] (第二个棋子列数,列中的位置也就是行数),8字节
00406033  |.  50            PUSH EAX                                 ; /Arg1
;地址作为参数
00406034  |.  E8 97FAFFFF   CALL llk4.00405AD0                 ; \llk4.00405AD0
;返回2个棋子位置数据
;我在这里改了下棋子的位置数据,就有了第二张图
;他没有在提示函数中上色,而是刷新以后,根据这个16字节空间里的数据上色
00406039  |.  85C0          TEST EAX,EAX
0040603B  |.  74 41         JE SHORT llk4.0040607E                  
;  没有可消除的就跳至返回
0040603D  |.  8B86 F4000000 MOV EAX,DWORD PTR DS:[ESI+F4]
00406043  |.  85C0          TEST EAX,EAX
00406045  |.  74 1C         JE SHORT llk4.00406063                  
;  检查是否开了声音
00406047  |.  E8 17030300   CALL llk4.00436363
0040604C  |.  8B40 04       MOV EAX,DWORD PTR DS:[EAX+4]
0040604F  |.  68 85000400   PUSH 40085
00406054  |.  8B48 68       MOV ECX,DWORD PTR DS:[EAX+68]
00406057  |.  51            PUSH ECX
00406058  |.  68 96000000   PUSH 96
0040605D  |.  FF15 1CB54300 CALL DWORD PTR DS:[<&WINMM.PlaySoundA>]  ;  WINMM.PlaySoundA
00406063  |>  8B86 C00A0000 MOV EAX,DWORD PTR DS:[ESI+AC0]         
;  没开声音这里执行
00406069  |.  8B56 1C       MOV EDX,DWORD PTR DS:[ESI+1C]
0040606C  |.  6A 00         PUSH 0                                   ; /Erase = FALSE
0040606E  |.  48            DEC EAX                                  ; |
0040606F  |.  6A 00         PUSH 0                                   ; |pRect = NULL
00406071  |.  52            PUSH EDX                                 ; |hWnd
00406072  |.  8986 C00A0000 MOV DWORD PTR DS:[ESI+AC0],EAX           ; |
00406078  |.  FF15 B8B44300 CALL DWORD PTR DS:[<&USER32.InvalidateRe>; \InvalidateRect
0040607E  |>  5E            POP ESI                                  ;  刷新
0040607F  \.  C3            RETN
提示功能就分析完了,它里面的搜索2个可消除棋子的算法,可以用在自动消除里,
哈哈,休息一下
上传的附件:
2015-5-29 11:22
0
雪    币: 222
活跃值: (739)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
35

感谢楼上各位的支持
2015-5-29 11:35
0
雪    币: 247
活跃值: (141)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
36
能问问一下,用OD怎么定位 重新洗牌 函数?还有那些菜单里面的函数?
2015-5-29 12:42
0
雪    币: 222
活跃值: (739)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
37
可以通过一些数据的访问,进行回溯,比如对生命,提示,ID的变化,等等
也可以设一些API断点,也可以通过消息处理跟踪(较难),希望对你有帮助
2015-5-29 17:48
0
雪    币: 247
活跃值: (141)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
38
谢谢,我试试,不懂得地方再请教你哈!
2015-5-29 18:23
0
雪    币: 222
活跃值: (739)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
39
哈哈,我们对连连看的各种属性都分析的差不多,后面我们就要开始编辑添加我们的功能了
要加入我们的功能,功能代码放哪里呢?我们就放入原程序里吧,对它再加工。
具体放在原程序的哪个位置呢?为了方便我们新建一个节区,看下面的图


多了一个.xing的区段,大小1000h
下面是添加区段的过程

红色是修改过的
用winhex打开llk4.exe编辑如下几个地方
NumberOfSections :节区数原来是4,改为5
SizeOfImage:文件镜像大小原来是001cc000  改为 001cd000 增加1000
再增加一个IMAGE_SECTION_HEADER,大小28h,接着.rsrc ,把后面的0000.。。改掉
如果增加额外的进去会改变后面的偏移,会出错,所以直接在000上改
前8字节,节区名称,
+8:VirtualSize 改为1000  
+0c: VirtualAddress  改为 001cc000
+10: SizeOfRawData 改为 1000
+14:PointRawData 改为 001cc000
+24:Characteristics 改为 e0000006
然后看文件最末尾,
用00一直添加至地址001ccfff,补齐大小
另存为llk-1,OD打开,查看节区,有.xing,正常
第一步就做完了,休息一下
上传的附件:
2015-5-30 22:29
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
40
分析的很到位
2015-5-30 23:25
0
雪    币: 222
活跃值: (739)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
41
上个帖子中,我们在原程序中增加了一个节区,我们就在这个节区内增加一点代码,
添加一个菜单项,来响应我们的操作。哈哈,不过还真没有注入个DLL制作起来方便,
水平有限,编辑菜单能力一般,先改成这样吧

下面是代码,写入我们新加的节区里
005CC000    53              PUSH EBX
005CC001    55              PUSH EBP
005CC002    56              PUSH ESI
005CC003    57              PUSH EDI
005CC004    51              PUSH ECX
;上面是保存上下文环境
;下面是主要代码
005CC005    8BE9            MOV EBP,ECX
005CC007    8B45 1C         MOV EAX,DWORD PTR SS:[EBP+1C]
005CC00A    50              PUSH EAX
005CC00B    FF15 74B44300   CALL DWORD PTR DS:[<&USER32.GetMenu>]    ; USER32.GetMenu
005CC011    A3 20CA5C00     MOV DWORD PTR DS:[5CCA20],EAX
005CC016    68 05CA5C00     PUSH llk4-4.005CCA05                     ; ASCII "user32.dll"
005CC01B    FF15 ACB24300   CALL DWORD PTR DS:[<&KERNEL32.GetModuleH>; kernel32.GetModuleHandleA
005CC021    68 10CA5C00     PUSH llk4-4.005CCA10                     ; ASCII "InsertMenuA"
005CC026    50              PUSH EAX
005CC027    FF15 BCB24300   CALL DWORD PTR DS:[<&KERNEL32.GetProcAdd>; kernel32.GetProcAddress
005CC02D    68 60CA5C00     PUSH llk4-4.005CCA60
005CC032    68 01900000     PUSH 9001
005CC037    6A 00           PUSH 0
005CC039    6A 02           PUSH 2
005CC03B    FF35 20CA5C00   PUSH DWORD PTR DS:[5CCA20]
005CC041    FFD0            CALL EAX
;总结起来就是得到菜单句柄,添加菜单项
;上面是主要代码
;下面是恢复上下文环境
005CC043    59              POP ECX
005CC044    5F              POP EDI
005CC045    5E              POP ESI
005CC046    5D              POP EBP
005CC047    5B              POP EBX
005CC048    53              PUSH EBX
005CC049    55              PUSH EBP
005CC04A    8BE9            MOV EBP,ECX
005CC04C    56              PUSH ESI
005CC04D    57              PUSH EDI
005CC04E    68 E67A4000     PUSH llk4-4.00407AE6
005CC053    833D 1CCA5C00 0>CMP DWORD PTR DS:[5CCA1C],1
005CC05A    74 0B           JE SHORT llk4-4.005CC067
005CC05C    C705 1CCA5C00 0>MOV DWORD PTR DS:[5CCA1C],1
005CC066    C3              RETN
005CC067    C705 1CCA5C00 0>MOV DWORD PTR DS:[5CCA1C],1
005CC071    C3              RETN
;返回到hook的地方,00407AE6 处执行
;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;HOOK的地方
00407AE0  /$  68 00C05C00   PUSH llk4-4.005CC000
00407AE5  \.  C3            RETN
;上面2句跳到我们的代码中
00407AE6   .  8B45 1C       MOV EAX,DWORD PTR SS:[EBP+1C]
00407AE9   .  50            PUSH EAX                                 ; /hWnd
00407AEA   .  FF15 74B44300 CALL DWORD PTR DS:[<&USER32.GetMenu>]    ; \GetMenu
00407AF0   .  50            PUSH EAX
,,我们在消息相关的API处下个断点,设个条件当消息值等于111,也就是WM_COMMAND
,点击我们的心菜单项,断下,ID是9001,正确,这一步就完成了
响应代码我们下次再看
上传的附件:
2015-5-31 18:47
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
42
也许是巧合,郁丁香外挂视频上面,就有这个例子。不喜勿喷。
2015-6-1 09:13
0
雪    币: 999
活跃值: (274)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
43
厉害厉害 上来就正式了
2015-6-1 15:11
0
雪    币: 222
活跃值: (739)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
44
对(十一)中的错误修改
005CC000    53              PUSH EBX
005CC001    55              PUSH EBP
005CC002    56              PUSH ESI
005CC003    57              PUSH EDI
005CC004    51              PUSH ECX
005CC005    8BE9            MOV EBP,ECX
005CC007    8B45 1C         MOV EAX,DWORD PTR SS:[EBP+1C]
005CC00A    50              PUSH EAX
005CC00B    FF15 74B44300   CALL DWORD PTR DS:[<&USER32.GetMenu>]    ; USER32.GetMenu
005CC011    A3 20CA5C00     MOV DWORD PTR DS:[5CCA20],EAX
005CC016    68 05CA5C00     PUSH llk4-4.005CCA05                     ; ASCII "user32.dll"
005CC01B    FF15 ACB24300   CALL DWORD PTR DS:[<&KERNEL32.GetModuleH>; kernel32.GetModuleHandleA
005CC021    68 10CA5C00     PUSH llk4-4.005CCA10                     ; ASCII "InsertMenuA"
005CC026    50              PUSH EAX
005CC027    FF15 BCB24300   CALL DWORD PTR DS:[<&KERNEL32.GetProcAdd>; kernel32.GetProcAddress
005CC02D    68 60CA5C00     PUSH llk4-4.005CCA60
005CC032    68 01900000     PUSH 9001
005CC037    6A 00           PUSH 0
005CC039    6A 02           PUSH 2
005CC03B    FF35 20CA5C00   PUSH DWORD PTR DS:[5CCA20]
005CC041    FFD0            CALL EAX
005CC043    59              POP ECX
005CC044    5F              POP EDI
005CC045    5E              POP ESI
005CC046    5D              POP EBP
005CC047    5B              POP EBX
005CC048    53              PUSH EBX
005CC049    55              PUSH EBP
005CC04A    8BE9            MOV EBP,ECX
005CC04C    56              PUSH ESI
005CC04D    57              PUSH EDI
005CC04E    68 E67A4000     PUSH llk4-4.00407AE6
005CC053    C3              RETN
005CC054    833D 1CCA5C00 0>CMP DWORD PTR DS:[5CCA1C],1
005CC05B  ^ 74 EB           JE SHORT llk4-4.005CC048
005CC05D    C705 1CCA5C00 0>MOV DWORD PTR DS:[5CCA1C],1
005CC067  ^ EB 97           JMP SHORT llk4-4.005CC000
005CC069    90              NOP
005CC06A    90              NOP

hook的地方
00407AE0  /$  68 54C05C00   PUSH llk4-4.005CC054
00407AE5  \.  C3            RETN
2015-6-1 21:18
0
雪    币: 222
活跃值: (739)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
45
上附件,添加好代码的连连看
连连看4修改版.zip
说下详细的结构
005cc000开始是我们添加的节区,
代码从005cc000开始,,数据从005cca00开始
我HOOK了窗口的消息处理过程头部,转到我们的代码
005CC079    55              PUSH EBP                                 ; 添加代码开始
005CC07A    56              PUSH ESI
005CC07B    817C24 10 11010>CMP DWORD PTR SS:[ESP+10],111
;判断是否WM_CAMMAND
005CC083    75 46           JNZ SHORT llk4-4.005CC0CB
005CC085    817C24 14 01900>CMP DWORD PTR SS:[ESP+14],9001
;判断ID是否等于9001
005CC08D    75 3C           JNZ SHORT llk4-4.005CC0CB
005CC08F    90              NOP
005CC090    90              NOP
005CC091    90              NOP
005CC092    90              NOP
005CC093    90              NOP
005CC094    8B35 A4994400   MOV ESI,DWORD PTR DS:[4499A4]
005CC09A    83BE DC050000 0>CMP DWORD PTR DS:[ESI+5DC],1
;判断是否开局,开局标志
005CC0A1    75 28           JNZ SHORT llk4-4.005CC0CB
005CC0A3    833D 90CA5C00 0>CMP DWORD PTR DS:[5CCA90],0
;判断是否已经开始了添加的主程序
005CC0AA    75 1F           JNZ SHORT llk4-4.005CC0CB
005CC0AC    6A 00           PUSH 0
005CC0AE    6A 00           PUSH 0
005CC0B0    6A 00           PUSH 0
005CC0B2    68 00C15C00     PUSH llk4-4.005CC100                  ; 调用添加的主程序
005CC0B7    6A 00           PUSH 0
005CC0B9    6A 00           PUSH 0
005CC0BB    FF15 D0B14300   CALL DWORD PTR DS:[<&KERNEL32.CreateThre>; kernel32.CreateThread
;创建一个线程来执行
005CC0C1    C705 90CA5C00 0>MOV DWORD PTR DS:[5CCA90],1
005CC0CB    5E              POP ESI
005CC0CC    5D              POP EBP
005CC0CD    55              PUSH EBP
005CC0CE    8BEC            MOV EBP,ESP
005CC0D0    817D 0C 6003000>CMP DWORD PTR SS:[EBP+C],360
005CC0D7    68 28E84200     PUSH llk4-4.0042E828
005CC0DC    C3              RETN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
005CC100    6A 40           PUSH 40                                  ; 主程序
005CC102    68 00100000     PUSH 1000
005CC107    68 00100000     PUSH 1000
005CC10C    6A 00           PUSH 0
005CC10E    FF15 C4B24300   CALL DWORD PTR DS:[<&KERNEL32.VirtualAll>; kernel32.VirtualAlloc
;申请一块内存
005CC114    A3 70CA5C00     MOV DWORD PTR DS:[5CCA70],EAX
005CC119    50              PUSH EAX
005CC11A    E8 42010000     CALL llk4-4.005CC261                  
  ; 调用初始化表,建立一张和ID棋盘结构对应的坐标表
005CC11F    90              NOP                                      
005CC120    68 80CA5C00     PUSH llk4-4.005CCA80
;.005CCA80,全局变量,指针,指向16字节大小的空间
005CC125    8B0D A4994400   MOV ECX,DWORD PTR DS:[4499A4]
005CC12B    E8 A099E3FF     CALL llk4-4.00405AD0                    
; 调用提示功能,得到2个可消除的棋子的位置
005CC130    832D 80CA5C00 0>SUB DWORD PTR DS:[5CCA80],2
;原ID表开始处比我们的坐标表多了2个列结构,减2,偏移就一样了,第一个棋子
005CC137    832D 88CA5C00 0>SUB DWORD PTR DS:[5CCA88],2
;同上     第二个棋子
005CC13E    E8 6F010000     CALL llk4-4.005CC2B2                  
; 根据位置在坐标表中搜索坐标
005CC143    FF35 84CA5C00   PUSH DWORD PTR DS:[5CCA84]
005CC149    FF35 80CA5C00   PUSH DWORD PTR DS:[5CCA80]
005CC14F    6A 01           PUSH 1
005CC151    8B0D A4994400   MOV ECX,DWORD PTR DS:[4499A4]
005CC157    E8 548AE3FF     CALL llk4-4.00404BB0                    
; 调用选中第一个棋子
005CC15C    FF35 8CCA5C00   PUSH DWORD PTR DS:[5CCA8C]
005CC162    FF35 88CA5C00   PUSH DWORD PTR DS:[5CCA88]
005CC168    6A 01           PUSH 1
005CC16A    8B0D A4994400   MOV ECX,DWORD PTR DS:[4499A4]
005CC170    E8 3B8AE3FF     CALL llk4-4.00404BB0                  
  ; 调用选中第二个棋子
005CC175    68 50000000     PUSH 50
005CC17A    FF15 D8B14300   CALL DWORD PTR DS:[<&KERNEL32.Sleep>]    ;
kernel32.Sleep
;增加一点延时
005CC180    E8 2A000000     CALL llk4-4.005CC1AF                    
; 高级一共可消除72次,次数到停止
005CC185    85C0            TEST EAX,EAX
005CC187  ^ 75 97           JNZ SHORT llk4-4.005CC120
005CC189    C705 90CA5C00 0>MOV DWORD PTR DS:[5CCA90],0
005CC193    68 00400000     PUSH 4000
005CC198    68 00100000     PUSH 1000
005CC19D    FF35 70CA5C00   PUSH DWORD PTR DS:[5CCA70]
005CC1A3    FF15 28B14300   CALL DWORD PTR DS:[<&KERNEL32.VirtualFre>; kernel32.VirtualFree
;释放内存
005CC1A9    C3              RETN

主函数的过程很简单,总结起来
1。申请内存,建立坐标表
2。调用提示功能
3。把提示功能返回的棋子位置转化为坐标
4。调用选中棋子功能

建表和判断次数的函数略。还是有很多BUG,只支持高级模式。

【连连看分析】贴子就发完了,谢谢楼上各位朋友的支持,
希望看雪学院越来越好
上传的附件:
2015-6-2 17:50
0
雪    币: 222
活跃值: (739)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
46
哦,对了,补充一下,可能有类似病毒的特征码,我做好以后,杀毒会误报。
2015-6-2 17:52
0
雪    币: 2822
活跃值: (154)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
47
谢谢分享,学习一下!
2015-6-4 14:47
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
48
谢谢分享啊
2015-6-7 12:54
0
雪    币: 59
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
49
坛主真好啊,等我厉害了,也要分享,记得给我
2015-6-8 18:43
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
50
谢谢分享,学习一下!
2015-6-10 17:01
0
游客
登录 | 注册 方可回帖
返回
//