- 论坛徽章:
- 0
|
这个是作者有意这样做的。其实处理消息的地方就在下面。\r\n\r\n.text:260D410A loc_260D410A: \r\n.text:260D410A mov ecx, [ebp+var_28] //这里是上面那3个整数的数组,也可以看成3组4字节数组\r\n.text:260D410D call fun1_260D3940 //这个函数用于检查其中一组是否有重复字符,有返回1\r\n.text:260D4112 mov esi, eax\r\n.text:260D4114 mov ecx, [ebp+var_28]\r\n.text:260D4117 add ecx, 4\r\n.text:260D411A call fun1_260D3940 \r\n.text:260D411F add esi, eax\r\n.text:260D4121 mov ecx, [ebp+var_28]\r\n.text:260D4124 add ecx, 8\r\n.text:260D4127 call fun1_260D3940\r\n.text:260D412C add esi, eax\r\n.text:260D412E cmp esi, 1\r\n.text:260D4131 jz short loc_260D413A //必须在其中一组里要有重复字符(只能一组)\r\n.text:260D4133 xor eax, eax\r\n.text:260D4135 jmp loc_260D43B5\r\n.text:260D413A\r\n.text:260D413A loc_260D413A: \r\n.text:260D413A mov ecx, [ebp+var_28]\r\n.text:260D413D call fun1_260D3940\r\n.text:260D4142 test eax, eax\r\n.text:260D4144 jz short loc_260D414D\r\n.text:260D4146 mov [ebp+var_4], 0 //第一组有重复字符这里放0\r\n.text:260D414D\r\n.text:260D414D loc_260D414D: \r\n.text:260D414D mov ecx, [ebp+var_28]\r\n.text:260D4150 add ecx, 4\r\n.text:260D4153 call fun1_260D3940\r\n.text:260D4158 test eax, eax\r\n.text:260D415A jz short loc_260D4163\r\n.text:260D415C mov [ebp+var_4], 1 //第二组有重复字符这里放1\r\n.text:260D4163\r\n.text:260D4163 loc_260D4163: \r\n.text:260D4163 mov ecx, [ebp+var_28]\r\n.text:260D4166 add ecx, 8\r\n.text:260D4169 call fun1_260D3940\r\n.text:260D416E test eax, eax\r\n.text:260D4170 jz short loc_260D4179\r\n.text:260D4172 mov [ebp+var_4], 2 //第三组有重复字符这里放2\r\n.text:260D4179\r\n.text:260D4179 loc_260D4179: \r\n.text:260D4179 cmp [ebp+lParam], 0\r\n.text:260D417D jnz short loc_260D41B5\r\n.text:260D417F mov ecx, [ebp+var_4] //我们先假定这个变量为i\r\n.text:260D4182 mov edx, [ebp+var_28] //并且假定这个数组是unsigned int ci[3]\r\n.text:260D4185 lea eax, [edx+ecx*4] //取有重复字符那组\r\n.text:260D4188 mov [ebp+var_8], eax\r\n.text:260D418B mov ecx, [ebp+var_8]\r\n.text:260D418E xor edx, edx\r\n.text:260D4190 mov dl, [ecx+3]\r\n.text:260D4193 mov eax, [ebp+var_8]\r\n.text:260D4196 xor ecx, ecx\r\n.text:260D4198 mov cl, [eax+2]\r\n.text:260D419B mov eax, [ebp+var_8]\r\n.text:260D419E xor ebx, ebx\r\n.text:260D41A0 mov bl, [eax+1]\r\n.text:260D41A3 mov esi, [ebp+var_8]\r\n.text:260D41A6 xor eax, eax\r\n.text:260D41A8 mov al, [esi]\r\n.text:260D41AA add eax, ebx\r\n.text:260D41AC add eax, ecx\r\n.text:260D41AE add eax, edx\r\n.text:260D41B0 mov [ebp+lParam], eax //重复的那组索引累加和要等于60h或者61h\r\n.text:260D41B3 jmp short loc_260D41F2\r\n.text:260D41B5\r\n.text:260D41B5 loc_260D41B5: \r\n.text:260D41B5 mov ecx, [ebp+var_4]\r\n.text:260D41B8 mov edx, [ebp+var_28]\r\n.text:260D41BB lea eax, [edx+ecx*4]\r\n.text:260D41BE mov [ebp+var_C], eax\r\n.text:260D41C1 mov ecx, [ebp+var_C]\r\n.text:260D41C4 xor edx, edx\r\n.text:260D41C6 mov dl, [ecx+3]\r\n.text:260D41C9 mov eax, [ebp+var_C]\r\n.text:260D41CC xor ecx, ecx\r\n.text:260D41CE mov cl, [eax+2]\r\n.text:260D41D1 mov eax, [ebp+var_C]\r\n.text:260D41D4 xor ebx, ebx\r\n.text:260D41D6 mov bl, [eax+1]\r\n.text:260D41D9 mov esi, [ebp+var_C]\r\n.text:260D41DC xor eax, eax\r\n.text:260D41DE mov al, [esi]\r\n.text:260D41E0 add eax, ebx\r\n.text:260D41E2 add eax, ecx\r\n.text:260D41E4 add eax, edx\r\n.text:260D41E6 cmp eax, [ebp+lParam]\r\n.text:260D41E9 jz short loc_260D41F2\r\n.text:260D41EB xor eax, eax\r\n.text:260D41ED jmp loc_260D43B5\r\n.text:260D41F2\r\n.text:260D41F2 loc_260D41F2: \r\n.text:260D41F2 \r\n.text:260D41F2 mov ecx, [ebp+lParam]\r\n.text:260D41F5 mov [ebp+var_2C], ecx\r\n.text:260D41F8 cmp [ebp+var_2C], 60h\r\n.text:260D41FC jz short loc_260D420D //和等于60H跳\r\n.text:260D41FE cmp [ebp+var_2C], 61h\r\n.text:260D4202 jz loc_260D42D7 //和等于61H跳\r\n.text:260D4208 jmp loc_260D434C\r\n.text:260D420D\r\n.text:260D420D loc_260D420D: \r\n.text:260D420D mov eax, [ebp+var_4] //和60H,\r\n.text:260D4210 add eax, 1\r\n.text:260D4213 cdq\r\n.text:260D4214 mov ecx, 3\r\n.text:260D4219 idiv ecx\r\n.text:260D421B mov eax, [ebp+var_28]\r\n.text:260D421E mov eax, [eax+edx*4] //i = (i + 1) % 3\r\n.text:260D4221 xor edx, edx\r\n.text:260D4223 mov ecx, 3\r\n.text:260D4228 div ecx\r\n.text:260D422A test edx, edx //ci[i] % 3 要等于 0\r\n.text:260D422C jz short loc_260D4235\r\n.text:260D422E xor eax, eax\r\n.text:260D4230 jmp loc_260D43B5\r\n.text:260D4235\r\n.text:260D4235 loc_260D4235: \r\n.text:260D4235 mov eax, [ebp+var_4]\r\n.text:260D4238 add eax, 2\r\n.text:260D423B cdq\r\n.text:260D423C mov ecx, 3\r\n.text:260D4241 idiv ecx\r\n.text:260D4243 mov eax, [ebp+var_28]\r\n.text:260D4246 mov eax, [eax+edx*4] //i = (i + 2) % 3\r\n.text:260D4249 xor edx, edx\r\n.text:260D424B mov ecx, 3\r\n.text:260D4250 div ecx\r\n.text:260D4252 test edx, edx //ci[i] % 3 要等于 0\r\n.text:260D4254 jz short loc_260D425D\r\n.text:260D4256 xor eax, eax\r\n.text:260D4258 jmp loc_260D43B5\r\n.text:260D425D\r\n.text:260D425D loc_260D425D: \r\n.text:260D425D mov eax, [ebp+var_4]\r\n.text:260D4260 add eax, 1\r\n.text:260D4263 cdq\r\n.text:260D4264 mov ecx, 3\r\n.text:260D4269 idiv ecx\r\n.text:260D426B mov eax, [ebp+var_28]\r\n.text:260D426E mov eax, [eax+edx*4] //i = (i + 1) % 3\r\n.text:260D4271 xor edx, edx\r\n.text:260D4273 mov ecx, 5\r\n.text:260D4278 div ecx\r\n.text:260D427A test edx, edx //ci[i] % 5 要等于 0 \r\n.text:260D427C jz short loc_260D4285\r\n.text:260D427E xor eax, eax\r\n.text:260D4280 jmp loc_260D43B5\r\n.text:260D4285\r\n.text:260D4285 loc_260D4285: \r\n.text:260D4285 mov eax, [ebp+var_4]\r\n.text:260D4288 add eax, 2\r\n.text:260D428B cdq\r\n.text:260D428C mov ecx, 3\r\n.text:260D4291 idiv ecx\r\n.text:260D4293 mov eax, [ebp+var_28]\r\n.text:260D4296 mov eax, [eax+edx*4] //i = (i + 2) % 3\r\n.text:260D4299 xor edx, edx\r\n.text:260D429B mov ecx, 5\r\n.text:260D42A0 div ecx\r\n.text:260D42A2 test edx, edx //ci[i] % 5 要等于 0\r\n.text:260D42A4 jz short loc_260D42AD\r\n.text:260D42A6 xor eax, eax\r\n.text:260D42A8 jmp loc_260D43B5\r\n.text:260D42AD\r\n.text:260D42AD loc_260D42AD: \r\n.text:260D42AD mov eax, [ebp+var_4]\r\n.text:260D42B0 add eax, 2\r\n.text:260D42B3 cdq\r\n.text:260D42B4 mov ecx, 3\r\n.text:260D42B9 idiv ecx\r\n.text:260D42BB mov eax, [ebp+var_28]\r\n.text:260D42BE mov eax, [eax+edx*4] //i = (i + 2) % 3\r\n.text:260D42C1 xor edx, edx\r\n.text:260D42C3 mov ecx, 0Bh\r\n.text:260D42C8 div ecx\r\n.text:260D42CA test edx, edx //ci[i] % 11 要等于 0\r\n.text:260D42CC jz short loc_260D42D5\r\n.text:260D42CE xor eax, eax\r\n.text:260D42D0 jmp loc_260D43B5\r\n.text:260D42D5\r\n.text:260D42D5 loc_260D42D5: \r\n.text:260D42D5 jmp short loc_260D434C\r\n.text:260D42D7\r\n.text:260D42D7 loc_260D42D7: \r\n.text:260D42D7 mov eax, [ebp+var_4]\r\n.text:260D42DA add eax, 1\r\n.text:260D42DD cdq\r\n.text:260D42DE mov ecx, 3\r\n.text:260D42E3 idiv ecx\r\n.text:260D42E5 mov eax, [ebp+var_28]\r\n.text:260D42E8 mov eax, [eax+edx*4] //i = (i + 1) % 3 \r\n.text:260D42EB xor edx, edx\r\n.text:260D42ED mov ecx, 3\r\n.text:260D42F2 div ecx\r\n.text:260D42F4 test edx, edx //ci[i] % 3 要等于 0\r\n.text:260D42F6 jz short loc_260D42FF\r\n.text:260D42F8 xor eax, eax\r\n.text:260D42FA jmp loc_260D43B5\r\n.text:260D42FF\r\n.text:260D42FF loc_260D42FF: \r\n.text:260D42FF mov eax, [ebp+var_4]\r\n.text:260D4302 add eax, 2\r\n.text:260D4305 cdq\r\n.text:260D4306 mov ecx, 3\r\n.text:260D430B idiv ecx\r\n.text:260D430D mov eax, [ebp+var_28]\r\n.text:260D4310 mov eax, [eax+edx*4] //i = (i + 2) % 3\r\n.text:260D4313 xor edx, edx\r\n.text:260D4315 mov ecx, 3\r\n.text:260D431A div ecx\r\n.text:260D431C test edx, edx //ci[i] % 3 要等于 0\r\n.text:260D431E jz short loc_260D4327\r\n.text:260D4320 xor eax, eax\r\n.text:260D4322 jmp loc_260D43B5\r\n.text:260D4327\r\n.text:260D4327 loc_260D4327: \r\n.text:260D4327 mov eax, [ebp+var_4]\r\n.text:260D432A add eax, 2\r\n.text:260D432D cdq\r\n.text:260D432E mov ecx, 3\r\n.text:260D4333 idiv ecx\r\n.text:260D4335 mov eax, [ebp+var_28]\r\n.text:260D4338 mov eax, [eax+edx*4] //i = (i + 2) % 3\r\n.text:260D433B xor edx, edx\r\n.text:260D433D mov ecx, 0Bh\r\n.text:260D4342 div ecx\r\n.text:260D4344 test edx, edx //ci[i] % 11 要等于 0\r\n.text:260D4346 jz short loc_260D434C\r\n.text:260D4348 xor eax, eax\r\n.text:260D434A jmp short loc_260D43B5\r\n.text:260D434C\r\n.text:260D434C loc_260D434C: \r\n.text:260D434C \r\n.text:260D434C mov edx, [ebp+lParam]\r\n.text:260D434F mov [ebp+var_30], edx\r\n.text:260D4352 cmp [ebp+var_30], 60h\r\n.text:260D4356 jb short loc_260D4362\r\n.text:260D4358 cmp [ebp+var_30], 61h\r\n.text:260D435C jbe short loc_260D4360\r\n.text:260D435E jmp short loc_260D4362\r\n.text:260D4360\r\n.text:260D4360 loc_260D4360: \r\n.text:260D4360 jmp short loc_260D43B2\r\n.text:260D4362\r\n.text:260D4362 loc_260D4362: \r\n.text:260D4362 \r\n.text:260D4362 mov eax, [ebp+var_28]\r\n.text:260D4365 mov ecx, [eax]\r\n.text:260D4367 mov [ebp+var_10], ecx\r\n.text:260D436A mov edx, [ebp+var_28]\r\n.text:260D436D mov eax, [edx+4]\r\n.text:260D4370 mov [ebp+var_14], eax\r\n.text:260D4373 mov ecx, [ebp+var_10]\r\n.text:260D4376 cmp ecx, [ebp+var_14]\r\n.text:260D4379 jz short loc_260D43AE\r\n.text:260D437B mov edx, [ebp+var_28]\r\n.text:260D437E mov eax, [edx]\r\n.text:260D4380 mov [ebp+var_18], eax\r\n.text:260D4383 mov ecx, [ebp+var_28]\r\n.text:260D4386 mov edx, [ecx+8]\r\n.text:260D4389 mov [ebp+var_1C], edx\r\n.text:260D438C mov eax, [ebp+var_18]\r\n.text:260D438F cmp eax, [ebp+var_1C]\r\n.text:260D4392 jz short loc_260D43AE\r\n.text:260D4394 mov ecx, [ebp+var_28]\r\n.text:260D4397 mov edx, [ecx+4]\r\n.text:260D439A mov [ebp+var_20], edx\r\n.text:260D439D mov eax, [ebp+var_28]\r\n.text:260D43A0 mov ecx, [eax+8]\r\n.text:260D43A3 mov [ebp+var_24], ecx\r\n.text:260D43A6 mov edx, [ebp+var_20]\r\n.text:260D43A9 cmp edx, [ebp+var_24]\r\n.text:260D43AC jnz short loc_260D43B2\r\n.text:260D43AE\r\n.text:260D43AE loc_260D43AE: \r\n.text:260D43AE \r\n.text:260D43AE xor eax, eax\r\n.text:260D43B0 jmp short loc_260D43B5\r\n.text:260D43B2\r\n.text:260D43B2 loc_260D43B2: \r\n.text:260D43B2 \r\n.text:260D43B2 mov eax, [ebp+lParam]\r\n.text:260D43B5\r\n.text:260D43B5 loc_260D43B5: \r\n.text:260D43B5 \r\n.text:260D43B5 pop esi\r\n.text:260D43B6 pop ebx\r\n.text:260D43B7 mov esp, ebp\r\n.text:260D43B9 pop ebp\r\n.text:260D43BA retn 4\r\n.text:260D43BA sub_260D405D endp\r\n \r\n 先总结一下:\r\n 软件先把注册码查表转换成 unsigned int ci[3] 这个样子的一个数组。\r\n 我们先把这个数组看成是unsigned char ci[3][4]这样子,要求其中有且只有\r\n一组有重复字符。有重复字符那组的字符累加和要等于60h或者61h.\r\n 如果和为60h,则要求满足下面条件:\r\n 1. i = (i + 1) % 3 \r\n ci[i] % 3 要等于 0\r\n \r\n 2. i = (i + 2) % 3\r\n ci[i] % 3 要等于 0\r\n \r\n 3. i = (i + 1) % 3\r\n ci[i] % 5 要等于 0 \r\n \r\n 4. i = (i + 2) % 3\r\n ci[i] % 5 要等于 0 \r\n\r\n 5. i = (i + 2) % 3\r\n ci[i] % 11 要等于 0\r\n \r\n 如果和为61h,则要求满足下面条件:\r\n 1. i = (i + 1) % 3 \r\n ci[i] % 3 要等于 0\r\n \r\n 2. i = (i + 2) % 3\r\n ci[i] % 3 要等于 0\r\n \r\n 3. i = (i + 2) % 3\r\n ci[i] % 11 要等于 0\r\n \r\n 这样真的可以吗?如果你构造一组注册码,它会提示你是以前版本的。 \r\n 我在上面有两个要注意的地方,再复制下来:\r\n \r\n.text:26047041 mov eax, [ebp+var_C]\r\n.text:26047044 mov ecx, [eax+0F0h]\r\n.text:2604704A mov edx, [ecx] //这里是有重复字符那组的累加和\r\n.text:2604704C cmp edx, dword_261978BC //这个值是64h\r\n.text:26047052 jnz short loc_26047075\r\n.text:26047054 mov eax, [ebp+var_C]\r\n.text:26047057 xor ecx, ecx\r\n.text:26047059 mov cl, [eax+0F4h] //这里是有重复字符的那组的索引\r\n.text:2604705F and ecx, 2 //屏蔽低2位\r\n.text:26047062 test ecx, ecx\r\n.text:26047064 jz short loc_26047075 //不能为0。这说明只能第三组注册码里有重复\r\n\r\n 看到这里就明白了。有重复字符那组的累加和要等于64h,并且只能是第三组注册码。 \r\n 上面还有个CALL没有分析,在这个位置啦:\r\n \r\n.text:2604EC0E push ecx\r\n.text:2604EC0F call sub_2604E130 //这里先略过\r\n\r\n 这个我没有去分析,猜测应该是不同协议类型的验证。等有时间再分析了。\r\n 反正是老外的软件,最后给一组能用的注册码:CB5W-MK5S-JUUG\r\n 注册名用你自己的就可以了。 |
|