⑴ 如何對一個lib靜態庫保護起來不被反編譯
這個太麻煩了吧,除非他反編譯成匯編,讀懂全部匯編語言,然後用c去實現。逆向工程量太大。我們做一般是加花指令,迷宮函數來混淆代碼。
⑵ 後綴名為lib的庫是什麼庫 打開後是封裝,但怎樣安裝使用啊 急~~~啊
後綴名是lib的庫在99se裡面可以是原理圖的元件庫,也可以是PCB的封裝庫,你說打開後是封裝,那就是PCB的封裝庫了。
使用很簡單,不需要安裝,而是需要載入,操作步驟是:
1)在PCB編輯環境下,選擇左邊的設計管理器為Browse
PCB
2)在最上面的下拉菜單裡面選擇
Libraries
3)選擇下面的按鈕
Add/Remove
按鈕
4)在打開的對話框裡面,找到你存放你說的庫文件的位置,選中庫(注意是雙擊那個庫文件),當看到下方的列表裡有這個文件了,就表示載入進來了。
5)回到PCB圖紙上,正常使用庫文件了。
⑶ 查了很多資料,關於lib的說法,看到說動態lib庫只有dll的一些說明文件,但是之前看到一些資料說可以把dll
第一步,我先從簡單的調用出發,定義了一個簡單的函數,該函數僅僅實現一個整數加法求和:
LIBEXPORT_API int mySum(int a,int b){ return a+b;}
C# 導入定義:
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern int mySum (int a,int b);
}
在C#中調用測試:
int iSum = RefComm.mySum(,);
運行查看結果iSum為5,調用正確。第一步試驗完成,說明在C#中能夠調用自定義的動態鏈接庫函數。
第二步,我定義了字元串操作的函數(簡單起見,還是採用前面的函數名),返回結果為字元串:
LIBEXPORT_API char *mySum(char *a,char *b){sprintf(b,"%s",a); return a;}
C# 導入定義:
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, string b);
}
在C#中調用測試:
string strDest="";
string strTmp= RefComm.mySum("45", strDest);
運行查看結果 strTmp 為"45",但是strDest為空。我修改動態鏈接庫實現,返回結果為串b:
LIBEXPORT_API char *mySum(char *a,char *b){sprintf(b,"%s",a) return b;}
修改 C# 導入定義,將串b修改為ref方式:
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, ref string b);
}
在C#中再調用測試:
string strDest="";
string strTmp= RefComm.mySum("45", ref strDest);
運行查看結果 strTmp 和 strDest 均不對,含不可見字元。再修改 C# 導入定義,將CharSet從Auto修改為Ansi:
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, string b);
}
在C#中再調用測試:
string strDest="";
string strTmp= RefComm. mySum("45", ref strDest);
運行查看結果 strTmp 為"45",但是串 strDest 沒有賦值。第二步實現函數返回串,但是在函數出口參數中沒能進行輸出。再次修改 C# 導入定義,將串b修改為引用(ref):
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, ref string b);
}
運行時調用失敗,不能繼續執行。
第三步,修改動態鏈接庫實現,將b修改為雙重指針:
LIBEXPORT_API char *mySum(char *a,char **b){sprintf((*b),"%s",a); return *b;}
C#導入定義:
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, ref string b);
}
在C#中調用測試:
string strDest="";
string strTmp= RefComm. mySum("45", ref strDest);
運行查看結果 strTmp 和 strDest 均為"45",調用正確。第三步實現了函數出口參數正確輸出結果。
第四步,修改動態鏈接庫實現,實現整數參數的輸出:
LIBEXPORT_API int mySum(int a,int b,int *c){ *c=a+b; return *c;}
C#導入的定義:
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern int mySum (int a, int b,ref int c);
}
在C#中調用測試:
int c=0;
int iSum= RefComm. mySum(,, ref c);
運行查看結果iSum 和c均為5,調用正確。
經過以上幾個步驟的試驗,基本掌握了如何定義動態庫函數以及如何在 C# 定義導入,有此基礎,很快我實現了變長加密函數在 C# 中的調用,至此目標實現。
三、結論
在 C# 中調用 C++ 編寫的動態鏈接庫函數,如果需要出口參數輸出,則需要使用指針,對於字元串,則需要使用雙重指針,對於 C# 的導入定義,則需要使用引用(ref)定義。
對於函數返回值,C# 導入定義和 C++ 動態庫函數聲明定義需要保持一致,否則會出現函數調用失敗。定義導入時,一定注意 CharSet 和 CallingConvention 參數,否則導致調用失敗或結果異常。運行時,動態鏈接庫放在 C# 程序的目錄下即可,我這里是一個 C# 的動態鏈接庫,兩個動態鏈接庫就在同一個目錄下運行。
⑷ 靜態庫和動態庫的區別,lib文件和dll文件的配置方法
一、靜態鏈接庫與動態鏈接庫區別:
靜態鏈接庫與動態鏈接庫都是共享代碼的方式,如果採用靜態鏈接庫,則無論你願不願意,lib 中的指令都全部被直接包含在最終生成的 EXE 文件中了。但是若使用 DLL,該 DLL 不必被包含在最終 EXE 文件中,EXE 文件執行時可以「動態」地引用和卸載這個與 EXE 獨立的 DLL 文件。靜態鏈接庫和動態鏈接庫的另外一個區別在於靜態鏈接庫中不能再包含其他的動態鏈接庫或者靜態庫,而在動態鏈接庫中還可以再包含其他的動態或靜態鏈接庫。動態庫就是在需要調用其中的函數時,根據函數映射表找到該函數然後調入堆棧執行。如果在當前工程中有多處對dll文件中同一個函數的調用,那麼執行時,這個函數只會留下一份拷貝。但是如果有多處對lib文件中同一個函數的調用,那麼執行時,該函數將在當前程序的執行空間里留下多份拷貝,而且是一處調用就產生一份拷貝。
二、.lib文件如何配置
方法一:
「#pragma comment(lib, 「*.lib」) 」語句。
方法二:
選擇「項目」 - 「屬性」 - 「配置屬性」 - 「鏈接器」 - 「輸入」 - 「附加依賴項」
2、添加lib目錄的方法有以下幾種
方法一:把.lib文件放在當前使用它的工程目錄下;(如:.exe所在目錄,或者工程代碼所在的目錄)
方法二:在vs中,還可以通過當前工程的[菜單]「工具」-》「項目和解決方案」-》「VC++目錄」-》「庫文件」,這種方式來指定.lib文件的目錄。
方法三:放在開發環境IDE的lib庫目錄下,例如:「C:\Program Files\Microsoft Visual Studio 8\VC\lib」,這是vs2005的vc開發的lib庫目錄。
方法四:在vs中,「項目」-》「屬性」-》「配置屬性」-》「鏈接器」-》「常規」-》「附加庫目錄」
三、.dll文件的存放位置
當應用程序運行時,系統將為它分配一個4GB(因為大多數機器是32位的機器,所以其內存的計算方法為:2^32 byte = 2^22 KB = 2^12 MB = 2^2 GB = 4 GB)的地址空間,然後載入模塊會分析該應用程序的輸入信息,從中找到該程序將要訪問的動態鏈接庫信息,然後在用戶機器上搜索這些動態鏈接庫,進而載入它們。
⑸ stm32f107怎樣用.lib的加密庫
在項目文件夾裡面添加文件時就可以選擇lib文件了。如果要生成lib,在項目選項里output頁面勾選create library,然後編譯就可以生成了。一般製作了lib,你就不需要提供源代碼,就已經達到了保密的目的了。
⑹ Lib實現的流數據加密,Python怎麼解密
hashlib是python專門用來加密解密的庫,有md5, sha1, sha224, sha256, sha384, sha512。
Python的hashlib提供了常見的摘要演算法,如MD5,SHA1等等。
什麼是摘要演算法呢?摘要演算法又稱哈希演算法、散列演算法。它通過一個函數,把任意長度的數據轉換為一個長度固定的數據串(通常用16進制的字元串表示)。
函數
用於計算用戶名和密碼相加得到的加密值。
def calc_md5(username, password):
md5 = hashlib.md5()
str_dd = username + password
md5.update(str_dd.encode('utf-8')) return md5.hexdigest()12345
測試源碼
# coding = utf-8##################################################### coding by 劉雲飛####################################################import hashlib
test_string = '123456'md5 = hashlib.md5()
md5.update(test_string.encode('utf-8'))
md5_encode = md5.hexdigest()
print(md5_encode)
sha1 = hashlib.sha1()
sha1.update(test_string.encode('utf-8'))
sha1_encode = sha1.hexdigest()
print(sha1_encode)123456789101112131415161718
輸出結果為