偷懒了很久也是时候要继续开始学习了。
环境:
windows xp sp3
工具:
VB Decompiler v8.3
这次是个vb文件,所以尝试一下用这个的感觉。
打开文件之后发现有两个CrackMe选择,分别是1.0版本和2.0版本。
打开vb decompiler,载入badboy,
在Forms的Form1里头,几乎有所有的控件的属性,找到Caption为“try”的commandbutton,然后记下它的标号,分别是2,4
然后跑到code,在form1里面找到command2和command4的click事件。
因为1.0版本的CrackMe只有一个输入框,那就可以猜测Command4是1.0的try,因为已经有代码了,照着看就好了。
发现要和Label3的caption相同才行,那么Label3的caption是如何来的呢?
把From1里头的事件都找一遍,最后在Combol的click中找到了Label3,然后上面有一长串的计算公式,就不难猜测上面公式的计算结果就是Label3的capton内容了。
公式内容是:
CStr((((CLng(Day(Now) * Day(23) + Month(Now) * Month(2) + Year(Now) * Year(3)) + CLng((((Day(Now) * Day(23)) + (Month(Now) * Month(2))) + (Year(Now) * Year(3)))))
+ CLng((Day(14) * Year(2020)))) + CLng((Day(14) * Year(2020)))))
根据这串公式就可以得出CrackMe 1,0的输入内容了。
Day(Now)是指今天的号数,Month(Now)是今天的月份,Year(Now)则是今年的年份了
Day(23) 则是 22, Moth(3)则是1,Year(3)是1900,Day(14)是13,Year(2020)是1905
然后就可以写出CrackMe1.0注册机了。
现在来看看CrackMe 2.0的command2的click事件。
首先看到的是一个长度判断,输入的Name长度不能小于5
然后有一个很长的字符串:
var_94 = "0110617121214051216101106141404110614140411091211100810101608040610121608100416"
var_98 = Text1.text 这个就是保存输入的name
紧接着就是2个for循环,其中:
Mid()函数在我理解中是:Mid(char * s, int begin,int length),即从s[begin-1]的位置开始,数到s[begin-1+length],将这个范围里的数字转为数字。
如:Mid(var_94,CLng(var_A8*3),3),假设var_A8 = 4吧,然后找到var_94[11]的位置,然后数3个数字,所以函数返回结果是:1405
val()函数就是将string类型转为double型
Asc()函数则是计算字母的ascii值
最后面是一个比较,比较的内容是输入的serial 和两个for得出的结果的对比,相同则显示成功。
在写注册机的时候需要注意的是,有些变量是突然间跑出来的,可以假设它之前为0,还有个问题是var_A8有一个var_A8+1判断是否大于等于39,但是显然找不到改变var_A8的值的地方,或许是工具反编译的时候有问题,但是仍然可以猜想var_A8的改变情况,拿第一个for循环来讲:或许是var_A8++,也可能是var_A8 *= 3,那么当它大于等于39的时候,它就会变成0,然后它将会一直为0,可以两种方法都测试一下,会发现都得不到正确serial,那么就有可能是在 if(var_A8+1)>=39 then 这里的判断多了,把“+1”去掉,在这个判断前面加上var_A8++,就能得到正确的serial