全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2251
推到 Plurk!
推到 Facebook!

DLL內容不被他人使用

答題得分者是:skcc
ReLife
一般會員


發表:8
回覆:7
積分:3
註冊:2004-12-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-03-25 09:46:15 IP:118.160.xxx.xxx 訂閱
有個自製的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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-03-26 09:44:49 IP:163.28.xxx.xxx 訂閱
這的確是一個很問題,,
不過如果傳入的參數是一個你自定的structure, 並指定一些無用的值, 或是參數很多..
增加try and error 困難度應該也是個方式吧...
------
FPGA驗證, FPGA開發平台, http://smims.com
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-03-26 14:42:13 IP:61.222.xxx.xxx 訂閱
很多很多方法。

1, DLL 加殼,查不出函數。
2. DLL 函數中檢查 標記。有標記才執行。這個標記可以為 ATOM , FileMApping, .....
3. 故佈疑陣。函數名稱不要容易被解釋。
.....
skcc
中階會員


發表:36
回覆:96
積分:88
註冊:2002-08-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-03-31 14:03:19 IP:218.103.xxx.xxx 訂閱
我覺得最簡單的方法是將要傳入自家製 DLL Function 的值,是先須使用自家編碼的方法,編碼後才傳給 DLL 的 Function, DLL Function 收到後還原才將之還原…至於編碼方法,有簡單的也有複雜的…使用那一種都可以…
ReLife
一般會員


發表:8
回覆:7
積分:3
註冊:2004-12-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-04-08 13:14:25 IP:118.160.xxx.xxx 訂閱

===================引 用 skcc 文 章===================
我覺得最簡單的方法是將要傳入自家製 DLL Function 的值,是先須使用自家編碼的方法,編碼後才傳給 DLL 的 Function, DLL Function 收到後還原才將之還原…至於編碼方法,有簡單的也有複雜的…使用那一種都可以…


有點抽象,可以請大大更詳細說明嗎?
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-04-08 17:03:22 IP:60.251.xxx.xxx 訂閱
我覺得在dll設一個變數預設值為0,其他function執行前先檢查此變數是否為某值才執行.
當然要用時,要先把變數設成某值.
skcc
中階會員


發表:36
回覆:96
積分:88
註冊:2002-08-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-04-09 10:25:32 IP:218.103.xxx.xxx 訂閱
假設有一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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-04-09 10:57:23 IP:218.103.xxx.xxx 訂閱
除此之外,運用不同複雜度的 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-04-13 18:27:41 IP:118.160.xxx.xxx 訂閱

===================引 用 brook 文 章===================
我覺得在dll設一個變數預設值為0,其他function執行前先檢查此變數是否為某值才執行.
當然要用時,要先把變數設成某值.


是的! 這部分小弟有入程式內!

主要目的是希望別人無法從中間插斷

感謝您 : )
系統時間:2024-04-26 4:22:51
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!