偷懶了很久也是時候要繼續開始學習了。
環境:
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