線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1335
推到 Plurk!
推到 Facebook!

請問C++Builder 如何防止程式被中文化!!

尚未結案
x8051
一般會員


發表:12
回覆:18
積分:6
註冊:2004-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-17 00:35:30 IP:218.172.xxx.xxx 未訂閱
發現自己寫的程式很容易被人修改內部的文字,而且數位簽章也被修改. C++Builder是否能設定,將全部顯示的文字編碼ㄋ???
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-19 14:07:16 IP:203.73.xxx.xxx 未訂閱
引言: 發現自己寫的程式很容易被人修改內部的文字,而且數位簽章也被修改. C++Builder是否能設定,將全部顯示的文字編碼ㄋ??? < face="Verdana, Arial, Helvetica">
x8051 你好:
(1)據小弟我所知,應該是沒有現成的設定方式,就可以讓你的應用程式具有將
   文字編碼的功能,所以,這部分應該還是必須靠自己做吧!!
(2)我目前最常使用的方式,是先把應用程式所有需要使用到的字串,依照自己
   設計的資料結構,編輯、儲存在某一個文字檔裡面 (例如: string.txt),然
   後利用自己寫的編碼程式,將此檔案編碼,並把編碼完成的結果,另存新檔
   (例如: string.dat)
(3)接著利用以下這篇文章中的做法,另外建立一個新的 Resource DLL,並把以
   上的檔案 string.dat 匯入其中,這樣子就可以在 runtime 被取用了
   http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27605
(4)接著,你要在自己原本的應用程式中,加入解碼的功能 (不需要加入編碼的
   功能),這樣就可以在 runtime 的時候,執行解碼的程序,得到原來的字串
(5)如果以上都已經做到的話,你的應用程式的流程,應該會像以下這個樣子
   應用程式開始執行-->載入 Resource DLL 中的資料至記憶體-->開始解碼-->
   解碼完成-->設定所有 GUI 要顯示的字串-->...
-- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
anpino
版主


發表:31
回覆:477
積分:231
註冊:2003-01-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-19 16:02:22 IP:218.32.xxx.xxx 未訂閱
下面文章可供參考 摘錄自: ==================================== 于破解過招,保護你的共享軟件 ——此文曾作爲連載刊登于《電腦報》 class="code"> function DetectFileMon: Boolean; begin if CreateFile(PChar('\\.\FILEVXD'), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) <> INVALID_HANDLE_VALUE then Result := True //如果有,就Down機! else Result := False; end; 當然,你可以保護得更好一些:可以不采用臨時Dll,而把解密後的關鍵代碼用WriteProcessMemory這個API函數寫入到主可執行文件自己進程被提交(Committed)的內存頁面的指定位置去。這樣由于磁盤上沒有解密後的臨時文件,破解更加困難。事實上,目前世界上最强勁的專業保護軟件Armadillo就是用的這種方法。而且這種方法可以充分防止被調試器Dump。但實現起來比較困難,尤其是在WinNT 5以後的操作系統中。 由于這種方法將注册文件和受限制代碼唯一關聯,爆破手拿到你的軟件也只有乾瞪眼。建議大家都給共享軟件加上功能限制,這樣比時間和次數限制更加安全。 §寫注册機 顧名思義,這種方法就是模仿你的注册碼生成算法或者逆向注册碼驗證算法而寫出來的和你一模一樣的注册機。這玩意威脅極大,被爆破了還可以升級。如果被寫出注册機,呵呵,你的軟件只好免費了。或者你必須更換算法,但以前注册過的合法用戶都得被迫更換注册碼了,累死你!呵呵... 上面的方法雖然可以避免爆破,但注册機的威脅還是存在的。Cracker要寫注册機必須詳細研究你軟件的驗證模塊,這必須先將你的軟件脫殼,再反彙編或者用調試器跟踪。市面上許多加殼和保護軟件都吹噓不可能被脫殼,令人可惜的是到目前爲止沒有一個軟件兌現了它們的諾言。由于CPU最終執行的都是有效指令,所以等你的程序自解壓完成後再從內存中Dump出來就可以實現脫殼。因此不要在殼上面花很多功夫,因爲沒有這個必要。 反彙編是和調試器跟踪也都是不可能防止的,因爲所有的Win32程序都是必須通過API來調用Windows系統中的關鍵Dll的(如Kernel32.dll、GDI32.dll等),然而API是可以Hook的。我們只能從自己的代碼著手來保護我們的勞動果實了。 爲了自己調試和以後維護的方便,我們一般采用有意義的名字給我們的函數命名,可這給了Cracker可乘之機。例如這樣的函數是什麽意思大家應該是一目了然吧?IsRegistered(), IsLicensed(), LicenseVerify(), CheckReg()...這樣Cracker就可以輕鬆地從數千個函數中找到他的目標---你的注册碼效驗函數!而且破解Delphi編寫的軟件還有一件TMG小組的破解利器---DeDe,它可以輕鬆看到你軟件裏的Form、Unit和函數名,還可以反彙編一部分代碼,更是可以和Win32DASM合作反彙編更多的代碼,對Delphi軟件威脅極大。 爲了不給Cracker創造溫馨舒適的破解環境,我們要混亂(Obfuscate)我們的代碼,將軟件中所有的函數名全部替換成隨機生成的函數名。例如Func_3dfsa_fs32zlfv()這個函數是什麽意思?恐怕只有天知道了。網上有現成的代碼混亂器,你按你使用的編程語言的種類可以找到一些。但注意,只有當你要發布軟件時才使用之,而且一定注意備份源代碼。否則當你看不懂你自己的代碼時可別怪我呀!:) 另外一定要使用公開密匙算法保護你的軟件,RSA、DSA和El Gamal之類的算法都可以從網上找到。但注意:將你算法單元中的所有涉及到算法名稱的字符串全部改名。避免被Cracker發現你用的算法而模仿寫出注册機來!你還可以張冠李戴,明明用的DSA,將名字全部替換成RSA,呵呵,讓他模仿去吧!:) 其它算法如對稱算法和Hash算法都也要注意改名,否則這樣: EncryptedCode = Blowfish(MD5(UserName), MD5(Key)); //你的加密算法,使用了Blowfish(對稱算法)和MD5(Hash算法) 雖然我不瞭解Blowfish和MD5算法的原理,也不會逆向它們,但我瞭解你的效驗算法的流程和算法名,我馬上就可以從網上找到類似的Blowfish和MD5算法包,從而模擬你的軟件仿造出注册機,啊?!真是……$&*&($#%@! 如果你用的什麽其它不常見的算法(如Skipjack (NASA美國航天局標準算法), LOKI, 3-WAY, Safer之類不出名但强度很高的算法),幷且全部改名,就讓他們去研究軟件中成堆的如下代碼是什麽加密算法吧!:) 0167:005B9F70 MOV EAX,[EBP-10] 0167:005B9F73 CALL 00404000 0167:005B9F78 PUSH EAX 0167:005B9F79 MOV EAX,[EBP-10] 0167:005B9F7C CALL 004041C4 0167:005B9F81 LEA ECX,[EBP-14] 0167:005B9F84 POP EDX 0167:005B9F85 CALL 004B860C 當然,最好把Hash算法也全部改名,給會給他們製造更多的困難。但注意,MD5和SHA之類的Hash的初始值會被Cracker從內存中找到,這樣他就知道了你用的Hash了。所有建議同時使用MD5的變形算法Ripe-MD(RMD)128或160和其它的Hash,如Tiger, Haval等算法。 另外,請注意要經常效驗你的程序是否被修改(Hash效驗),如果被修改則退出。但請注意,有些病毒會修改進程的句柄表和它指向的內核對象,這樣病毒就可以直接修改運行中的PE文件而感染之了,另外還有網絡傳輸錯誤的問題也會導致軟件CRC出錯。因此請不要認爲可執行文件的CRC不符而此時程序已被脫殼了。 其實,程序被脫殼最明顯的標志是其大小明顯大于脫殼前。1M的PE文件被UPX、ASPack之類的軟件壓縮後通常只有400左右。如果你的軟件在運行中發現自己的大小大于800K,我想你應該知道如何做了吧?呵呵... :) 還有一點,調試器對我們的威脅很大,我們不會肯定讓Cracker們舒舒服服地使用SoftICE、TRW和OllyDbg來調試我們的程序。除了常用的MeItICE方法外,這裏我給一個我寫的方法: { 檢查自己的進程的父進程是否爲Explorer.exe,否則是被調試器加載了 } { 不過注意,控制臺程序的父進程在WinNT下是Cmd.exe哦!} { 注意加載TlHelp32.pas單元 }
  procedure CheckParentProc;
  var //檢查自己的進程的父進程
    Pn: TProcesseNtry32;
    sHandle: THandle;
    H, ExplProc, ParentProc: Hwnd;
    Found: Boolean;
    Buffer: array[0..1023] of Char;
    Path: string;
    begin
      H := 0;
      ExplProc := 0;
      ParentProc := 0;
      //得到Windows的目錄
      SetString(Path,
                Buffer,
                GetWindowsDirectory(Buffer, Sizeof(Buffer) - 1));
      Path := UpperCase(Path)   '\EXPLORER.EXE'; //得到Explorer的路徑
      //得到所有進程的列表快照
      sHandle := CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0);
      Found := Process32First(sHandle, Pn); //查找進程
      while Found do //遍曆所有進程
      begin
        if Pn.szExeFile = ParamStr(0) then //自己的進程
        begin
          ParentProc := Pn.th32ParentProcessID; //得到父進程的進程ID
          //父進程的句柄
          H := OpenProcess(PROCESS_ALL_ACCESS, True, Pn.th32ParentProcessID);
        end
        else if UpperCase(Pn.szExeFile) = Path then
          ExplProc := Pn.th32ProcessID;      //Explorer的PID
        Found := Process32Next(sHandle, Pn); //查找下一個
      end;
      //嗯,父進程不是Explorer,是調試器……
      if ParentProc <> ExplProc then
      begin
        TerminateProcess(H, 0); //殺之!除之而後快耶! :)
        //你還可以加上其它什麽死機代碼來消遣消遣這位可愛的Cracker :)
      end;
    end;
你可以在Delphi或者VC中試試,呵呵,是不是把Delphi和VC殺掉了,因爲你現在用的是Delphi和VC的內置調試器來運行你的程序的,當然它會六親不認了,呵呵!調試的時候你還是把它注釋掉吧,發布時別忘記激活喲! 最後一個問題,這也是一個非常重要的問題:保護你的字符串!!!字符串在注册模塊中非常重要!當一個富有經驗的Cracker破解你的軟件時,首先做的就是攝取你的字符串。比如他會輸入錯誤的注册碼,得到你關于錯誤注册碼的提示,通常是“無效的注册碼,請重新輸入!”或者“Invalid key, please input again!”等等,然後用OllyDbg下斷點調試或者用WinDASM、IDA Pro等靜態分析工具在被他脫殼後的程序中查找那個字符串,找到後進行分析。因此,請一定加密你的字符串!!!一定!!! 使用時再臨時解密出來,而且要儘量少使用消息提示框 ,避免被Cracker找到漏洞。加密字符串不需要太複雜的算法,隨便找一個快速的對稱算法就可以了。 最後提醒你一句,不要在加密上花太多的功夫!你應該把更多的時間和精力都用來完善你的軟件,這樣會更合算。借用一位前輩的話來忠告大家吧:花點時間考慮你自己的軟件,看看它是否值得保護?如果沒人用你的軟件,保護也就沒有意義了,不要過高估計你的軟件“對世界的重要性”! ------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗:D ------------------------------- 發表人 - anpino 於 2004/04/19 16:05:58
x8051
一般會員


發表:12
回覆:18
積分:6
註冊:2004-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-19 18:43:00 IP:218.172.xxx.xxx 未訂閱
感謝RaynorPao,anpino 2位大大說明!!!< >< >
系統時間:2024-07-02 1:37:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!