环境:
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
选上就好了: