【破文标题】CRACKME破解分析
【破文作者】逍遥风
【破解工具】OD, 计算器
【破解平台】WINXP
【破解声明】菜鸟偶得一点心得,与大家分享
----------------------------------------------------------------------
ACG'S CRACKME
简单的CRACKME练习.主要练习逆推出注册码
这个CRACKME的主要验证过程是
F(注册名)+G(注册码) = 定值.
用OD载入这个CRACKME,根据字符串提示信息很容易找到关键代码
来到关键代码处
0040124C . 6A 28 PUSH 28 ; /Count = 28 (40.)
0040124E . 68 06214000 PUSH crcme1.00402106 ; |Buffer = crcme1.00402106
00401253 . 68 E9030000 PUSH 3E9 ; |ControlID = 3E9 (1001.)
00401258 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
0040125B . E8 10020000 CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
00401260 . 83F8 05 CMP EAX,5 ; 注册名位数与5比较
00401263 . 0F82 BD000000 JB crcme1.00401326 ; 小于5位就跳向失败
注册名位数不得小于5位
00401269 . 6A 28 PUSH 28 ; /Count = 28 (40.)
0040126B . 68 2E214000 PUSH crcme1.0040212E ; |Buffer = crcme1.0040212E
00401270 . 68 EA030000 PUSH 3EA ; |ControlID = 3EA (1002.)
00401275 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
00401278 . E8 F3010000 CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
0040127D . BF 06214000 MOV EDI,crcme1.00402106 ; 取输入的注册码
00401282 . 33DB XOR EBX,EBX ; EBX清零
00401284 . 33C0 XOR EAX,EAX ; EAX清零
00401286 > 8A1F MOV BL,BYTE PTR DS:[EDI] ; 取注册名每一位的ASCII码
00401288 . 80FB 20 CMP BL,20 ; 格式验证
0040128B . 0F82 95000000 JB crcme1.00401326
00401291 . 03C3 ADD EAX,EBX ; 注册名每一位的 ASCII码累加
00401293 . 47 INC EDI ; 每计算一次EDI中的值加1
00401294 . 803F 00 CMP BYTE PTR DS:[EDI],0 ; 累加完了吗
00401297 .^ 75 ED JNZ SHORT crcme1.00401286 ; 循环计算
将注册名的每一位进行累加计算
例如:
注册名lovetc, 对应的累加结果就是28D
00401299 . C1C0 03 ROL EAX,3 ; 累加的结果设为A,ROL(A,3)得到B
0040129C . 35 A5150500 XOR EAX,515A5 ; XOR(B,0x515A5),得到的结果设为C
到这里对注册名的计算就完成了.
对注册名的计算步骤是:
1)将注册名的每一位进行累加
2)ROL(累加结果,3),得到B
3) 将B与定值0x515A5进行XOR运算,得到最后结果C
004012A1 . 50 PUSH EAX
004012A2 . 33C0 XOR EAX,EAX
004012A4 . 33DB XOR EBX,EBX
004012A6 . 33FF XOR EDI,EDI ; 个寄存器清零
004012A8 . BE 2E214000 MOV ESI,crcme1.0040212E ; 使ESI等于输入的注册码
004012AD > B8 0A000000 MOV EAX,0A ; 令EAX等于定值0xA
作者:逍遥风
004012B2 . 8A1E MOV BL,BYTE PTR DS:[ESI] ; 取注册码的每一位进行转换
004012B4 . 85DB TEST EBX,EBX
004012B6 . 74 15 JE SHORT crcme1.004012CD
004012B8 . 80FB 30 CMP BL,30 ; 格式验证
004012BB . 72 69 JB SHORT crcme1.00401326
004012BD . 80FB 39 CMP BL,39 ; 格式验证
004012C0 . 7F 64 JG SHORT crcme1.00401326
004012C2 . 83EB 30 SUB EBX,30
004012C5 . 0FAFF8 IMUL EDI,EAX
004012C8 . 03FB ADD EDI,EBX
004012CA . 46 INC ESI
004012CB .^ EB E0 JMP SHORT crcme1.004012AD ; 循环计算
在注意这里,这个循环的作用是将输入的注册码转换成对应的16进制形式
004012CD > 81F7 CA870000 XOR EDI,87CA ; XOR(注册码的16进制,0x87CA),得到的结果设为D
004012D3 . 8BDF MOV EBX,EDI
以上代码是对输入的注册码进行的计算.
主要步骤是将注册码的16进制与定值0x87CA)进行XOR运算
004012D5 . 58 POP EAX
004012D6 . 03C3 ADD EAX,EBX ; 将注册名和注册码的计算结果相加,得到的和设为E
将注册名的计算结果与注册码的计算结果相加
004012D8 . 35 E7970700 XOR EAX,797E7 ; XOR(E,0x797E7)
004012DD . 85C0 TEST EAX,EAX ; 检验是否等于零
从这里可以得知,最后的计算结果必须等于0x797E7
就是说:
F (注册名) + G (注册码) = 定值0x797E7
004012DF . 75 45 JNZ SHORT crcme1.00401326 ; 不等于零就跳向失败
004012E1 . 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
004012E3 . 68 1B204000 PUSH crcme1.0040201B ; |-=acg=- t h e b e s t -=acg=-
004012E8 . 68 77204000 PUSH crcme1.00402077 ; |Text = "Yeah You Did It!!!
Czyli nareszczie ci si?uda筹
Teraz mo垮sz przy彻czy?si?do ACG"
004012ED . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
004012F0 . E8 5D010000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
----------------------------------------------------------------------
算法总结:
由于注册信息必须满足
F(注册名) + G(注册码) = 定值
所以要进行逆推.已知定值等于0x797E7
很容易得出:G(注册码) = 定值0x797E7 - F(注册名)
根据分析的结论,以注册名lovetc为例,
F(注册名) = 0x501CD
所以: G(注册码) = 定值0x797E7 - F(注册名) = 0x797E7 - 0x501CD = 0x296EA
因为
G(注册码) = XOR(注册码的16进制,0x87CA),
所以:注册码的16进制就等于XOR(0x296EA,0x87CA)
即::注册码的16进制 = XOR(0x296EA,0x87CA) = 211D0
所以注册码就应该等于135632
注册名:lovetc
注册码:135632
----------------------------------------------------------------------
【版权声明】本文只为交流,转载请保留作者及文章完整
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课