【破文标题】CRACKME算法分析
【破文作者】逍遥风[OCN][PYG]
【作者邮箱】tc-xb@163.com
【破解工具】OD PEID
【破解平台】WINXP
------------------------------------------------------------------------
1)PEID检查,Borland Delphi 3.0 无壳
2)根据错误提示,用OD的字符串查找,很容易来到如下代码处 在这里下断
00427B44 /. 55 PUSH EBP
00427B45 |. 8BEC MOV EBP,ESP
00427B47 |. 6A 00 PUSH 0
00427B49 |. 6A 00 PUSH 0
00427B4B |. 53 PUSH EBX
00427B4C |. 8BD8 MOV EBX,EAX
00427B4E |. 33C0 XOR EAX,EAX
00427B50 |. 55 PUSH EBP
00427B51 |. 68 FA7B4200 PUSH echap515.00427BFA
00427B56 |. 64:FF30 PUSH DWORD PTR FS:[EAX]
00427B59 |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
00427B5C |. 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4]
00427B5F |. 8B83 DC010000 MOV EAX,DWORD PTR DS:[EBX+1DC]
00427B65 |. E8 26E2FEFF CALL echap515.00415D90 ; 取注册名
00427B6A |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; EBP-4=注册名
00427B6D |. E8 3EBCFDFF CALL echap515.004037B0 ; 取注册名位数
00427B72 |. 48 DEC EAX ; 注册名位数减1
00427B73 |. 7C 30 JL SHORT echap515.00427BA5
00427B75 |. 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4]
00427B78 |. 8B83 EC010000 MOV EAX,DWORD PTR DS:[EBX+1EC]
00427B7E |. E8 0DE2FEFF CALL echap515.00415D90 ; 取假码位数
00427B83 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; EBP-4=假码
00427B86 |. 50 PUSH EAX
00427B87 |. 8D55 F8 LEA EDX,DWORD PTR SS:[EBP-8]
00427B8A |. 8B83 DC010000 MOV EAX,DWORD PTR DS:[EBX+1DC]
00427B90 |. E8 FBE1FEFF CALL echap515.00415D90 ; 取注册名位数
00427B95 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8] ; EBP-8=注册名
00427B98 |. 5A POP EDX
00427B99 |. E8 82FEFFFF CALL echap515.00427A20 ; 算法CALL。。。
00427B9E |. 3D 4E61BC00 CMP EAX,0BC614E
00427BA3 |. 7D 1E JGE SHORT echap515.00427BC3
00427BA5 |> 6A 00 PUSH 0
00427BA7 |. 68 087C4200 PUSH echap515.00427C08 ; error
00427BAC |. 68 107C4200 PUSH echap515.00427C10 ; wrong serial number !
00427BB1 |. A1 44974200 MOV EAX,DWORD PTR DS:[429744]
00427BB6 |. E8 411EFFFF CALL echap515.004199FC
00427BBB |. 50 PUSH EAX ; |hOwner
00427BBC |. E8 4FD9FDFF CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA
00427BC1 |. EB 1C JMP SHORT echap515.00427BDF
00427BC3 |> 6A 00 PUSH 0
00427BC5 |. 68 287C4200 PUSH echap515.00427C28 ; success
00427BCA |. 68 307C4200 PUSH echap515.00427C30 ; congratulation ! you've did it.\nmail us : ekhmail@egroups.com
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
进入算法CALL。。。
00427A20 /$ 55 PUSH EBP
00427A21 |. 8BEC MOV EBP,ESP
00427A23 |. 83C4 F0 ADD ESP,-10
00427A26 |. 53 PUSH EBX
00427A27 |. 56 PUSH ESI
00427A28 |. 33C9 XOR ECX,ECX
00427A2A |. 894D F0 MOV DWORD PTR SS:[EBP-10],ECX
00427A2D |. 894D F4 MOV DWORD PTR SS:[EBP-C],ECX
00427A30 |. 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX
00427A33 |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
00427A36 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00427A39 |. E8 26BFFDFF CALL echap515.00403964
00427A3E |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
00427A41 |. E8 1EBFFDFF CALL echap515.00403964
00427A46 |. 33C0 XOR EAX,EAX
00427A48 |. 55 PUSH EBP
00427A49 |. 68 2A7B4200 PUSH echap515.00427B2A
00427A4E |. 64:FF30 PUSH DWORD PTR FS:[EAX]
00427A51 |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
00427A54 |. 33DB XOR EBX,EBX
00427A56 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 注册名给EAX
00427A59 |. E8 52BDFDFF CALL echap515.004037B0 ; 取注册名位数
00427A5E |. 8BF0 MOV ESI,EAX ; EAX的值给ESI
00427A60 |. 85F6 TEST ESI,ESI
00427A62 |. 7E 3C JLE SHORT echap515.00427AA0
00427A64 |. B8 01000000 MOV EAX,1 ; 令EAX=1
00427A69 |> 8BD0 /MOV EDX,EAX ; 令EAX=EDX
00427A6B |. 8B4D FC |MOV ECX,DWORD PTR SS:[EBP-4] ; 注册名给ECX
00427A6E |. 0FB64C11 FF |MOVZX ECX,BYTE PTR DS:[ECX+EDX-1] ; 取注册名每一位的ASCII值
00427A73 |. 03D9 |ADD EBX,ECX ; 从注册名第2位开始,每一位的ASCII值与上一次运算的结果C相加
00427A75 |. 71 05 |JNO SHORT echap515.00427A7C ; 相加的结果设为A
00427A77 |. E8 B4AFFDFF |CALL echap515.00402A30
00427A7C |> C1E3 08 |SHL EBX,8 ; A乘以2的8次方后,得出一个结果B
00427A7F |. 8B0D 80884200 |MOV ECX,DWORD PTR DS:[428880] ; echap515.004279FC
00427A85 |. 0FB65411 FF |MOVZX EDX,BYTE PTR DS:[ECX+EDX-1] ; 查表,取每一位的HEX值
00427A8A |. 0BDA |OR EBX,EDX ; 结果B与表中对应位数的HEXI值进行OR运算
00427A8C |. 85DB |TEST EBX,EBX ; 得到一个结果C
00427A8E |. 7D 0C |JGE SHORT echap515.00427A9C
00427A90 |. 6BD3 FF |IMUL EDX,EBX,-1
00427A93 |. 71 05 |JNO SHORT echap515.00427A9A
00427A95 |. E8 96AFFDFF |CALL echap515.00402A30
00427A9A |> 8BDA |MOV EBX,EDX
00427A9C |> 40 |INC EAX ; 每计算一次EAX+1
00427A9D |. 4E |DEC ESI ; 每计算一次ESI-1
00427A9E |.^ 75 C9 \JNZ SHORT echap515.00427A69
00427AA0 |> 81F3 78563412 XOR EBX,12345678 ; 计算完毕得到的Cn与12345678进行XOR运算
00427AA6 |. 8D55 F0 LEA EDX,DWORD PTR SS:[EBP-10] ; 计算结果设为D
00427AA9 |. 8BC3 MOV EAX,EBX
00427AAB |. E8 44E9FDFF CALL echap515.004063F4 ; 将D转换成相应的十进制。
00427AB0 |. 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
00427AB3 |. E8 F8BCFDFF CALL echap515.004037B0 ; 取这个十进制数的位数
00427AB8 |. 8BF0 MOV ESI,EAX
00427ABA |. 85F6 TEST ESI,ESI
00427ABC |. 7E 38 JLE SHORT echap515.00427AF6 ; 循环计算开始,循环次数是上面哪个十进制数的位数
00427ABE |> 8BC3 /MOV EAX,EBX ; 使EAX=计算结果E(E1=D)
00427AC0 |. B9 0A000000 |MOV ECX,0A ; 使ECX=A
00427AC5 |. 99 |CDQ
00427AC6 |. F7F9 |IDIV ECX ; EAX/ECX,所得的商进EAX,余数进EDX
00427AC8 |. 6215 3C7B4200 |BOUND EDX,QWORD PTR DS:[427B3C]
00427ACE |. 8A92 84884200 |MOV DL,BYTE PTR DS:[EDX+428884] ; 根据余数,在表2中取对应位数后一位字符的HEX值
00427AD4 |. 8D45 F0 |LEA EAX,DWORD PTR SS:[EBP-10] ; 与上一不HEX的对应字符组成注册码
00427AD7 |. E8 FCBBFDFF |CALL echap515.004036D8
00427ADC |. 8B55 F0 |MOV EDX,DWORD PTR SS:[EBP-10]
00427ADF |. 8D45 F4 |LEA EAX,DWORD PTR SS:[EBP-C]
00427AE2 |. E8 D1BCFDFF |CALL echap515.004037B8
00427AE7 |. 8BC3 |MOV EAX,EBX ; 使EAX=计算结果D
00427AE9 |. B9 0A000000 |MOV ECX,0A ; 使ECX=A
00427AEE |. 99 |CDQ
00427AEF |. F7F9 |IDIV ECX ; EAX/ECX,所得的商进EAX,余数进EDX
00427AF1 |. 8BD8 |MOV EBX,EAX ; 所得的商给EBX,设为E
00427AF3 |. 4E |DEC ESI ; 每计算一次ESI-1
00427AF4 |.^ 75 C8 \JNZ SHORT echap515.00427ABE
省略一些代码。。。
00427B33 . 5E POP ESI
00427B34 . 5B POP EBX
00427B35 . 8BE5 MOV ESP,EBP
00427B37 . 5D POP EBP
00427B38 . C3 RETN
------------------------------------------------------------------------
算法总结:
算法中要用到两张固定的表,表1:LANNYDIBANDINGINANAKEKHYANGNGENTOT
表2:LANNY5646521
1)注册名每一位ASCII值加上上一次计算结果Cn,得到An,An乘以2的8次方得到Bn.
查表1取与注册名各位位数对应字符的HEX值(注册名第一位,就取表1中的第一位)
Bn与对应的HEX值进行OR运算,得到C(n+1) (注:C1=0)。
2)最终结果C(n+1)与12345678进行XOR运算。所得结果为D。
3)将D转换成对应的10进制数。并取这个十进制数的位数做为下次循环计算的循环次数
4)En除以0A(定值),在表2中取与余数对应位数的字符的后一位字符
(例:某次计算所得余数为2,就对应表2中的第3个字符),并将每一次得到的字符合并成注册码。
En除以0A(定值)的商作为E(n+1)。循环计算 注意:E1=D
例:注册名tc
1)74+0=74。74*100(16进制中2的8次方)=7400,7400(OR)4C=744C
63+744C=74AF。74AF*100=74AF00,74AF00(OR)41=74AF41
2)74AF41(XOR)12345678=1240F939
3)1240F939对应的十进制数=306247993,它有9位。
4)1240F939除以0A商为1D34C1F,余数为3,对应表2中第4位的字符N
1D34C1F 除以0A商为2EBACF,余数为9,对应表中第10位字符5
2EBACF除以0A商为。。。。。。依次类推。
注册名:tc
注册码:N554YN6LN
------------------------------------------------------------------------
【版权声明】请保持文章完整性
[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!