首页
社区
课程
招聘
用MASM32 写的CRACKME的算法分析(适合新手)[讨论]
发表于: 2006-2-7 17:30 6654

用MASM32 写的CRACKME的算法分析(适合新手)[讨论]

2006-2-7 17:30
6654

1)PEID检查。MASM32 / TASM32。无壳。
2)试运行程序,任意输入注册信息后没有错误提示。
3)OD载入程序。用超级字符串查找,发现有注册成功的提示信息。
超级字串参考+        , 条目 5
地址=004012D9
反汇编=PUSH CrackMe0.00402108
文本字串=congratulations
双击,来到004012D9处。向上找计算过程开始的地方,
4)OD重新载入程序,任意输入注册信息,确定后。程序被中断
004011D0  |.  68 43204000   PUSH CrackMe0.00402043                   c:\
004011D5  |.  E8 E8FEFFFF   CALL CrackMe0.004010C2                   取C盘序列号
004011DA  |.  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX             C盘序列号进EBP-4
004011DD  |.  6A 05         PUSH 5
004011DF  |.  FF75 FC       PUSH DWORD PTR SS:[EBP-4]
004011E2  |.  E8 B1FEFFFF   CALL CrackMe0.00401098                   C盘序列号左移五位
004011E7  |.  6A 0D         PUSH 0D
004011E9  |.  50            PUSH EAX
004011EA  |.  E8 92FEFFFF   CALL CrackMe0.00401081                   左移五位后与OD(13)做LSH运算
004011EF  |.  68 47204000   PUSH CrackMe0.00402047                   d:\
004011F4  |.  E8 C9FEFFFF   CALL CrackMe0.004010C2                   取D盘序列号
004011F9  |.  8945 F8       MOV DWORD PTR SS:[EBP-8],EAX
004011FC  |.  FF75 F8       PUSH DWORD PTR SS:[EBP-8]                EBP-8=D盘序列号
004011FF  |.  FF75 FC       PUSH DWORD PTR SS:[EBP-4]                EBP-4=C盘序列号
00401202  |.  E8 A8FEFFFF   CALL CrackMe0.004010AF                   C盘序列号与D盘序列号相加,结果进EAX
00401207  |.  6A 05         PUSH 5
00401209  |.  50            PUSH EAX
0040120A  |.  E8 89FEFFFF   CALL CrackMe0.00401098                   结果左移五位
0040120F  |.  6A 0D         PUSH 0D
00401211  |.  50            PUSH EAX
00401212  |.  E8 6AFEFFFF   CALL CrackMe0.00401081                   左移五位后与0D(13)做LSH运算,结果进EAX
00401217  |.  FF75 F8       PUSH DWORD PTR SS:[EBP-8]               
0040121A  |.  FF75 FC       PUSH DWORD PTR SS:[EBP-4]               
0040121D  |.  E8 34FEFFFF   CALL CrackMe0.00401056                   *将C,D盘序列号进行浮点运算(将运算结果比做“机器码”)
00401222  |.  8945 F0       MOV DWORD PTR SS:[EBP-10],EAX
00401225  |.  68 80000000   PUSH 80                                 
0040122A  |.  68 04314000   PUSH CrackMe0.00403104                  
0040122F  |.  68 EC030000   PUSH 3EC                                 
00401234  |.  FF75 08       PUSH DWORD PTR SS:[EBP+8]               
00401237  |.  E8 FC000000   CALL <JMP.&user32.GetDlgItemTextA>      
00401225  |.  68 80000000   PUSH 80                           
0040122A  |.  68 04314000   PUSH CrackMe0.00403104
0040122F  |.  68 EC030000   PUSH 3EC
00401234  |.  FF75 08       PUSH DWORD PTR SS:[EBP+8]
00401237  |.  E8 FC000000   CALL <JMP.&user32.GetDlgItemTextA> 取注册名
0040123C  |.  8945 F4       MOV DWORD PTR SS:[EBP-C],EAX       EAX=注册名位数
0040123F  |.  837D F4 04    CMP DWORD PTR SS:[EBP-C],4         比较注册名是否大于四位。小于则跳向失败。
00401243  |.  73 04         JNB SHORT CrackMe0.00401249
00401245  |.  C9            LEAVE
00401246  |.  C2 1000       RETN 10
00401249  |>  68 04314000   PUSH CrackMe0.00403104             取注册名
0040124E  |.  E8 E3FDFFFF   CALL CrackMe0.00401036             *第一个重要的CALL!进。。。
00401253  |.  6A 01         PUSH 1
00401255  |.  50            PUSH EAX
00401256  |.  E8 26FEFFFF   CALL CrackMe0.00401081             *第二个重要的CALL!进。。。
0040125B  |.  0B45 F0       OR EAX,DWORD PTR SS:[EBP-10]       EBP-10等于机器码
0040125E  |.  25 FFFFFF0F   AND EAX,0FFFFFFF                   EAX=EAX+0FFFFFFF
00401263  |.  8945 EC       MOV DWORD PTR SS:[EBP-14],EAX
00401266  |.  33C9          XOR ECX,ECX                        ECX清零
00401268  |.  33D2          XOR EDX,EDX                        EDX清零
0040126A  |.  8D35 00304000 LEA ESI,DWORD PTR DS:[403000]
00401270  |.  8B45 EC       MOV EAX,DWORD PTR SS:[EBP-14]
00401273  |>  8945 EC       /MOV DWORD PTR SS:[EBP-14],EAX     EAX=EBP-14=乙1
00401276  |.  6A 10         |PUSH 10
00401278  |.  50            |PUSH EAX
00401279  |.  E8 82FDFFFF   |CALL CrackMe0.00401000           *第三个重要的CALL!进。。。
0040127E  |.  8BC8          |MOV ECX,EAX
00401280  |.  8D3D 73204000 |LEA EDI,DWORD PTR DS:[402073]     EAX=ECX=EDX=第三个CALL计算出的余数
00401286  |.  8A0439        |MOV AL,BYTE PTR DS:[ECX+EDI]      EDI=71362de9f8ab45c(作为一个固定表)
00401289  |.  8806          |MOV BYTE PTR DS:[ESI],AL          取余数在表中所对应字符的ASCII值
0040128B  |.  8B45 EC       |MOV EAX,DWORD PTR SS:[EBP-14]     
0040128E  |.  6A 04         |PUSH 4
00401290  |.  50            |PUSH EAX
00401291  |.  E8 86FDFFFF   |CALL CrackMe0.0040101C            *第四个重要的CALL!进。。。
00401296  |.  8945 EC       |MOV DWORD PTR SS:[EBP-14],EAX
00401299  |.  0BC0          |OR EAX,EAX
0040129B  |.  74 04         |JE SHORT CrackMe0.004012A1        计算完毕就跳走
0040129D  |.  46            |INC ESI                           每计算一次ESI+1
0040129E  |.  47            |INC EDI                           每计算一次EDI+1
0040129F  |.^ EB D2         \JMP SHORT CrackMe0.00401273       继续计算
004012A1  |>  68 00010000   PUSH 100
004012A6  |.  8D85 ECFEFFFF LEA EAX,DWORD PTR SS:[EBP-114]
004012AC  |.  50            PUSH EAX
004012AD  |.  68 ED030000   PUSH 3ED
004012B2  |.  FF75 08       PUSH DWORD PTR SS:[EBP+8]
004012B5  |.  E8 7E000000   CALL <JMP.&user32.GetDlgItemTextA>
004012BA  |.  0BC0          OR EAX,EAX
004012BC  |.  75 04         JNZ SHORT CrackMe0.004012C2
004012BE  |.  C9            LEAVE
004012BF  |.  C2 1000       RETN 10
004012C2  |>  68 00304000   PUSH CrackMe0.00403000
004012C7  |.  8D85 ECFEFFFF LEA EAX,DWORD PTR SS:[EBP-114]
004012CD  |.  50            PUSH EAX
004012CE  |.  E8 53000000   CALL <JMP.&kernel32.lstrcmpA>
004012D3  |.  0BC0          OR EAX,EAX
004012D5  |.  75 18         JNZ SHORT CrackMe0.004012EF
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
先进计算机器码的CALL
00401056  /$  55            PUSH EBP
00401057  |.  8BEC          MOV EBP,ESP
00401059  |.  83C4 FC       ADD ESP,-4
0040105C  |.  53            PUSH EBX
0040105D  |.  56            PUSH ESI
0040105E  |.  57            PUSH EDI
0040105F  |.  9B            WAIT
00401060  |.  DBE3          FINIT
00401062  |.  DB45 08       FILD DWORD PTR SS:[EBP+8]           EBP+8=C盘序列号,转换成十进制。
00401065  |.  D9C0          FLD ST                              ST=C盘序列号转换成十进制后得数字设为A
00401067  |.  DEC9          FMULP ST(1),ST                      A*A=A平方
00401069  |.  DB45 0C       FILD DWORD PTR SS:[EBP+C]           EBP+C=D盘序列号,转换成十进制
0040106C  |.  D9C0          FLD ST                              ST=D盘序列号转换成十进制后得数字设为B
0040106E  |.  DEC9          FMULP ST(1),ST                      B*B=B平方
00401070  |.  DEC1          FADDP ST(1),ST                      A平方+B平方
00401072  |.  D9FA          FSQRT                               得到结果
00401074  |.  DB5D FC       FISTP DWORD PTR SS:[EBP-4]
00401077  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]        结果转换成10进制数
0040107A  |.  5F            POP EDI
0040107B  |.  5E            POP ESI
0040107C  |.  5B            POP EBX
0040107D  |.  C9            LEAVE
0040107E  \.  C2 0800       RETN 8                               返回
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
进入第一个关键CALL
来到这里。。。。。。
00401036  /$  55            PUSH EBP
00401037  |.  8BEC          MOV EBP,ESP
00401039  |.  8B75 08       MOV ESI,DWORD PTR SS:[EBP+8]         EBP+8=注册名
0040103C  |.  FC            CLD
0040103D  |.  33D2          XOR EDX,EDX                          EDX清零
0040103F  |.  B8 01000000   MOV EAX,1                            给EAX赋一
00401044  |>  0FB60E        /MOVZX ECX,BYTE PTR DS:[ESI]         取注册名没一位的ASCII值,放进ECX
00401047  |.  46            |INC ESI                             每取一次ESI+1
00401048  |.  0BC9          |OR ECX,ECX
0040104A  |.  74 06         |JE SHORT CrackMe0.00401052          计算完了吗。计算完就跳走。
0040104C  |.  F7E1          |MUL ECX                             EAX*ECX结果放进EAX
0040104E  |.  03C2          |ADD EAX,EDX                         EAX=EAX+EDX
00401050  |.^ EB F2         \JMP SHORT CrackMe0.00401044         继续计算
00401052  |>  C9            LEAVE
00401053  \.  C2 0400       RETN 4
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
进入第二个关键CALL  (注意:在这里设第一个CALL的运算结果为“甲”)
来到这里。。。。。。
00401081  /$  55            PUSH EBP
00401082  |.  8BEC          MOV EBP,ESP
00401084  |.  53            PUSH EBX
00401085  |.  56            PUSH ESI
00401086  |.  57            PUSH EDI
00401087  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]            EBP+8=甲
0040108A  |.  8D55 0C       LEA EDX,DWORD PTR SS:[EBP+C]            EBP+C=1
0040108D  |.  8A0A          MOV CL,BYTE PTR DS:[EDX]                令CL=1
0040108F  |.  D3C0          ROL EAX,CL                              甲与1做LSH运算。结果放进EAX
00401091  |.  5F            POP EDI  
00401092  |.  5E            POP ESI
00401093  |.  5B            POP EBX
00401094  |.  C9            LEAVE                                   计算完毕
00401095  \.  C2 0800       RETN 8                                  返回
***********************注意:设第二步计算的结果为“乙”*******************************************
进入第三个关键CALL
来到这里。。。。。。
00401000  /$  55            PUSH EBP
00401001  |.  8BEC          MOV EBP,ESP
00401003  |.  83C4 FC       ADD ESP,-4
00401006  |.  53            PUSH EBX
00401007  |.  56            PUSH ESI
00401008  |.  57            PUSH EDI
00401009  |.  33D2          XOR EDX,EDX                              EDX清零
0040100B  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]             EBP+8=乙
0040100E  |.  8B4D 0C       MOV ECX,DWORD PTR SS:[EBP+C]             EBP+C=定值10
00401011  |.  F7F9          IDIV ECX                                 EAX除以ECX,结果进EAX余数进EDX
00401013  |.  8BC2          MOV EAX,EDX
00401015  |.  5F            POP EDI
00401016  |.  5E            POP ESI
00401017  |.  5B            POP EBX
00401018  |.  C9            LEAVE                                    计算完毕
00401019  \.  C2 0800       RETN 8                                   返回
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
进入第四个关键CALL
来到这里。。。。。。
0040101C  /$  55            PUSH EBP
0040101D  |.  8BEC          MOV EBP,ESP
0040101F  |.  83C4 FC       ADD ESP,-4
00401022  |.  53            PUSH EBX
00401023  |.  56            PUSH ESI
00401024  |.  57            PUSH EDI
00401025  |.  33D2          XOR EDX,EDX
00401027  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
0040102A  |.  8B4D 0C       MOV ECX,DWORD PTR SS:[EBP+C]             EBP+C=定值4
0040102D  |.  F7F9          IDIV ECX                                 EAX除以ECX,结果进EAX余数进EDX
0040102F  |.  5F            POP EDI
00401030  |.  5E            POP ESI
00401031  |.  5B            POP EBX                                  输出结果
00401032  |.  C9            LEAVE                                    计算完毕
00401033  \.  C2 0800       RETN 8                                   返回
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
------------------------------------------------------------------------
BY 逍遥风
算法总结:
1)取注册名每一位的ASCII值,将这些值相乘。设结果为“甲”。
2)将甲与1做LSH运算(WINDOWS自带得计算器就可以计算,注意计算都是16进制下的计算)。设结果为“乙”。
3)将乙在与机器码进行OR运算。再加上0FFFFFFF。设为(乙1)
4)将(乙1)除以一个定值10,得到一个余数。把余数转化成对应的十进制数。在固定表071362de9f8ab45c中寻找与这个  十进制数相对应的字符。设为“丙”
5)再将(乙1)除以定值4,得到一个商。把这个商作为下次计算的除数(相当于第一步的“乙1”)
6)计算过程循环进行12次。把每次计算所的的“丙”合并就是注册码。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
机器码的计算过程(主要过程):
1)分别取C盘D盘的序列号。
2)将两盘序列号转换成浮点数。求两盘序列号浮点数平方的和。将结果转换成十进制数即为“机器码”
----------------------------------------------------
有疏漏或错误的地方请大家多多指正。谢谢


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (8)
雪    币: 224
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
兄弟分析的不错,能否细讲怎样“向上找计算过程开始的地方”?
2006-2-8 02:25
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习ing...
2006-2-8 09:55
0
雪    币: 2256
活跃值: (941)
能力值: (RANK:2210 )
在线值:
发帖
回帖
粉丝
4
因为出现错误或正确提示的地方是真假注册码比较或比较以后的地方。在这个地方只有可能看到真假注册码。而要寻找注册码计算的过程就要向上找。找到算法开始的地方。这个主要靠经验了,多练练就熟悉了。
2006-2-8 13:50
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
5
有些地方不明白
2006-2-9 11:31
0
雪    币: 224
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
是说算法分析不错,学习了
这个CrackMe是不是还要去除Nag、找到HardCoded的练习?
代码少有提示靠经验。有的情况就不知道哪里下断了啊
2006-2-9 15:34
0
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ywb
7
代码少有提示,靠经验。有的情况就不知道哪里下断
2006-2-15 10:28
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hyx
8
受益非浅
2006-3-9 16:57
0
雪    币: 183
活跃值: (563)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
9
2006-4-15 11:42
0
游客
登录 | 注册 方可回帖
返回
//