首页
社区
课程
招聘
[原创]小菜写的Crackme,请大家指教
发表于: 2009-10-5 19:54 9727

[原创]小菜写的Crackme,请大家指教

2009-10-5 19:54
9727
来看雪混了几天,今天心血来潮也写个Crackme玩一下,算法简单,爆破更容易,供大家娱乐之用

附:
用户名:kevinch
注册码:~$z+x,t0m2l6

注:上一个的注册码窗口没设明白,注册码没法换行,这个已更正

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (32)
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你这CM真诡异。。。自己测试下再发吧
2009-10-5 20:17
0
雪    币: 155
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
已经测试了几个,我知道如果注册码不对的话会出错,不过即使不出错,注册码不对的话也是会退出的

另外,只是娱乐,不妨多说几点写的思路,注册码位数不固定,与用户名有关,最长可能会有100位吧,没试过

我试了一下,对自己写的东西也只是跟的时候发现有些数值是关键,但我搞破解是小菜,这种恐怕我除了爆破一点办法也没有,在我的感觉里你要真的能看得出算法才可能搞明白,等过几天就发源码上来,先保密几天,其实真的写的很简单,我数学很差,只会用简单的算法,对于DES或RSA之类的根本就看不懂

自己编写的时候发现有一个瓶颈,就是无论如何最终会有一个比较然后决定对或错,也就是关键跳,我自己跟了下,没找到
2009-10-5 20:26
0
雪    币: 155
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这个也可以
用户名:Coco
注册码:~(v+v,n4k4

用户名:Test
注册码:}&|*|,v-r-p3o7o9i:e:
2009-10-5 20:35
0
雪    币: 9
活跃值: (142)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
5
很显然这是个PCODE编译的!
2009-10-5 20:38
0
雪    币: 155
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
VB好学啊,以前刚学编程时也是从Basic开始的,最喜欢变量不用申请,想用就用
2009-10-5 20:43
0
雪    币: 155
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
你的更绝了,竟然是
用户名:kingstell
注册码:|

你试一下

看来还是有必要设个下限的,不然这么滥的算法会找出很多这样的
2009-10-5 21:05
0
雪    币: 155
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
新更改,增加了注册码下限,最少8位
上传的附件:
2009-10-5 23:24
0
雪    币: 155
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
昨晚又跟了一次,发现VB在编译时严格按照输入的代码来的,我在里面输入了一个临时的指令用于弹出一个字符串对话框来告诉我注册码,在编译时将MsgBox项REM掉了,但字符串累计一项没有REM掉,在程序运行时还是会有一个字符串累计的地方,可以得到注册码,看来以后应该要注意这个地方

另外提示下,在.data段下段很容易找到计算过程
2009-10-7 12:02
0
雪    币: 155
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
没什么人气,自己顶,哈
2009-10-10 13:22
0
雪    币: 347
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
大概看的
得到用户名的ASCII之合,和长度,进行一些XOR /计算得到的结果和序列号再进行一系列的计算,如果最后结果等于0,貌似就通过了,
可能是我看错了,呵呵

像一个方程式。。。
2009-10-10 16:25
0
雪    币: 155
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
大体差不多,不过没有公式,没有异或运算之类的,只有加减乘除,而且这个版本里面能看到注册码累计的结果
2009-10-10 21:01
0
雪    币: 347
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
那就很怪异了,反编译出来的算法里,有异或和乘除,呵呵
看来,反编译器优化的很厉害.....
2009-10-10 21:07
0
雪    币: 347
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
反编译出来如下:
Private Sub Command1_Click() '4022D4
'Data Table: 4018EC
loc_401EE8: var_94 = CVar(Me) 'Variant
loc_401EF4: var_B4 = CVar(Me) 'Variant
If (Len(var_94) < 2) Then
loc_401F2C: var_134 = CVar(MsgBox("请输入2位以上的用户名", 0, var_D4, var_104, var_124)) 'Variant
loc_401F3B: GoTo loc_4022D1
End If
loc_401F45: var_154 = Len(var_94) 'Variant
For var_194 = 1 To var_154: var_174 = var_194 'Variant
loc_401F8E: var_164 = (0 + CVar(Asc(CStr(Mid$(var_94, CLng(var_174), 1))))) 'Variant
Next var_194 'Variant
loc_401FA8: var_1A8 = var_164 'Variant
If CBool(((var_1A8 Mod 10) = 0) And ((var_154 Mod 10) = 0)) Then
loc_401FE6: var_1C8 = 10 'Variant
loc_401FEA: GoTo loc_401FFB
End If
loc_401FFB: ' Referenced from: 401FEA
If ((var_1A8 Mod var_154) = 0) Then
loc_40200E: var_1C8 = 10 'Variant
End If
loc_402012: ' Referenced from: 402084
For var_208 = 1 To Len(var_1A8): var_1E8 = var_208 'Variant
loc_402051: FnIntVar
loc_402062: var_1D8 = (0 + ((var_1A8 / 10 ^ (Len(var_1A8) - var_1E8)) Mod 10)) 'Variant
Next var_208 'Variant
If (var_1D8 > 9) Then
loc_402080: var_1A8 = var_1D8 'Variant
loc_402084: GoTo loc_402012
End If
If ((var_1C8 * var_1D8) < 8) Then
loc_4020A8: var_238 = 8 'Variant
End If
If CBool(Len(var_B4) <> (var_1C8 * var_1D8)) Then
loc_4020CF: UnLoad Me
End If
loc_402103: var_24C = ((var_164 * 10 ^ Len((var_1C8 * var_1D8))) + (var_1C8 * var_1D8)) 'Variant
loc_40210C: var_260 = 0 'Variant
loc_40211E: var_280 = 127 'Variant
loc_402127: var_290 = 0 'Variant
For var_2C0 = 1 To var_238: var_2A0 = var_2C0 'Variant
loc_402160: var_290 = CVar(Asc(CStr(Mid$(var_B4, CLng(var_2A0), 1)))) 'Variant
If ((var_2A0 Mod 2) = 0) Then
loc_4021A6: FnIntVar
loc_4021B7: var_270 = (32 + ((var_24C / 10 ^ (var_2A0 Mod Len(var_24C))) Mod 10)) 'Variant
If (var_270 > 126) Then
loc_4021DE: var_270 = ((var_270 - 126) + 32) 'Variant
End If
loc_4021E5: var_2D0 = var_270 'Variant
loc_4021E9: GoTo loc_402247
End If
loc_402205: var_104 = 10 ^ (var_2A0 Mod Len(var_24C))
loc_402209: var_124 = (var_24C / var_104)
loc_40220D: FnIntVar
loc_40221E: var_280 = (var_280 - (var_124 Mod 10)) 'Variant
If (var_280 < 33) Then
loc_40223C: var_280 = (94 + var_280) 'Variant
End If
loc_402243: var_2D0 = var_280 'Variant
loc_402247: ' Referenced from: 4021E9
loc_402262: var_250 = CStr((CVar(var_250) + Chr(CLng(var_2D0))))
loc_40227D: var_260 = ((var_2D0 - var_290) + var_260) 'Variant
Next var_2C0 'Variant
If (var_260 = 0) Then
loc_4022C2: var_134 = CVar(MsgBox("你真厉害", 0, "成功啦", var_104, var_124)) 'Variant
loc_4022D1: ' Referenced from: 401F3B
End If
loc_4022D1: Exit Sub
End Sub
2009-10-10 21:22
0
雪    币: 347
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
如果真拿这个来写注册机,好像有点难 哈哈
2009-10-10 21:22
0
雪    币: 155
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
loc_402262: var_250 = CStr((CVar(var_250) + Chr(CLng(var_2D0))))
这句应该就是我说的那个字符累计的地方了,不过最终编译显示的那句被我REM掉了,这里留了个尾巴
2009-10-12 10:48
0
雪    币: 155
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
你的反编译器蛮厉害的,能发上来研究一下吗,我下过VB Decoplier,不过每次都不能正常工作,可能是绿色版的原因吧,也许注册表没有关联好
2009-10-12 10:50
0
雪    币: 347
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
2009-10-12 11:09
0
雪    币: 155
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
贴上源码,大家不要见笑

用户名ASCII值加和,再与位数相除,余数与加和后数值再加和到个位数后值相乘,两值相接,如kevinch的ASCII加和为744,加和到个位数(R1)为7+4+4=15,1+5=6,与位数相除的余数(R2)即744 mod 7 =2,R1*R2=2*6=12,于是要提取的序列为74412,序列号长度为R1*R2=12
再依奇偶序从33-126之间累加或累减得到序列号

Private Sub Command1_Click()
x = Text1.Text
Text2.Text = ""
If Len(x) < 2 Then
    msg = MsgBox("请输入2位以上的用户名", vbOKOnly)
    GoTo quit
End If
ulen = Len(x)
utotal = 0
For i1 = 1 To ulen
    utotal = utotal + Asc(Mid(x, i1, 1))    '用户名ASCII值加和
Next i1
utotal2 = utotal  
If utotal2 Mod 10 = 0 And ulen Mod 10 = 0 Then   '如果加和除以位数后为零则置为10
    r1 = 10
Else
    r1 = utotal2 Mod ulen    '否则取余数
End If
If r1 = 0 Then r1 = 10  '再加上个保险

again:
r2 = 0
For i2 = 1 To Len(utotal2)
    r2 = r2 + Int(utotal2 / 10 ^ (Len(utotal2) - i2)) Mod 10  '取各位累加和
Next i2
If r2 > 9 Then
    utotal2 = r2
    GoTo again
End If
r4 = r1 * r2
If r4 < 8 Then r4 = 8  '后加的让序列号最少8位
if len(text.text2) <> r4 then unload me   '位数不对出错是这里,可是我还真不明白是什么原因出的错,不能用unload me吗???
r3 = utotal * 10 ^ Len(r1 * r2) + r1 * r2
Dim list As String
result = 0
tmp1 = 32    '因为可输入字符是从ASCII值33-126之间
tmp2 = 127
For i6 = 1 To r4
    If i6 Mod 2 = 0 Then  '如果I6是偶数就由ASCII值32向上累加
        tmp1 = tmp1 + Int(r3 / 10 ^ (i6 Mod Len(r3))) Mod 10
        If tmp1 > 126 Then tmp1 = tmp1 - 126 + 32  '高于126后再折回来
        tmp = tmp1
    Else   '如果是奇数就从ASCII值127向下累减
        tmp2 = tmp2 - Int(r3 / 10 ^ (i6 Mod Len(r3))) Mod 10
        If tmp2 < 33 Then tmp2 = 127 - 33 + tmp2  '低于33后再返回去
        tmp = tmp2
    End If
    result = result + tmp - asc(mid(text.text2, i6, 1))
       Rem msg = MsgBox(list, vbOKOnly)
    list = list + Chr(tmp)     '就是这句没有REM掉
Next i6
if result=0 then msg=msgbox("你真厉害",vbokonly,"成功啦")   '这句换成text.text2=list就可以做注册机了
quit:
End Sub
2009-10-12 11:12
0
雪    币: 347
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
汗,,你还说没有乘除余。。。我都用C写了一多半的注册机,你被说的没敢往下写了,呵呵
2009-10-12 11:15
0
雪    币: 155
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
是我自己不了解电脑倒底怎样算余的,不好意思了

代码也比较乱,用VB主要就是因为好学,而且变量不用申请,比较适合我这种没计划的人
2009-10-12 11:19
0
雪    币: 347
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
还是删了吧,我的代码,我自己都看的恶性。。。。
2009-10-12 11:21
0
雪    币: 155
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
这样刚好,你可以对照源码看一下,我也学过C,不过很久了,而且只学了一点,C很强大,但语法太严,看你严格执行变量申请,佩服,以后请多多指教

有源码一改就成注册机了,不过能逆出注册算法更厉害
2009-10-12 11:26
0
雪    币: 347
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
24
不敢指教啊,你写的还好了,我烂菜一个
不想轻易这么被看出来,还是用C或者汇编写CM好些,你觉得呢
2009-10-12 11:29
0
雪    币: 155
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
我比较菜,一直觉得C++写的最好破,VB和DELPHI的程序难解些,交流一下,我想知道我为什么会有这种感觉
2009-10-12 11:35
0
游客
登录 | 注册 方可回帖
返回
//