crackme2(简单算法)

crackme2来自/看雪/2007精华版CrackMe/序列号/逍遥风大牛
【详细过程】
无壳,用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 ; \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 ; \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 ; 循环计算
00401299 . C1C0 03 ROL EAX,3 ; 累加的结果设为A,ROL(A,3)得到B
0040129C . 35 A5150500 XOR EAX,515A5 ; XOR(B,0x515A5),得到的结果设为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 ; \MessageBoxA

【算法总结】
由于注册信息必须满足
F(注册名) + G(注册码) = 定值
所以要进行逆推.已知定值等于0x797E7
很容易得出:G(注册码) = 定值0x797E7 - F(注册名)
根据分析的结论,以注册名lonelykin为例,
F(注册名) = 0x50B0D
所以: G(注册码) = 定值0x797E7 - F(注册名) = 0x797E7 - 0x50B0D= 0x28CDA
因为
G(注册码) = XOR(注册码的16进制,0x87CA),
所以:注册码的16进制就等于XOR(0x28CDA,0x87CA)
即::注册码的16进制 = XOR(0x28CDA,0x87CA) = 0x20B10
所以注册码就应该等于133904

算法很简单,用python写了注册机,贴上来 大牛误喷

import binascii
import os,sys
#获取用户输入内容
Regname = raw_input(" please input you registered name: ");
#求字符串长度
Leg = len( Regname );
#判断字符串是否符合条件
if (Leg <= 5):
    print " your registered name is too short! ";
elif (Leg >= 51):
    print " your registered name is too long! ";
else:
    print " \nyour registered name is: " + Regname;
#列表求和
l = list( Regname );
h = [];
y = [];

#逐个转换16进制并存放在h列表中
for i in l:
    z = binascii.b2a_hex( i );
    h.append( z );

#逐个转换10进制并存放在y列表中
for i in h:
    Dec = int( i, 16 );
    y.append( Dec );

#十进制累计求和
ret = sum(y);
#结果循环左移3位
result = ret << 3;
fixed1 = 333221;
fixed2 = 497639;
fixed3 = 34762;
#确定用户名
lname = result^fixed1
pwd = fixed2 -lname
#确定注册码
realpwd = pwd^fixed3
print "your Serial is:" + str(realpwd)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值