能力值:
( LV2,RANK:10 )
|
-
-
2 楼
1)PEID检查:Borland Delphi 2.0,无壳
2)试运行程序,任意输入注册信息后。有错误提示。
3)OD载入程序,用超级字符串查找,找到错误的信息。
超级字串参考+ , 条目 73
地址=0042509A
反汇编=MOV EDX,CrackMe.00425138
文本字串=that isn't it, keep on trying... 来到0042509A后,向上找到计算过程开始的地方。下断。
4)OD重新载入程序,任意输入注册信息后,程序被中断。
00425050 |. 55 PUSH EBP
00425051 |. 68 11514200 PUSH CrackMe.00425111
00425056 |. 64:FF30 PUSH DWORD PTR FS:[EAX]
00425059 |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
0042505C |. 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4]
0042505F |. 8B83 B8010000 MOV EAX,DWORD PTR DS:[EBX+1B8]
00425065 |. E8 96C9FEFF CALL CrackMe.00411A00 ; 取注册名位数
0042506A |. 8D55 F4 LEA EDX,DWORD PTR SS:[EBP-C]
0042506D |. 8B83 BC010000 MOV EAX,DWORD PTR DS:[EBX+1BC]
00425073 |. E8 88C9FEFF CALL CrackMe.00411A00 ; 取假码位数
00425078 |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] ; EBP-C=假码
0042507B |. 8D55 F8 LEA EDX,DWORD PTR SS:[EBP-8]
0042507E |. E8 71D7FDFF CALL CrackMe.004027F4 ; 计算假码的CALL,跟进
00425083 |. 8BF0 MOV ESI,EAX
00425085 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00425088 |. E8 13010000 CALL CrackMe.004251A0 ; 计算注册名的CALL,跟进
0042508D |. 8BF8 MOV EDI,EAX
0042508F |. 3BFE CMP EDI,ESI 注册码的计算结果与注册名的计算结果相比
00425091 |. 74 18 JE SHORT CrackMe.004250AB 两者相等就跳向成功
00425093 |. 6A 00 PUSH 0
00425095 |. B9 20514200 MOV ECX,CrackMe.00425120 ; cyt0m!c's crackme #1
0042509A |. BA 38514200 MOV EDX,CrackMe.00425138 ; that isn't it, keep on trying...
0042509F |. A1 28764200 MOV EAX,DWORD PTR DS:[427628]
004250A4 |. E8 23CAFFFF CALL CrackMe.00421ACC
004250A9 |. EB 16 JMP SHORT CrackMe.004250C1
004250AB |> 6A 00 PUSH 0
004250AD |. B9 20514200 MOV ECX,CrackMe.00425120 ; cyt0m!c's crackme #1
004250B2 |. BA 5C514200 MOV EDX,CrackMe.0042515C ; hey, you have done it
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
来到对输入的注册码进行计算的CALL。。。
004027F4 /$ 53 PUSH EBX
004027F5 |. 56 PUSH ESI
004027F6 |. 57 PUSH EDI
004027F7 |. 89C6 MOV ESI,EAX
004027F9 |. 50 PUSH EAX
004027FA |. 85C0 TEST EAX,EAX
004027FC |. 74 51 JE SHORT CrackMe.0040284F
004027FE >|. 31C0 XOR EAX,EAX ; EAX清零
00402800 |. 31DB XOR EBX,EBX ; EBX清零
00402802 |. BF CCCCCC0C MOV EDI,0CCCCCCC ; 给EDI赋值
00402807 |> 8A1E /MOV BL,BYTE PTR DS:[ESI] ; 取假码第一位的HEX值
00402809 |. 46 |INC ESI
0040280A |. 80FB 20 |CMP BL,20
0040280D |.^ 74 F8 \JE SHORT CrackMe.00402807
0040280F |. B5 00 MOV CH,0
00402811 |. 80FB 2D CMP BL,2D
00402814 |. 74 45 JE SHORT CrackMe.0040285B
00402816 |. 80FB 2B CMP BL,2B
00402819 |. 74 42 JE SHORT CrackMe.0040285D
0040281B |. 80FB 24 CMP BL,24
0040281E |. 74 42 JE SHORT CrackMe.00402862
00402820 |> 84DB TEST BL,BL
00402822 |. 74 32 JE SHORT CrackMe.00402856 ; 以上代码检验假码的第一位是否是符号
00402824 |> 80EB 30 /SUB BL,30 ; 假码的HEX值减30
00402827 |. 80FB 09 |CMP BL,9
0040282A |. 77 2A |JA SHORT CrackMe.00402856
0040282C |. 39F8 |CMP EAX,EDI
0040282E |. 77 26 |JA SHORT CrackMe.00402856
00402830 |. 8D0480 |LEA EAX,DWORD PTR DS:[EAX+EAX*4] ; EAX=EAX+EAX*4
00402833 |. 01C0 |ADD EAX,EAX ; EAX=EAX+EAX
00402835 |. 01D8 |ADD EAX,EBX ; EAX=EAX+EBX
00402837 |. 8A1E |MOV BL,BYTE PTR DS:[ESI] ; 取假码下一位的HEX值
00402839 |. 46 |INC ESI ; ESI+1
0040283A |. 84DB |TEST BL,BL
0040283C |.^ 75 E6 \JNZ SHORT CrackMe.00402824
0040283E |. FECD DEC CH
00402840 |. 74 10 JE SHORT CrackMe.00402852
00402842 |. 85C0 TEST EAX,EAX
00402844 |. 7C 10 JL SHORT CrackMe.00402856
00402846 |> 59 POP ECX
00402847 |. 31F6 XOR ESI,ESI
00402849 |> 8932 MOV DWORD PTR DS:[EDX],ESI
0040284B |. 5F POP EDI
0040284C |. 5E POP ESI
0040284D |. 5B POP EBX
0040284E |. C3 RETN 计算完毕就返回
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
来到对输入的注册名进行计算的CALL。。。
004251A0 /$ 53 PUSH EBX
004251A1 |. 89C3 MOV EBX,EAX ; EAX=EBX=输入的注册名
004251A3 |. 83FB 00 CMP EBX,0 ; 输入注册名了吗,没有输入就跳走
004251A6 |. 74 13 JE SHORT CrackMe.004251BB
004251A8 |. B8 01000000 MOV EAX,1 ; 使EAX=1
004251AD |. 31C9 XOR ECX,ECX ; ECX清零
004251AF |> 8A0B /MOV CL,BYTE PTR DS:[EBX] ; 取注册名每一位的HEX值,放进ECX
004251B1 |. 80F9 00 |CMP CL,0
004251B4 |. 74 05 |JE SHORT CrackMe.004251BB ; 计算完了吗,计算完毕就跳走
004251B6 |. F7E1 |MUL ECX ; EAX=EAX*EAC
004251B8 |. 43 |INC EBX ; 每计算一次EBX+1
004251B9 |.^ EB F4 \JMP SHORT CrackMe.004251AF
004251BB |> 25 FFFFFF0F AND EAX,0FFFFFFF
004251C0 |. 5B POP EBX
004251C1 \. C3 RETN ; 输出结果,并返回
-----------------------------------------------------------------------BY 逍遥风
算法总结:
程序采用的是F`(注册名)=F'(注册码)的方式,对注册码进行验证的
1)对注册码的算法是:
注册码第一位的HEX值减去30,设为A1。最终的计算结果设为B(n+1)
则 B(n+1)=An +2*(Bn+4*Bn) 其中B1=0,n=输入的注册码的位数
输出结果B(n+1)。即就是把输入的注册码转换成相应的十六进制数。
2)对注册名的算法是:
取注册名每一位的HEX值相乘。
输出结果Cn
3)比较B(n+1)与Cn
找出一对符合以上算法的数字:
注册名:tcxb
注册码:135051840
【版权声明】本文只为交流,转载请保留作者及文章完整性[转载自看雪论坛]
地址:http://bbs.pediy.com/showthread.php?threadid=21407
这里第2个call
00425088 |. E8 13010000 CALL CrackMe.004251A0 ; 计算注册名的CALL,跟进
004251BB |> 25 FFFFFF0F AND EAX,0FFFFFFF
004251C0 |. 5B POP EBX
004251C1 \. C3 RETN ; 输出结果,并返回
出栈之后,EAX中的转换为10进制就是注册码了,不明白上面分析的一堆是做什么的?
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
哪位兄弟可以指点一下?不是都等逍遥老大解释呢吧?汗,求教~
|
能力值:
( LV12,RANK:530 )
|
-
-
4 楼
00404E53 FF15 1C104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaHresu>; MSVBVM60.__vbaHresultCheckObj
00404E59 8B45 94 MOV EAX,DWORD PTR SS:[EBP-6C] ; 取注册名
00404E5C 50 PUSH EAX
00404E5D FF15 AC104000 CALL DWORD PTR DS:[<&MSVBVM60.#581>] ; MSVBVM60.rtcR8ValFromBstr/////////////(字符串转数字)
00404E63 8B35 08104000 MOV ESI,DWORD PTR DS:[<&MSVBVM60.__vbaVa>; MSVBVM60.__vbaVarMove (变量赋值)
00404E69 8D95 40FFFFFF LEA EDX,DWORD PTR SS:[EBP-C0]
00404E6F DD9D 48FFFFFF FSTP QWORD PTR SS:[EBP-B8]
00404E75 8D4D DC LEA ECX,DWORD PTR SS:[EBP-24]
00404E78 C785 40FFFFFF 0>MOV DWORD PTR SS:[EBP-C0],5
00404E82 FFD6 CALL ESI
00404E84 8D4D 94 LEA ECX,DWORD PTR SS:[EBP-6C]
00404E87 FF15 A4104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeS>; MSVBVM60.__vbaFreeStr
00404E8D 8D4D 90 LEA ECX,DWORD PTR SS:[EBP-70]
00404E90 FF15 A8104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeO>; MSVBVM60.__vbaFreeObj
00404E96 8D4D DC LEA ECX,DWORD PTR SS:[EBP-24]
00404E99 8D55 DC LEA EDX,DWORD PTR SS:[EBP-24]
00404E9C 51 PUSH ECX
00404E9D 8D45 80 LEA EAX,DWORD PTR SS:[EBP-80]
00404EA0 52 PUSH EDX
00404EA1 50 PUSH EAX
00404EA2 FF15 88104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarAd>; MSVBVM60.__vbaVarAdd(变量相加)/////////////用户名+用户名就是用户名*2
00404EA8 8BD0 MOV EDX,EAX 相加的结果在EAX中返回
00404EAA 8D4D CC LEA ECX,DWORD PTR SS:[EBP-34]
00404EAD FFD6 CALL ESI
00404EAF 8D4D CC LEA ECX,DWORD PTR SS:[EBP-34]
00404EB2 8D95 40FFFFFF LEA EDX,DWORD PTR SS:[EBP-C0]
00404EB8 51 PUSH ECX
00404EB9 8D45 80 LEA EAX,DWORD PTR SS:[EBP-80]
00404EBC 52 PUSH EDX
00404EBD 50 PUSH EAX
00404EBE C785 48FFFFFF 9>MOV DWORD PTR SS:[EBP-B8],15E0E9C ; 取定值15E0E9C,放进EBP-B8
00404EC8 C785 40FFFFFF 0>MOV DWORD PTR SS:[EBP-C0],3
00404ED2 FF15 88104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarAd>; MSVBVM60.__vbaVarAdd(变量相加)/////////////看上面的15E0E9C,就是加进去了.
00404ED8 8BD0 MOV EDX,EAX 相加的结果在EAX中返回
00404EDA 8D4D BC LEA ECX,DWORD PTR SS:[EBP-44]
00404EDD FFD6 CALL ESI
00404EDF 8D4D BC LEA ECX,DWORD PTR SS:[EBP-44]
00404EE2 8D95 40FFFFFF LEA EDX,DWORD PTR SS:[EBP-C0]
00404EE8 51 PUSH ECX
00404EE9 8D45 80 LEA EAX,DWORD PTR SS:[EBP-80]
00404EEC 52 PUSH EDX
00404EED 50 PUSH EAX
00404EEE C785 48FFFFFF 0>MOV DWORD PTR SS:[EBP-B8],4 ; 取定值4,放进EBP-B8
00404EF8 C785 40FFFFFF 0>MOV DWORD PTR SS:[EBP-C0],2
00404F02 FF15 58104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarMu>; MSVBVM60.__vbaVarMul(变量相乘)/////////////看上面取4乘进去了
00404F08 8BD0 MOV EDX,EAX 结果在EAX中返回
00404F0A 8D4D A8 LEA ECX,DWORD PTR SS:[EBP-58]
00404F0D FFD6 CALL ESI
00404F0F 8D4D BC LEA ECX,DWORD PTR SS:[EBP-44]
00404F12 8D55 A8 LEA EDX,DWORD PTR SS:[EBP-58]
00404F15 51 PUSH ECX
00404F16 8D45 80 LEA EAX,DWORD PTR SS:[EBP-80]
00404F19 52 PUSH EDX
00404F1A 50 PUSH EAX
00404F1B FF15 88104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarAd>; MSVBVM60.__vbaVarAdd(变量相加)////////这里就是加了*4后的和自己
00404F21 8BD0 MOV EDX,EAX 结果在EAX中返回
00404F23 8D4D 98 LEA ECX,DWORD PTR SS:[EBP-68]
00404F26 FFD6 CALL ESI
00404F28 8B0F MOV ECX,DWORD PTR DS:[EDI]
00404F2A 57 PUSH EDI
00404F2B FF91 0C030000 CALL DWORD PTR DS:[ECX+30C]
00404F31 8D55 90 LEA EDX,DWORD PTR SS:[EBP-70]
00404F34 50 PUSH EAX
00404F35 52 PUSH EDX
00404F36 FF15 24104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaObjSe>; MSVBVM60.__vbaObjSet
00404F3C 8BF0 MOV ESI,EAX
00404F3E 8D4D 94 LEA ECX,DWORD PTR SS:[EBP-6C]
00404F41 51 PUSH ECX
00404F42 56 PUSH ESI
00404F43 8B06 MOV EAX,DWORD PTR DS:[ESI]
00404F45 FF90 A0000000 CALL DWORD PTR DS:[EAX+A0]
00404F4B 3BC3 CMP EAX,EBX
00404F4D DBE2 FCLEX
00404F4F 7D 12 JGE SHORT Crackme_.00404F63
00404F51 68 A0000000 PUSH 0A0
00404F56 68 F8444000 PUSH Crackme_.004044F8
00404F5B 56 PUSH ESI
00404F5C 50 PUSH EAX
00404F5D FF15 1C104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaHresu>; MSVBVM60.__vbaHresultCheckObj
00404F63 8B55 94 MOV EDX,DWORD PTR SS:[EBP-6C]
00404F66 8D4D B8 LEA ECX,DWORD PTR SS:[EBP-48]
00404F69 895D 94 MOV DWORD PTR SS:[EBP-6C],EBX
00404F6C FF15 94104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrMo>; MSVBVM60.__vbaStrMove(变量赋值)
00404F72 8D4D 90 LEA ECX,DWORD PTR SS:[EBP-70]
00404F75 FF15 A8104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeO>; MSVBVM60.__vbaFreeObj
00404F7B 8B55 B8 MOV EDX,DWORD PTR SS:[EBP-48]
00404F7E 8D45 98 LEA EAX,DWORD PTR SS:[EBP-68]
00404F81 8D8D 40FFFFFF LEA ECX,DWORD PTR SS:[EBP-C0]
00404F87 50 PUSH EAX
00404F88 51 PUSH ECX
00404F89 8995 48FFFFFF MOV DWORD PTR SS:[EBP-B8],EDX
00404F8F C785 40FFFFFF 0>MOV DWORD PTR SS:[EBP-C0],8008
00404F99 FF15 44104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarTs>; MSVBVM60.__vbaVarTstEq(变量相比较)
/////////////////////////////////////////////////////////////////////////
明白没 ??
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
感谢大侠的帮助,还有这篇
THrawN的CRACKME8算法简单分析
http://bbs.pediy.com/showthread.php?s=&threadid=21470
感激ING!!!!
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
00404E5D FF15 AC104000 CALL DWORD PTR DS:[<&MSVBVM60.#581>] ; MSVBVM60.rtcR8ValFromBstr/////////////(字符串转数字)
这个函数怎么用的?比如我输入的名字是ABC,怎么转换成数字?
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
顺便再问一句,那些运算函数前的数值是如何知道的?
比如
00404E9C 51 PUSH ECX (这里?)
00404E9D 8D45 80 LEA EAX,DWORD PTR SS:[EBP-80]
00404EA0 52 PUSH EDX (这里?)
00404EA1 50 PUSH EAX
00404EA2 FF15 88104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarAd>; MSVBVM60.__vbaVarAdd(变量相加)/////////////用户名+用户名就是用户名*2
00404EA8 8BD0 MOV EDX,EAX 相加的结果在EAX中返回
怎么查看的啊?
还有这里
00404F15 51 PUSH ECX
00404F16 8D45 80 LEA EAX,DWORD PTR SS:[EBP-80]
00404F19 52 PUSH EDX
00404F1A 50 PUSH EAX
00404F1B FF15 88104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarAd>; MSVBVM60.__vbaVarAdd(变量相加)////////这里就是加了*4后的和自己
00404F21 8BD0 MOV EDX,EAX 结果在EAX中返回
是观察什么知道的,如何操作呢?谢谢大侠指点!感激!
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
基础题您到是给个答复啊,风凉话大家都会说,VB程序按说在数据窗口中跟随,或者查看他真正地址的数值,但是这个程序我怎么看不到?
|
能力值:
( LV12,RANK:530 )
|
-
-
10 楼
VB程序要指针再指针的.
上次看过一片文章讲VB数据结构,不错,你搜索看就知道VB怎么存变量了
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
感激4nil大侠的多次指教,也求一下所提到的VB数据结构,我在看雪没有搜到。。。
|
能力值:
( LV12,RANK:530 )
|
-
-
12 楼
看看这个把,被我从电脑深处挖出来了,不过不知道哪里来的,实在记不得谁写的了,真对不起这为高人了.
|
能力值:
( LV12,RANK:210 )
|
-
-
14 楼
关于vb变量的内存结构, 有本书叫 高级vb编程, 白色封面的,
说的非常清晰
|