首页
社区
课程
招聘
一个2合1的CRACKME算法分析
发表于: 2006-2-15 13:31 8019

一个2合1的CRACKME算法分析

2006-2-15 13:31
8019

第一:先来解决它的固定序列号
1)PEID检查,MASM32 / TASM32。无壳。
2)任意输入序列号,有错误提示“sorry, please try again”.。
3)OD重新载入程序。用超级字符串查找,找到有两处错误的提示。先看第一处。
超级字串参考+        , 条目 20
地址=004013D9
反汇编=PUSH CrackMe0.00403067
文本字串=sorry, please try again. 双击来到004013D9处。看到前面有一处调用了GetWindowTextA,就在那里下断
4)OD重新载入程序,在HardCoded栏任意输入11111后确定,程序中断
0040135D  |> \6A 20         PUSH 20                                  ; /Count = 20 (32.)
0040135F  |.  68 15324000   PUSH CrackMe0.00403215                   ; |Buffer = CrackMe0.00403215
00401364  |.  FF35 90344000 PUSH DWORD PTR DS:[403490]               ; |hWnd = 003201A4 (class='Edit',parent=00340274)
0040136A  |.  E8 BB030000   CALL <JMP.&USER32.GetWindowTextA>        ; \GetWindowTextA
0040136F  |.  8D05 53134000 LEA EAX,DWORD PTR DS:[401353]      
00401375  |.  8D1D 15324000 LEA EBX,DWORD PTR DS:[403215]             F8到这里时注意看寄存器中
省略一些代码。。。。。。
004013D2  |>  6A 00         PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
004013D4  |.  68 0A304000   PUSH CrackMe0.0040300A                   ; |splish, splash
004013D9  |.  68 67304000   PUSH CrackMe0.00403067                   ; |sorry, please try again.
004013DE  |.  6A 00         PUSH 0                                   ; |hOwner = NULL
004013E0  |.  E8 63030000   CALL <JMP.&USER32.MessageBoxA>           ; \MessageBoxA
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
到00401375时,寄存器XEAX 00401353 ASCII "HardCoded"
这里的HardCoded就是正确序列号。
重新打开程序,在HardCoded栏中输入HardCoded。出现正确提示,成功。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二:解决它的注册算法
1)任意输入注册信息,有错误提示“sorry, please try again”
2)OD重新载入程序。用超级字符串查找,“sorry, please try again”,这次看第二处
超级字串参考+        , 条目 33
地址=004016E9
反汇编=PUSH CrackMe0.00403067
文本字串=sorry, please try again. 双击来到004016E9处,有两处调用了GetWindowTextA,在第一处那里下断。
3)OD重新载入程序,任意输入注册信息后,程序中断
004015E4  /$  55            PUSH EBP
004015E5  |.  8BEC          MOV EBP,ESP
004015E7  |.  6A 20         PUSH 20                                  ; /Count = 20 (32.)
004015E9  |.  68 42324000   PUSH CrackMe0.00403242                   ; |Buffer = CrackMe0.00403242
004015EE  |.  FF75 0C       PUSH DWORD PTR SS:[EBP+C]                ; |hWnd
004015F1  |.  E8 34010000   CALL <JMP.&USER32.GetWindowTextA>        ; \GetWindowTextA
004015F6  |.  85C0          TEST EAX,EAX                             ;  取假码位数
004015F8  |.  0F84 95000000 JE CrackMe0.00401693
004015FE  |.  A3 67344000   MOV DWORD PTR DS:[403467],EAX
00401603  |.  6A 0B         PUSH 0B                                  ; /Count = B (11.)
00401605  |.  68 36324000   PUSH CrackMe0.00403236                   ; |Buffer = CrackMe0.00403236
0040160A  |.  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hWnd
0040160D  |.  E8 18010000   CALL <JMP.&USER32.GetWindowTextA>        ; \GetWindowTextA
00401612  |.  85C0          TEST EAX,EAX                             ;  取注册名位数
00401614  |.  74 68         JE SHORT CrackMe0.0040167E
00401616  |.  A3 63344000   MOV DWORD PTR DS:[403463],EAX
0040161B  |.  33C9          XOR ECX,ECX                              ;  ECX清零
0040161D  |.  33DB          XOR EBX,EBX                              ;  EBX清零
0040161F  |.  33D2          XOR EDX,EDX                              ;  EDX清零
00401621  |.  8D35 36324000 LEA ESI,DWORD PTR DS:[403236]            ;  注册名进ESI
00401627  |.  8D3D 58324000 LEA EDI,DWORD PTR DS:[403258]
0040162D  |.  B9 0A000000   MOV ECX,0A                               ;  令ECX=0A
00401632  |>  0FBE041E      /MOVSX EAX,BYTE PTR DS:[ESI+EBX]         ;  取注册名每一位的16进制值
00401636  |.  99            |CDQ
00401637  |.  F7F9          |IDIV ECX                                ;  ECX=EAX/0A 商进EAX,余数进EDX
00401639  |.  33D3          |XOR EDX,EBX                             ;  EBX=计算次数-1做XOR运算
0040163B  |.  83C2 02       |ADD EDX,2                               ;  余数加2
0040163E  |.  80FA 0A       |CMP DL,0A                               ;  所得的值与OA相比
00401641  |.  7C 03         |JL SHORT CrackMe0.00401646
00401643  |.  80EA 0A       |SUB DL,0A                               ;  大于则余数减去OA
00401646  |>  88141F        |MOV BYTE PTR DS:[EDI+EBX],DL
00401649  |.  43            |INC EBX                                 ;  每计算一次EBX+1
0040164A  |.  3B1D 63344000 |CMP EBX,DWORD PTR DS:[403463]           ;  计算完了吗
00401650  |.^ 75 E0         \JNZ SHORT CrackMe0.00401632             ;  没有则继续
00401652  |.  33C9          XOR ECX,ECX
00401654  |.  33DB          XOR EBX,EBX
00401656  |.  33D2          XOR EDX,EDX
00401658  |.  8D35 42324000 LEA ESI,DWORD PTR DS:[403242]
0040165E  |.  8D3D 4D324000 LEA EDI,DWORD PTR DS:[40324D]
00401664  |.  B9 0A000000   MOV ECX,0A                               ;  令ECX=0A
00401669  |>  0FBE041E      /MOVSX EAX,BYTE PTR DS:[ESI+EBX]         ;  取假码每一位对应的16进制数
0040166D  |.  99            |CDQ
0040166E  |.  F7F9          |IDIV ECX                                ;  ECX=EAX/0A 商进EAX,余数进EDX
00401670  |.  88141F        |MOV BYTE PTR DS:[EDI+EBX],DL
00401673  |.  43            |INC EBX                                 ;  EBX+1
00401674  |.  3B1D 67344000 |CMP EBX,DWORD PTR DS:[403467]           ;  计算完了吗
0040167A  |.^ 75 ED         \JNZ SHORT CrackMe0.00401669             ;  没有则继续
0040167C  |.  EB 2A         JMP SHORT CrackMe0.004016A8
0040167E  |>  6A 00         PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
00401680  |.  68 0A304000   PUSH CrackMe0.0040300A                   ; |splish, splash
00401685  |.  68 A0304000   PUSH CrackMe0.004030A0                   ; |please enter your name.
0040168A  |.  6A 00         PUSH 0                                   ; |hOwner = NULL
0040168C  |.  E8 B7000000   CALL <JMP.&USER32.MessageBoxA>           ; \MessageBoxA
00401691  |.  EB 62         JMP SHORT CrackMe0.004016F5
00401693  |>  6A 00         PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
00401695  |.  68 0A304000   PUSH CrackMe0.0040300A                   ; |splish, splash
0040169A  |.  68 B8304000   PUSH CrackMe0.004030B8                   ; |please enter your serial number.
0040169F  |.  6A 00         PUSH 0                                   ; |hOwner = NULL
004016A1  |.  E8 A2000000   CALL <JMP.&USER32.MessageBoxA>           ; \MessageBoxA
004016A6  |.  EB 4D         JMP SHORT CrackMe0.004016F5
004016A8  |>  8D35 4D324000 LEA ESI,DWORD PTR DS:[40324D]
004016AE  |.  8D3D 58324000 LEA EDI,DWORD PTR DS:[403258]
004016B4  |.  33DB          XOR EBX,EBX
004016B6  |>  3B1D 63344000 /CMP EBX,DWORD PTR DS:[403463]           ;
004016BC  |.  74 0F         |JE SHORT CrackMe0.004016CD
004016BE  |.  0FBE041F      |MOVSX EAX,BYTE PTR DS:[EDI+EBX]
004016C2  |.  0FBE0C1E      |MOVSX ECX,BYTE PTR DS:[ESI+EBX]
004016C6  |.  3BC1          |CMP EAX,ECX                                比较计算的结果,相等则注册成功
004016C8  |.  75 18         |JNZ SHORT CrackMe0.004016E2
004016CA  |.  43            |INC EBX
004016CB  |.^ EB E9         \JMP SHORT CrackMe0.004016B6
004016CD  |>  6A 00         PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
004016CF  |.  68 0A304000   PUSH CrackMe0.0040300A                   ; |splish, splash
004016D4  |.  68 42304000   PUSH CrackMe0.00403042                   ; |good job, now keygen it.
004016D9  |.  6A 00         PUSH 0                                   ; |hOwner = NULL
004016DB  |.  E8 68000000   CALL <JMP.&USER32.MessageBoxA>           ; \MessageBoxA
004016E0  |.  EB 13         JMP SHORT CrackMe0.004016F5
004016E2  |>  6A 00         PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
004016E4  |.  68 0A304000   PUSH CrackMe0.0040300A                   ; |splish, splash
004016E9  |.  68 67304000   PUSH CrackMe0.00403067                   ; |sorry, please try again.
004016EE  |.  6A 00         PUSH 0                                   ; |hOwner = NULL
004016F0  |.  E8 53000000   CALL <JMP.&USER32.MessageBoxA>           ; \MessageBoxA
----------------------------------------------------------------------
BY 逍遥风
算法总结:
程序采用的是F`(注册名)=F'(注册码)的方式,对注册码进行验证的。
1)对注册名的算法是:
取注册名每一位对应的16进制数,除以0A,余数与对应的计算次数减一后的值进行XOR运算,运算结果再加2。
以注册名位数为运算次数,作循环计算。最终结果设为甲
若,最终结果大于0A,那么就用甲-0A的差作为最终结果
2)对注册码的算法是:
去假码每一位对应的16进制数,除以0A。以假码位数为运算次数,作循环计算。最后取假码第一位对应的16进制数,除以0A的余数作为最终结果,设为乙。
3)甲等于乙则注册成功。
找到最简单的一组符合算法的数
注册名 1。 1--31-(除以0A,余9)--(9XOR运算次数-1=0,即9 XOR 0=9)--(9+2=B)--(B>0A,B-0A=1)--1甲
注册码 3。 3--33-(除以0A,余1)--1乙
甲=乙


[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (5)
雪    币: 301
活跃值: (300)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
2
支持一下
2006-2-15 14:28
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我也来支持,学习学习啊
2006-2-15 15:18
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不错,就是费事!!!!!!!!
2006-2-15 19:34
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
支持,又学到了知识。
虽然还不太懂。
感谢各位大虾
2006-2-17 21:15
0
雪    币: 1567
活跃值: (905)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
有没有大佬把这个算法解出来得啊
2019-11-20 09:35
0
游客
登录 | 注册 方可回帖
返回
//