160CM-030
1. 爆破
爆破比较简单,搜索关键字符,找到第一个跳转位置00403370 /0F84 E8000000 je cracking.0040345E ,将这行代码nop掉就可以了。
2. 算法分析
用VB Decompiler反编译,找到关键响应事件代码如下:
Private Sub Command1_Click() '4030F0
loc_004031BE: var_28 = password.Text1.Text
loc_004031FC: If 1 <= CInt(Len(var_28)) Then '小于字符串长度时执行
loc_00403206: If 1 > 4 Then
loc_0040320D: End If
loc_00403291: var_800C = Asc(CStr(Mid(2000, 1, 1)))
loc_004032CD: var_38 = var_38 & Chr(Asc(CStr(Mid(var_28, 1, 1))) xor ecx) '字符依次与ecx中的内容异或运算
loc_0040332A: GoTo loc_004031EF
loc_0040332F: End If
loc_00403370: If (var_38 = "qBQSYdXUe_B\V") Then '运算后得到的字符串与"qBQSYdXUe_B\V"要相同
loc_004033CC: var_8014 = MsgBox("Password correct, hehe, :-)", 0, "Valid", var_78, var_88)
loc_0040343D: var_8020 = Global.Unload password
loc_0040345E: Else
loc_004034B4: var_8024 = MsgBox("Password incorrect, please try again ...", 0, "Invalid", var_78, var_88)
loc_004034D8: End If
loc_004034E4: GoTo loc_00403536
loc_00403535: Exit Sub
loc_00403536: ' Referenced from: 004034E4
loc_00403544: GoTo loc_00esi
End Sub
从伪代码来看,基本可以看出是将输入的密码字符串依次进行异或运算,然后得到新的字符串与"qBQSYdXUe_B\V"进行比较。异或运算中有个ecx寄存器中的值从上述伪代码中看不出来源,将“程序分析器和优化”选项取消后,再反汇编,得到如下代码:
从中可以打开猜测ecx为依次取字符串”2000“中的第i个字符的ASCII码值,i>4时再重复。再OD中跟踪一下,可以确认猜测无误。使用vs2015编写VB注册算法程序如下:
Module Module1
Sub Main()
Dim key As String
Dim SN As String
key = "qBQSYdXUe_B\V"
SN = ""
Console.WriteLine("key= " + key)
Dim i As Int32
Dim j As Int32
Dim length As Int32
length = Len(key)
For i = 1 To length
j = i Mod 4
If j = 0 Then j = 4
SN = SN + Chr(Asc(Mid(key, i, 1)) Xor Asc(Mid("2000", j, 1)))
Next
Console.WriteLine("注册码为: " + SN)
Console.WriteLine("按回车键退出程序!")
Console.ReadLine()
End Sub
End Module
运算后得到注册码为CrackTheWorld ,输入程序输入框,验证正确。
3. 总结
这道题难度也不大,借助反编译后的伪代码,可以很容易的得到算法的大框架,具体细节再借助OD跟踪确认后,就能得到完整的算法过程了。
|