【文章标题】: Zapline第十天算法分析
【文章作者】: samisgod
【作者邮箱】: 21gh@163.com
【下载地址】: http://bbs.52pojie.cn/thread-18642-1-1.html
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
关键点查找很简单,这里只简单贴下算法00401127 > /0FBE8E FE204000 movsx ecx,byte ptr ds:[esi+4020FE] ; 4020FE是一张表,下面会给出
0040112E . |83F9 4D cmp ecx,4D ; 0x4D是最后一个数值
00401131 . |74 2F je short 00401162 ; 流程结束?
00401133 . |890D 5E214000 mov dword ptr ds:[40215E],ecx 存入[40215E]
00401139 . |51 push ecx ; /ButtonID=表中对应值
0040113A . |FF75 08 push dword ptr ss:[ebp+8] ; |hWnd = 000402E8 ('Duelist's Crackme #3',class='#32770')
0040113D . |E8 D0010000 call 00401312 ; \IsDlgButtonChecked
00401142 . |46 inc esi ; esi+=1
00401143 . |83F8 00 cmp eax,0
00401146 ^ 74 DF je short 00401127 ; 对应框勾上则往下走
00401148 |A1 5E214000 mov eax,dword ptr ds:[40215E] ; 取得该次表值
0040114D |0FBE8E FE204000 movsx ecx,byte ptr ds:[esi+4020FE] ; 取得下一位表值
00401154 |0FAFC1 imul eax,ecx
00401157 . |0FAFC6 imul eax,esi ; 两表值相加再乘以循环次数
0040115A . |0105 62214000 add dword ptr ds:[402162],eax ; 累加放入[402162]
00401160 .^\EB C5 jmp short 00401127 ; 继续循环
00401162 > A1 62214000 mov eax,dword ptr ds:[402162] ;
00401167 . 6BC0 4D imul eax,eax,4D ; /[402162]*4与0x0F35466比较
0040116A . 3D 6654F300 cmp eax,0F35466 ; \也就是上面流程得到值应为0x328FE
0040116F . 75 20 jnz short 00401191 ; DueList_.00401191
00401171 . 68 00200000 push 2000 ; /Style = MB_OK|MB_TASKMODAL
00401176 . 68 01204000 push 402001 ; |duelist's crackme #3
0040117B . 68 17204000 push 402017 ; |congratulations! please send a screenshot of your solution to duelist@beer.com!
00401180 . 6A 00 push 0 ; |hOwner = NULL
00401182 . E8 55010000 call 004012DC ; \MessageBoxA
00401187 . B8 01000000 mov eax,1
0040118C .^ E9 69FFFFFF jmp 004010FA ; DueList_.004010FA
00401191 > 68 00200000 push 2000 ; /Style = MB_OK|MB_TASKMODAL
00401196 . 68 01204000 push 402001 ; |duelist's crackme #3
0040119B . 68 68204000 push 402068 ; |your registration info is invalid... please support shareware authors by buying software!
004011A0 . 6A 00 push 0 ; |hOwner = NULL
004011A2 . E8 35010000 call 004012DC ; \MessageBoxA
004011A7 . B8 00000000 mov eax,0
4020FE的表值如下
004020FE 16 49 5E 15 27 26 21 25 I^'&!%
00402106 1D 59 53 37 31 48 5D 0C YS71H].
0040210E 61 52 4D 00 00 00 00 00 aRM.....
整理一下得到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
16 49 5E 15 27 26 21 25 1D 59 53 37 31 48 5D 0C 61 52 4D
这里我们猥琐一下,把401146处的je给NOP掉,然后在40115A处下断(用完后记得恢复)
让程序帮我们计算出每次的值,之后得到下表
1.646
2.359C
3.1722
4.CCC
5.1CF2
6.1D64
7.2163
8.2188
9.5ABD
10.1208E
11.C427
12.7E54
13.B328
14.16E30
15.4164
16.48C0
17.21032
18.1BBF4
于是问题变成从这里面取出不定项的值相加等于0x328FE的问题..
我没写程序,直接将前面较小的几项相加,然后根据与后面值相加拼凑结果进行增减....
于是算了N长时间...
最后得出结果为
0x328FE=0x359C+0x1722+0xCCC+0x1CF2+0x1D64+0x2163+0xC427+0x16E30+0x4164
分别为2 3 4 5 6 7 11 14 15项
下面要计算到底要按哪个按钮
上面计算出了分别为2 3 4 5 6 7 11 14 15项
整理下可得对应按钮ID如下表所示
49 5E 15 27 26 21 53 48 5D
这时候可以随便掏出个工具查看下CM的每个框的ID了
我用了个Spy4Win
得到对应ID如下
61 49 5E 16 25 26 21 59 53
15 37 31 48 5D 0C 52 27 1D
最后即可计算出要打勾的框为
#1-2 #1-3 #2-1 #2-8 #1-6 #1-7 #1-9 #2-4 #2-5
注册成功
[ 本帖最后由 samisgod 于 2009-2-6 16:28 编辑 ] |