作者:莊曉立(liigo)
日期:2011-4-8
原創連結:http://blog.csdn.net/liigo/archive/2011/04/08/6310677.aspx
轉換請註明出處:http://blog.csdn.net/liigo
天樂軟體加密狗(JDProtect),貌似幾年前的軟體,也很久沒人更新了,這個暫且不管。本文並非推薦軟體,而是介紹軟體用法。本人(liigo)也不對此軟體的品質和使用效果做任何評價,因為我也不甚瞭解。
JDProtect本質上是一個加殼軟體,同時又跟硬體加密狗用法比較相似,據說是一款結合了加殼和硬體加密狗雙重優勢的軟體。其作者在文檔中介紹說:
普通的加殼軟體實際上是給主程式穿了一件衣服,這件衣服(即外殼)跟主程式之間沒有任何邏輯上的聯絡,加殼後的程式運行時,先運行外殼,由外殼完成反跟蹤及還原主程式等任務,等任務完成後,再跳到原主程式入口,到此,外殼便失去了它存在的價值,而且由於外殼對於主程式而言是不具有依賴性的(即主程式不會再去訪問外殼,實際上主程式根本不知道外殼的存在),因此可以進行脫殼操作,使脫殼下來的程式依然可用。<br /> JDProtect軟體狗的思路正是基於對上述加殼軟體弱點的認識,提出了殼即是狗,狗即是殼的概念,通過技術手段把外殼和主程式有機地結合起來,使外殼成為主程式不可缺少的有血有肉的一部分,加殼後的程式運行時,仍然先運行外殼,由外殼完成反跟蹤及還原主程式等任務,等任務完成後,再跳到原主程式入口,但到此,外殼仍然不可丟棄,因為主程式隨時都可以通過訪問狗中資源的方式訪問外殼,檢查外殼的真實性。如果進行脫殼操作,即相當於拿掉了狗,使脫殼下來的程式成為一個不完整的程式,無法運行。
JDProtect軟體給使用者提供一個.lib檔案、必要的標頭檔(C/C++的.h,彙編的.inc),和一個加殼加密加狗處理主程式(以下稱為加狗程式)。其使用流程是,使用者在自己的軟體中調用.lib中的介面函數(進行必要的檢測/核對),編譯產生EXE後交給加狗程式處理產生新的EXE,後者即可對外發布了。加狗操作時可以指定使用者ID、使用者INFO、四個暗碼(DWORD),還可以定義一個使用偽彙編編寫的自訂演算法(有諸多限制),使用者通過介面函數操作以上資料和演算法。
.h裡的介面函數:
extern "C" DWORD __stdcall GetHardID(DWORD InParam);<br />extern "C" DWORD __stdcall GetUserID();<br />extern "C" VOID __stdcall GetUserInfo(LPTSTR lpBuff);<br />extern "C" DWORD __stdcall GetSeedCode(DWORD InParam);<br />extern "C" DWORD __stdcall GetMyCode(DWORD InParam);<br />extern "C" DWORD __stdcall GetSecretCode(int num);
它的.lib檔案是一個空殼匯入庫檔案,並沒有實質功能代碼,可能只是充當一個預留位置,實質的加殼加密保護代碼,是在後來加狗程式處理EXE時加進去的。作者提供了組合語言的標頭檔.inc和C/C++的.h,並附有VC++6.0調用樣本,說明這個JDProtect是主要針對彙編、C/C++使用者服務的。作者還在文檔中期望Delphi、C++ Builder、VB也能使用JDProtect,並希望有使用者協助編寫常式。我(liigo)個人對此表示懷疑,因為.lib並不是一個被多種程式設計語言普遍支援的一項技術(DLL才是)。
易語言可以調用.lib。能被VC++調用的lib,易語言自然也不在話下。在易語言中調用.lib,只需準確填寫好函式宣告,除了需要填寫基本的傳回值類型、參數類型、所在lib檔案外,最關鍵的是填寫函數在.lib內的符號名稱。怎麼知道符號名稱呢?一個方法是憑經驗推斷:stdcall的函數Func,其符號名稱應該是_Func@n,其中n是函數參數入棧位元組數(通常是4的倍數),例如上面GetHardID函數的符號就是_GetHardID@4;cdecl的函數Func的符號名稱應該是_Func。更準確的方法是去.lib內部查詢到底是什麼符號,可以用VC++內建的dumpbin.exe這個小軟體,命令列:dumpbin /all tlzj.lib > tlzj.txt,將tlzj.lib資訊輸出到tlzj.txt文字檔中,結果大致如:
有了具體的符號名稱,在易語言中聲明調用lib中的函數就很簡單了,跟聲明調用DLL如出一轍(符號名稱填寫到“在庫中對應命令名”一欄):
現在你知道為什麼我用“填寫”這個詞了吧?在易語言中是以填寫表格的形式聲明和定義函數(如)。易語言預設以stdcall呼叫慣例調用lib/dll內的函數;如果被調用的函數是cdecl,可在中的“在庫中對應命令名”一欄最前面添加字元@,以告知易語言以cdecl呼叫慣例調用該函數。另外多說一句,對於.lib中不是以“extern "C"”匯出的C++函數,其符號名稱通常怪異如“?vc_time2@@YAHXZ”(參見C++名稱修飾(Name mangling)),易語言也同樣支援調用它——只要你把符號名稱填對了就行。易語言對.LIB和.DLL的調用支援是比較完善的。
為了簡化使用,我(liigo)為JDProtect開發了易語言調用模組“天樂軟體狗(JDProtect)模組.ec”,易語言的普通使用者不用任何技術前提,就可以很方便的調用JDProtect提供的開發介面了。下面是我(liigo)對此模組及其常式編寫的簡單的使用文檔:
' 使用方法步驟:<br />' 1、靜態編譯產生EXE (此程式不支援非靜態編譯,也不支援在IDE中調試運行)<br />' 2、運行JDProtect.exe,選擇剛才產生的EXE,輸入各個參數,點擊“加狗”按鈕<br />' 3、加狗操作後的EXE就可以正常運行了<br />' 4、加狗後會自動產生與EXE檔案名稱一樣、尾碼為.dog的設定檔,雙擊它可查看或修改加狗參數<br />' 模組和常式作者:liigo,http://blog.csdn.net/liigo,QQ:175199125<br />
下載:JDProtect_0.90e,含易語言開發模組及其源碼和常式 ——因為添加了易語言的內容,我(liigo)私自修改版本號碼為0.90e(原版本號碼是0.90b),在此向作者說抱歉啦。
全文完,謝謝收看。