PowerBuilder程序暴力破解實例(PBD文件編輯法)

go google search more...
[工具]:PBKiller,UltraEdit
[破解對象]:直銷業績管理系統V5.0

PowerBuilder的僞碼編譯同VB僞碼編譯一樣,同樣是PB動態庫解釋僞碼執行,僞碼放在以PBD爲後綴的文件中。對付它的利器就是PBKiller,利用它幾乎可以反編譯出和源代碼相同的語句,連我這個沒學PB的人也看得很清楚。
直銷業績管理系統V5.0有30天的試用期,過期就不能運行。用PBKiller反編譯dot.pbd後找到其註冊代碼(w_wrcode-controls-cb_1-events-clicked):
string ls_code
integer li_rn

ls_code = trim(parent.em_1.text) + trim(parent.em_2.text) + trim(parent.em_3.text) + trim(parent.em_4.text)
if len(ls_code) <> 16 then
 messagebox("提示","註冊碼長度必須16位")
end if
li_rn = f_checkregcode(ls_code)
if li_rn = 0 then
 f_setreg("9",f_encode(ls_code))
 f_setreg("3",f_encode("89"))
 messagebox("提示","註冊成功,請重新進入系統!")
 halt close
else
 messagebox("提示","註冊碼錯誤!")
end if
return
代碼很好懂,屬重啓校驗型,註冊算法是f_checkregcode函數。這裏就不貼出代碼了,其基本思路是先取C盤的8位序列號,再對註冊碼進行算法轉換得到8位字符串與前面所取得的序列號進行比較。由於不是明碼比較,註冊算法中的16位到8位的轉換要找出其逆算法也不容易。因此我就考慮暴破的方法,即修改PBD文件,但網上這方面的資料很少,只能自己摸索了。
首先找到其重啓校驗代碼(dotnew-Events-open):
rt_chk_value = myreg.f_check_reg()
if rt_chk_value = -100 then
 messagebox("提示","系統時間有誤!")
 halt close
end if
if rt_chk_value = -200 then
 messagebox("提示","註冊碼有誤!")
 halt close
end if
if rt_chk_value = -300 then
 messagebox("提示","試用期到,請註冊!電話:xxxx網址:
xxxxx")
 open(w_wrcode)
 return
end if
if rt_chk_value = -400 then
 messagebox("提示","系統破壞,請聯繫開發商!")
 return
end if

來至f_check_reg:
ls_right = f_encode(f_redreg("0"))
ls_wrong = f_encode(f_redreg("1"))
if ls_right <> "wright" or ls_wrong <> "wrong" then
 return -400
end if
ls_regflag = f_redreg("3")
....
後面還有就不貼了。其中的f_encode(f_redreg(""))可根據不同的參數在註冊表的不同項中讀取出加密過的字符串並進行解密,之後進行校驗,返回值爲-100、-200、-300、-400其中一個的話程序就會報錯退出。

至此,程序加密部分算法基本分析完畢,現在就要找出暴破點。我選擇的是f_check_reg,即想辦法讓其所有返回值都爲100(經分析,返回100表明是註冊版)。難就難在PBKiller雖然能反編譯出源代碼,卻不能編輯它。注意到其中的-100、-200等數字,轉換爲十六制後就是FF9C、FF38,考慮到存儲時的高低位互換特性,因此實際存儲的十六進制代碼應爲9CFFFFFF、38FFFFFF(PB中是這樣的,花費了我好一會時間才摸索出規律),OK,用UltraEdit打開PBD文件,搜索十六進制9CFFFFFF,結果會有很多,注意到地f_check_reg中有代碼段:
 if check_result = 0 then
  return 200
 else
  return -200
 end if
說明200和-200相離很近,因此選擇搜索-200的十六進制表示(搜索200也可以),並且每搜索到一個就向上看,找找附近有沒有C800(200的十六進制表示),這樣用不了多久就能確定其位置了,在其附近還能找到100、-300、-400等的十六進制表示,用UltraEdit將找到的-100、-200、-300、-400十六進制表示全部改爲100的十六進制表示。存盤退出,將系統時間延後兩個月,程序正常運行。

小結:PBD文件經過反編譯後能看到其源代碼,結合彙編知識,理論上應該能利用UltraEdit找出每一句代碼及數據對應的地址並進行修改。但確實比較繁瑣,其實PBKiller自帶了一個PBL閱讀器,能比較好的區分PBD的相應函數、窗口代碼段,再在其中利用本文介紹的方法應該能更快的確定要修改的代碼段。可惜的是我水平實在有限,也沒那麼時間去研究PB僞代碼中跳轉、判斷的對應十六進制代碼及其修改方法,希望有高手能總結出來。好累,到此爲止了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章