【破文标题】CRACKME分析
【破文作者】逍遥风
【破解工具】OD PEID
【破解平台】winXP
【原版下载】ea6K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3y4J5j5h3y4C8L8h3g2K6i4K6u0W2k6r3f1`.
【破解声明】算法练习,简单的循环计算(4adK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3y4J5j5h3y4C8L8h3g2K6i4K6u0W2k6r3g2Q4c8e0N6Q4z5f1y4Q4z5f1k6Q4c8e0k6Q4z5e0S2Q4b7f1k6Q4c8e0c8Q4b7U0S2Q4b7f1q4Q4c8e0g2Q4b7e0g2Q4b7V1c8Q4c8e0g2Q4z5f1y4Q4b7U0m8Q4c8e0k6Q4z5e0k6Q4b7U0W2Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0g2Q4z5e0q4Q4b7U0g2Q4c8e0g2Q4z5e0q4Q4b7U0g2Q4c8f1k6Q4b7V1y4Q4z5o6q4Q4c8f1k6Q4b7V1y4Q4z5o6V1`.
----------------------------------------------------------------------
1)PEID检查。ASPack 2.11 -> Alexey Solodovnikov。简单的壳,轻松脱掉。再检查发现是用Delphi写的
2)用字符串查找很容易找到关键处。
3)根据提示来到以下代码处。
算法开始:
00458159 |. 55 push ebp ; 在这里下断
0045815A |. 68 90824500 push 00458290
0045815F |. 64:FF30 push dword ptr fs:[eax]
00458162 |. 64:8920 mov fs:[eax], esp
00458165 |. 8D55 F8 lea edx, [ebp-8]
00458168 |. 8B45 FC mov eax, [ebp-4]
0045816B |. 8B80 D8020000 mov eax, [eax+2D8]
00458171 |. E8 16BFFCFF call 0042408C ; 取注册名
00458176 |. 8D55 EC lea edx, [ebp-14]
00458179 |. 8B45 FC mov eax, [ebp-4]
0045817C |. 8B80 D8020000 mov eax, [eax+2D8]
00458182 |. E8 05BFFCFF call 0042408C ; 取注册名位数
00458187 |. 837D EC 00 cmp dword ptr [ebp-14], >; 注册名位数与0比较(输入注册名了吗?)
0045818B |. 75 0A jnz short 00458197 ; 没有输入注册名就出现提示
0045818D |. B8 A8824500 mov eax, 004582A8 ; enter you name, pls.
00458192 |. E8 4DC1FEFF call 004442E4
00458197 |> 8D55 E8 lea edx, [ebp-18]
0045819A |. 8B45 FC mov eax, [ebp-4]
0045819D |. 8B80 DC020000 mov eax, [eax+2DC]
004581A3 |. E8 E4BEFCFF call 0042408C ; 取输入的注册码位数
004581A8 |. 837D E8 00 cmp dword ptr [ebp-18], >; 输入注册码了吗?
004581AC |. 75 0A jnz short 004581B8 ; 没有输入注册码就出现提示
004581AE |. B8 C8824500 mov eax, 004582C8 ; enter the serial, pls.
004581B3 |. E8 2CC1FEFF call 004442E4
004581B8 |> 8B45 F8 mov eax, [ebp-8]
004581BB |. E8 BCB9FAFF call 00403B7C ; 取注册名位数
004581C0 |. 8BF8 mov edi, eax ; 注册名位数放进EDI,作为循环计算的次数
004581C2 |. 85FF test edi, edi
004581C4 |. 7E 50 jle short 00458216
004581C6 |. BB 01000000 mov ebx, 1 ; 使EBX=1
004581CB |> 8B45 F8 /mov eax, [ebp-8] ; 取出注册名
004581CE |. 0FB67418 FF |movzx esi, byte ptr [eax+>; 取注册名每一位的ASCII值
004581D3 |. 8BC6 |mov eax, esi ; EAX=注册名每一位的ASCII值
004581D5 |. B9 06000000 |mov ecx, 6 ; 使ECX=6
004581DA |. 33D2 |xor edx, edx ; EDX清零
004581DC |. F7F1 |div ecx ; EAX中的值除以ECX中的值(注册名每一位的ASCII码除以0x6,A1)
004581DE |. 8B55 F8 |mov edx, [ebp-8] ; 取出注册名
004581E1 |. 8BD6 |mov edx, esi ; EAX=注册名每一位的ASCII值
004581E3 |. C1EA 02 |shr edx, 2 ; EDX中的值除以2的平方(注册名每一位的ASCII码除以2的平方,A2)
004581E6 |. F7EA |imul edx ; EAX=EAX*EDX
004581E8 |. 50 |push eax ; 把所得的积储存(把积设为A)
004581E9 |. 8B45 F8 |mov eax, [ebp-8] ; 取出注册名
004581EC |. 8BC6 |mov eax, esi ; EAX=注册名每一位的ASCII值
004581EE |. B9 0A000000 |mov ecx, 0A ; 使ECX=0xA
004581F3 |. 33D2 |xor edx, edx ; EDX清零
004581F5 |. F7F1 |div ecx ; EAX中的值除以ECX中的值(注册名每一位的ASCII值除以0xA)。结果设为B
004581F7 |. 5A |pop edx ; 取出A
004581F8 |. 92 |xchg eax, edx
004581F9 |. 8BCA |mov ecx, edx ; 使ECX=EDX
004581FB |. 33D2 |xor edx, edx ; EDX清零
004581FD |. F7F1 |div ecx ; EAX/ECX(用A除以B)
004581FF |. 8D55 E4 |lea edx, [ebp-1C]
00458202 |. E8 FDF8FAFF |call 00407B04 ; A除以B所得的商转换成对应的十进制数
00458207 |. 8B55 E4 |mov edx, [ebp-1C] ; 结果放进EDX中
0045820A |. 8D45 F4 |lea eax, [ebp-C]
0045820D |. E8 72B9FAFF |call 00403B84 ; 合并每次计算的结果组成一个字符串设为C
00458212 |. 43 |inc ebx ; 每计算一次EBX+1
00458213 |. 4F |dec edi ; 每计算一次EDI-1
00458214 |.^ 75 B5 \jnz short 004581CB ; 循环计算
00458216 |> 68 E8824500 push 004582E8 ; adcm4-(固定字符串1)
0045821B |. FF75 F4 push dword ptr [ebp-C]
0045821E |. 68 F8824500 push 004582F8 ; -yeah!(固定字符串2)
00458223 |. 8D45 F0 lea eax, [ebp-10]
00458226 |. BA 03000000 mov edx, 3
0045822B |. E8 0CBAFAFF call 00403C3C ; 将计算结果C与固定字符串合并,字符串1-C-字符串2
00458230 |. 8D55 E0 lea edx, [ebp-20]
00458233 |. 8B45 FC mov eax, [ebp-4]
00458236 |. 8B80 DC020000 mov eax, [eax+2DC]
0045823C |. E8 4BBEFCFF call 0042408C ; 取输入的注册码
00458241 |. 8B55 E0 mov edx, [ebp-20] ; EDX=输入的注册码
00458244 |. 8B45 F0 mov eax, [ebp-10] ; EAX=正确的注册码
00458247 |. E8 40BAFAFF call 00403C8C ; 注册码比较CALL
0045824C |. 75 0A jnz short 00458258 ; 不相等就跳向失败
0045824E |. B8 08834500 mov eax, 00458308 ; well done cracker, you did it!
算法结束
----------------------------------------------------------------------
算法总结:
1)用注册名每一位的ASCII值除以0x6。得到结果设为A1
2)用注册名每一位的ASCII值除以2的平方。得到的结果设为A2
3)设A=(A1)*(A2)
4)用注册名每一位的ASCII值除以0xA。得到结果设为B
5)将A除以B所得的商转换成对应的十进制数。设为Cn (n为循环次数)
6)如上循环计算,注册名位数为循环次数。并把每次计算结果C1。。。Cn合并得到C
7)把C与两个固定字符串合并,形如:固定字符串1-C-固定字符串2
例
注册名:lovetc
注册码:ADCM4-484450405042-YEAH!
----------------------------------------------------------------------
【版权声明】本文只为交流,转载请保留作者及文章完整性。
[培训]科锐逆向工程师培训第53期2025年7月8日开班!
上传的附件: