環境:
Windows xp sp3
工具:
Ollydbg
exeinfope
0x00 查殼
無殼的程序
0x01 分析
應該就是選上某個或多個框后點Check就能成功的,那應該就是不同框對應不同的值咯。旁邊還有個提示:建議使用資源編輯器。
直接OD載入,看看不同的框代表什么值。
00401127 > /0FBE8E FE2040>movsx ecx,byte ptr ds:[esi+0x4020FE] ; 這里獲取框的值
0040112E . |83F9 4D cmp ecx,0x4D
00401131 . |74 2F je XDueList_.00401162
00401133 . |890D 5E214000 mov dword ptr ds:[0x40215E],ecx
00401139 . |51 push ecx ; /ButtonID
0040113A . |FF75 08 push dword ptr ss:[ebp+0x8] ; |hWnd
0040113D . |E8 D0010000 call <jmp.&USER32.IsDlgButtonChecked> ; \IsDlgButtonChecked
00401142 . |46 inc esi ; 看看這個框是不是被選上了
00401143 . |83F8 00 cmp eax,0x0
00401146 .^ 74 DF je XDueList_.00401127 ; 是的話就往下計算,不是就下一個框
00401148 . |A1 5E214000 mov eax,dword ptr ds:[0x40215E]
0040114D . |0FBE8E FE2040>movsx ecx,byte ptr ds:[esi+0x4020FE]
00401154 . |0FAFC1 imul eax,ecx
00401157 . |0FAFC6 imul eax,esi
0040115A . |0105 62214000 add dword ptr ds:[0x402162],eax
00401160 .^\EB C5 jmp XDueList_.00401127
00401162 > A1 62214000 mov eax,dword ptr ds:[0x402162] ; 這個值要328FE
00401167 . 6BC0 4D imul eax,eax,0x4D
0040116A . 3D 6654F300 cmp eax,0xF35466
0040116F . 75 20 jnz XDueList_.00401191
在401142處下個斷點,選一個框就運行一次,18次就能知道哪幾個框對應哪幾個值了,而且還知道對應的順序。如下:
復選框的編號:1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18復選框的屬性:
順序 值 編號
1 0x16 4
2 0x49 2
3 0x5E 3
4 0x15 10
5 0x27 17
6 0x26 6
7 0x21 7
8 0x25 5
9 0x1D 18
10 0x59 8
11 0x53 9
12 0x37 11
13 0x31 12
14 0x48 13
15 0x5D 14
16 0xC 15
17 0x61 1
18 0x52 16
19 0x4D 結束
0x02 算法分析
計算過程就兩三行:
00401148 . A1 5E214000 mov eax,dword ptr ds:[0x40215E]
0040114D . 0FBE8E FE2040>movsx ecx,byte ptr ds:[esi+0x4020FE]
00401154 . 0FAFC1 imul eax,ecx
00401157 . 0FAFC6 imul eax,esi
0040115A . 0105 62214000 add dword ptr ds:[0x402162],eax
00401160 .^\EB C5 jmp XDueList_.00401127
00401162 > A1 62214000 mov eax,dword ptr ds:[0x402162] ; 這個值要328FE
00401167 . 6BC0 4D imul eax,eax,0x4D
0040116A . 3D 6654F300 cmp eax,0xF35466
因為每個復選框對應一個ID:
被選中的復選框的ID* 下一個復選框的ID *當前復選框的次序 = 被選中的復選框的值
最后一個復選框被選上的話會有一個0x4D作為結束的ID。
將所有被選中的復選框的值加起來,乘以0x4D,看看乘積是否為0xF35466,如果等于則成功。
注冊機也不難寫,每個框對應的值出來后,深搜一遍,看看哪種組合的情況下會等于即可。
于是得到:
2 3 4 5 6 7 11 14 15 //這是用到的值的次序編號,還有看看這些值是由哪幾個位置的框計算出來的
對應的框框位置:
2 3 10 17 6 7 9 13 14
選上就好了: