170604 逆向-CrackMe之013

来源:互联网 发布:安卓手机数据迁移软件 编辑:程序博客网 时间:2024/06/08 01:41

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)

原创粉丝点击