【破文标题】CRACKME分析
【破文作者】逍遥风
【破解工具】OD,PEID
【破解平台】WINXP
【破解声明】简单的算法练习
----------------------------------------------------------------------
1)PEID检查,Borland Delphi 4.0 - 5.0,无壳
2)发现用字符串查找找不到什么有用的信息。但用RUN跟踪很容易找到关键点。RUN跟踪可以找到很多关键点,随便找一个就好了。寻找过程不在多说,CC兄的OD教程
里说的很清楚了
3)找到关键点,来到这里
0044645A |. 8D95 F0FDFFFF LEA EDX,DWORD PTR SS:[EBP-210] ; 就在这里下断
00446460 |. 8B83 D8020000 MOV EAX,DWORD PTR DS:[EBX+2D8]
00446466 |. E8 C1D3FDFF CALL 26.0042382C ; 取注册名的位数
0044646B |. 83BD F0FDFFFF>CMP DWORD PTR SS:[EBP-210],0 ; 输入注册名了吗?
00446472 |. 0F84 51020000 JE 26.004466C9 ; 没有注册名就跳向失败
00446478 |. 8D95 ECFDFFFF LEA EDX,DWORD PTR SS:[EBP-214]
0044647E |. 8B83 DC020000 MOV EAX,DWORD PTR DS:[EBX+2DC]
00446484 |. E8 A3D3FDFF CALL 26.0042382C ; 取输入的假码的位数
00446489 |. 83BD ECFDFFFF>CMP DWORD PTR SS:[EBP-214],0 ; 输入注册码了吗?
00446490 |. 0F84 33020000 JE 26.004466C9 ; 没有输入注册码就跳向失败
---------------------先是对注册信息进行初步检测
00446496 |. FF75 C4 PUSH DWORD PTR SS:[EBP-3C] ; 注册信息输入完整,就来到这里
00446499 |. FF75 F8 PUSH DWORD PTR SS:[EBP-8]
0044649C |. FF75 F4 PUSH DWORD PTR SS:[EBP-C]
---------------------以下都是些对寄存器的操作,省略些代码
来到算法部分。。。
00446545 |. BA 0A000000 MOV EDX,0A ; 使EDX=0A
0044654A |. E8 C1D6FBFF CALL 26.00403C10
0044654F |. 8B95 E0FDFFFF MOV EDX,DWORD PTR SS:[EBP-220]
00446555 |. 8D85 F4FDFFFF LEA EAX,DWORD PTR SS:[EBP-20C]
0044655B |. E8 3EEFFBFF CALL 26.0040549E
00446560 |. 8D85 F4FDFFFF LEA EAX,DWORD PTR SS:[EBP-20C]
00446566 |. E8 24F1FBFF CALL 26.0040568F
0044656B |. E8 34C2FBFF CALL 26.004027A4
00446570 |. 33C0 XOR EAX,EAX ; EAX清零
00446572 |. A3 30884400 MOV DWORD PTR DS:[448830],EAX ; 为计算结果的储存赋一个地址
00446577 |. EB 1B JMP SHORT 26.00446594 ; 开始计算
00446579 |> 8D85 F4FDFFFF /LEA EAX,DWORD PTR SS:[EBP-20C] ; 注册名的每一位取完但计算仍未结束。
0044657F |. E8 5CF0FBFF |CALL 26.004055E0 ; 依次取0xD,0xA
00446584 |. E8 1BC2FBFF |CALL 26.004027A4 ; 取注册名每一位的ASCII值
00446589 |. 25 FF000000 |AND EAX,0FF ; 去掉高位
0044658E |. 0105 30884400 |ADD DWORD PTR DS:[448830],EAX ; 注册名的ASCII值累加
00446594 |> 8D85 F4FDFFFF LEA EAX,DWORD PTR SS:[EBP-20C]
0044659A |. E8 DDEFFBFF |CALL 26.0040557C
0044659F |. E8 00C2FBFF |CALL 26.004027A4
004465A4 |. 84C0 |TEST AL,AL ; 计算完了吗?
004465A6 |.^ 74 D1 \JE SHORT 26.00446579 ; 没有就继续
注意当注册名计算完后循环并没有结束,无论注册名如何,都会在最后取 0xD和0xA再计算
所以: 这个循环是把注册名的ASCII值进行累加,累加后的结果再依次加上 0xD,0xA
把循环累加的结果设为A
继续计算。。。。。。
004465AE |. E8 8DEFFBFF CALL 26.00405540
004465B3 |. E8 ECC1FBFF CALL 26.004027A4
004465B8 |. 8D85 F4FDFFFF LEA EAX,DWORD PTR SS:[EBP-20C]
004465BE |. E8 EDEFFBFF CALL 26.004055B0
004465C3 |. E8 DCC1FBFF CALL 26.004027A4
004465C8 |. 33C0 XOR EAX,EAX
省略一些代码。。。
004465E4 |. A1 30884400 MOV EAX,DWORD PTR DS:[448830]
004465E9 |. 05 46020000 ADD EAX,246 ; 第一步计算结果A加上246
004465EE |. A3 34884400 MOV DWORD PTR DS:[448834],EAX ; 储存结果
004465F3 |. A1 34884400 MOV EAX,DWORD PTR DS:[448834]
004465F8 |. D1F8 SAR EAX,1 ; 结果除以2的一次方
------------------------------------------------------这一步可以总结为(A+0x246)/2。结果设为B
004465FA |. /79 03 JNS SHORT 26.004465FF
004465FC |. |83D0 00 ADC EAX,0
004465FF |> \A3 38884400 MOV DWORD PTR DS:[448838],EAX
00446604 |. A1 38884400 MOV EAX,DWORD PTR DS:[448838]
00446609 |. F72D 38884400 IMUL DWORD PTR DS:[448838] ; B*B(求B的平方)
0044660F |. A3 3C884400 MOV DWORD PTR DS:[44883C],EAX
00446614 |. A1 3C884400 MOV EAX,DWORD PTR DS:[44883C]
00446619 |. 2D 5B1E0000 SUB EAX,1E5B ; 平方的结果减去1E5B
0044661E |. A3 40884400 MOV DWORD PTR DS:[448840],EAX
------------------------------------------------------这一步可以总结为B*B-0x1E5B。结果设为C,
00446623 |. 8D95 DCFDFFFF LEA EDX,DWORD PTR SS:[EBP-224]
00446629 |. 8B83 DC020000 MOV EAX,DWORD PTR DS:[EBX+2DC]
0044662F |. E8 F8D1FDFF CALL 26.0042382C ; 取注册码
00446634 |. 8B85 DCFDFFFF MOV EAX,DWORD PTR SS:[EBP-224] ; 假码放进EAX
0044663A |. E8 2DFCFFFF CALL 26.0044626C
0044663F |. 3C 01 CMP AL,1
00446641 |. 0F85 82000000 JNZ 26.004466C9
00446647 |. 8D95 D8FDFFFF LEA EDX,DWORD PTR SS:[EBP-228]
0044664D |. 8B83 DC020000 MOV EAX,DWORD PTR DS:[EBX+2DC]
00446653 |. E8 D4D1FDFF CALL 26.0042382C ; 取假码的位数
00446658 |. 8B85 D8FDFFFF MOV EAX,DWORD PTR SS:[EBP-228]
0044665E |. E8 B115FCFF CALL 26.00407C14 ; 将假码转换成对应的16进制数
00446663 |. 3B05 40884400 CMP EAX,DWORD PTR DS:[448840] ; 真假注册码比较
00446669 |. 75 5E JNZ SHORT 26.004466C9 ; 不相等就跳向失败 整个过程到此结束
----------------------------------------------------------------------
算法总结:
1)注册名的ASCII值循环相加,所得的和依次加上0xD,0xA。结果设为A
2)A加上定值246,在除以2的一次方。可以归纳为(A+0x246)/2。结果设为B
3)将B进行乘方运算,所得的积减去定值1E5B,可以归纳为B*B-0x1E5B。结果设为C
4)C转换成对应的十进制数就是要输入的注册码。
一组注册信息:
name:lovetc
Serial:387870
----------------------------------------------------------------------
【版权声明】本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
上传的附件: