1625-5 王子昂 总结《2017年6月3日》 【连续第245天总结】
A.CrackMe(13)
B.中间几个的难度是三星和???……吓到我了,完成第一页以后再去挑战这几个吧
第13个拖入PEiD,显示VB,无壳
拖入OD,运行,有两关,分别是Serial和Name/Serial
Serial:
随便输入一个,点击Try以后在文本框内显示了Try Again!
没有MsgBox,就无法锁定调用了
直接在内存中搜索字符串,也毫无收获
右键,查找→所有模块中的标签,找到GetWindowTextA,双击进入
下断,点击Try后果然断到了,从堆栈中找到调用,然后F8单步跟下去
跟了一段以后,内存中出现了另一个字符串“7714318”
尝试输入,成功
注册机就没办法了,一直在系统领空中徘徊,找不到主模块的地址
Name/Serial:
同样过程,Name输入123456,Serial输入654321
跟了一段以后内存中出现了“26023-94362”
尝试输入Serial,成功
注册机一样没辙,找不到计算的确切位置
查找论坛,得知应该使用VB Decompiler pro,遂下载并拖入,成功反编译出了源码
流程为:在单击选择框的时候,由日期计算出第一个Serial,如果选中的是第一个则将其赋值给一个隐藏Label的Caption,然后在点击Try的时候确认两者是否相等;
算法:
loc_4053A8: var_88 = CLng((((Day(Now) * Day(23)) + (Month(Now) * Month(2))) + (Year(Now) * Year(3))))
loc_4053DB: var_1D0 = CStr((((var_88 + var_88) + CLng((Day(14) * Year(2020)))) + CLng((Day(14) * Year(2020)))))
手动算了一下是错误的,打开一个VB输入这两行则是正确的
在VB的立即窗口中实验了Day和Year函数,理解不能
百度和官方文档中都只有Day(now)和Year(now)或者放入Date类型的参数的用法
立即窗口中,Day(23)=22,Month(2)=1,Year(3)=1900,Year(2020)=1905
另外Month参数给什么都得1,除了Month(1)=12
不明白这几个函数的原理,但是能用VB算出结果,这样可以作出注册机
Name/Serial:
源代码为:
Dim var_90 As Long
Dim var_1CC As Variant
loc_4055EE: If (Len(Me.Text1.Text) < 5) Then
loc_4055FE: Me.Text2.Text = "At least 5 characters!"
loc_405606: Exit Sub
loc_405607: End If
loc_40560A: var_94 = "0110617121214051216101106141404110614140411091211100810101608040610121608100416"
loc_405622: var_98 = Me.Text1.Text
loc_40562D: var_A8 = 1 'Variant
loc_405641: For var_108 = 4 To CVar(Len(var_98)): var_C8 = var_108 'Variant
loc_405698: var_90 = CLng((CDbl(var_90) + (CDbl(Asc(Mid$(var_98, CLng(var_C8), 1))) * Val(Mid$(var_94, CLng((var_A8 * 3)), 3)))))
loc_4056C4: If ((var_A8 + 1) >= 39) Then
//论坛说此处反编译错误,应该是var_A8=var_A8+1,If((var_A8)>=39) Then ...
loc_4056CC: var_A8 = 0 'Variant
loc_4056D0: End If
loc_4056D3: Next var_108 'Variant
//第一段:从Name的第四位取起,第n个字符的ASCII和码表的第n组相乘(每三个数一组),累加
loc_4056DE: var_A8 = 1 'Variant
loc_4056F2: For var_168 = 4 To CVar(Len(var_98)): var_C8 = var_168 'Variant
loc_405764: var_1CC = CVar((CDbl((Asc(Mid$(var_98, CLng(var_C8), 1)) * Asc(Mid$(var_98, CLng((var_C8 - 1)), 1)))) * Val(Mid$(var_94, CLng((var_A8 * 2)), 2)))) 'Double
loc_40576C: var_178 = (var_178 + var_1CC) 'Variant
loc_40579D: If ((var_A8 + 1) >= 39) Then
loc_4057A5: var_A8 = 0 'Variant
loc_4057A9: End If
loc_4057AC: Next var_168 'Variant
//第二段:从Name的第4位取起,每个字符的ASCII和前一个字符的ASCII相乘,再乘以码表第n组(每两个数一组),累加求和
loc_405815: If (Me.Text2.Text = LTrim$(Str$(var_90)) & "-" & LTrim$(Str$(var_178))) Then
//判断Serial是否为第一段+'-'+第二段
loc_405824: Me.Command2.Visible = False
loc_405838: Me.Command1.Visible = False
loc_40584C: Me.Command5.Visible = True
loc_405860: Me.Command3.Visible = False
loc_405874: Me.Text2.Visible = False
loc_405888: Me.Frame3.Visible = True
loc_4058BD: Me.Label3.Caption = "Congratulation " & Me.Text1.Text & " !"
loc_4058D5: Else
loc_4058E2: Me.Text2.Text = "Try Again!"
loc_4058EA: End If
反编译出源代码以后就很轻松的可以写出注册机了,不同语言基本上要借助于不同的反编译软件
尝试用IDA反编译,但没能找到目标函数
C.明日计划
CrackMe(14)