DLL內容不被他人使用 |
答題得分者是:skcc
|
ReLife
一般會員 發表:8 回覆:7 積分:3 註冊:2004-12-07 發送簡訊給我 |
有個自製的DLL不希望被引用,請問有什麼方法呢?
目前知道的是增加一個GUID (類似識別碼 or 密碼) 或是分層管理(程式沒經過客戶應用層就直接進入工程應用層就當掉) 請問還有其他方法嗎? /的方式 http://delphi.ktop.com.tw/board.php?cid=168&fid=923&tid=65515編輯記錄
ReLife 重新編輯於 2009-03-25 16:56:05, 註解 無‧
|
ikk
尊榮會員 發表:4 回覆:413 積分:768 註冊:2003-06-30 發送簡訊給我 |
|
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
|
skcc
中階會員 發表:36 回覆:96 積分:88 註冊:2002-08-28 發送簡訊給我 |
|
ReLife
一般會員 發表:8 回覆:7 積分:3 註冊:2004-12-07 發送簡訊給我 |
|
brook
資深會員 發表:57 回覆:323 積分:371 註冊:2002-07-12 發送簡訊給我 |
|
skcc
中階會員 發表:36 回覆:96 積分:88 註冊:2002-08-28 發送簡訊給我 |
假設有一DLL名為 A.DLL
需要呼叫使用的函式 void ProcessSomething( int i_val ) 在 A.DLL int Decrpt( int i_decrpt ) { return( i_decrpt >> 1 ); //請改成你自己的 decrpt 方法。 } void ProcessSomething( int i_val ) { int i_Decrpt = Decrpt( i_val); ... .. } 在你的 Form Unit.Cpp,假設是在 Button Click 來呼叫 A.DLL 的 ProcessSomething 函式: //header typedef void __declspec(dllimport) ProcessSomething_Type( int ); //cpp int TForm1::Encrpt( int i_encrpt ) { return( i_encrpt << 1 );//請改成你自己的 encrpt 方法。 } void __fastcall TForm1::Button1Click(TObject *Sender) { HINSTANCE Dll = NULL; Dll = LoadLibrary("A.DLL"); ProcessSomething_Type *ProcessSomething_Func; if( Dll ) { ProcessSomething_Func = (ProcessSomething_Type *)GetProcAddress(Dll, "_ProcessSomething"); if ( ProcessSomething_Func ) ProcessSomething_Func( Encrpt(1000) ); //假設 1000 為要處理的 data FreeLibrary(Dll); } } 這樣即使其他人得到 A.DLL 檔案,如果沒有你自訂的 encrpt 方法來傳入 parameters 也不能正確使用,當然再加上古怪編號的函式名稱,對方就更加難以使用。 Anthony Lee ===================引 用 ReLife 文 章=================== ===================引 用 skcc 文 章=================== 我覺得最簡單的方法是將要傳入自家製 DLL Function 的值,是先須使用自家編碼的方法,編碼後才傳給 DLL 的 Function, DLL Function 收到後還原才將之還原…至於編碼方法,有簡單的也有複雜的…使用那一種都可以… 有點抽象,可以請大大更詳細說明嗎?
編輯記錄
skcc 重新編輯於 2009-04-09 10:27:21, 註解 無‧
|
skcc
中階會員 發表:36 回覆:96 積分:88 註冊:2002-08-28 發送簡訊給我 |
除此之外,運用不同複雜度的 encrption 和 decrption 方法也可增加對方不合法地使用你的 DLL 難度。以上例來說,如果 DLL 的 ProcessingSomething 函式是要傳入的是 AnsiString,那麼可以改寫成以下:
//A.DLL AnsiString Decrpt( AnsiStrng src_str ) { AnsiString KEY = "y9563rihd13529087ad1s3t"; //隨你喜歡… int KEY_len = KEY.Length(); char *temp, *k_str; AnsiString Result, t_str; temp = (char*) src_str.data(); k_str = (char*) KEY.data(); int decrypt_val; for(int i=0; i< strlen(temp); i=i 3) { t_str = temp[i]; t_str =temp[i 1]; t_str =temp[i 2]; decrypt_val = k_str[(i/3)%KEY_len] ^ t_str.ToInt(); char ch; ch = (char)decrypt_val; Result = ch; } return( Result ); } //cpp AnsiString TForm1::Encrpt( AnsiStrng src_str ) { AnsiString KEY = "y9563rihd13529087ad1s3t"; //要與 DLL 中的 Decrpt 內容一致。 AnsiString Result; int KEY_len = KEY.Length(); char *temp, *k_str; int encrypt_val; temp = (char* )src_str.data(); k_str = (char* )KEY.data(); char tmpbuffer[10]; for(int i=0; i encrypt_val = k_str[i%KEY_len] ^ temp[i]; sprintf( tmpbuffer,"d",encrypt_val); Result = tmpbuffer; } return( Result); } 其他 Encrption 方法都可以在 Internet 中找到。應該很容易就可以套用於你的程式中。 Anthony Lee |
ReLife
一般會員 發表:8 回覆:7 積分:3 註冊:2004-12-07 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |