自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

開發(fā)筆記:如何對(duì)【動(dòng)態(tài)鏈接庫(kù)】文件進(jìn)行加密保護(hù)?

系統(tǒng) Linux
因?yàn)槟壳拔抑辉赪indows平臺(tái)上有這個(gè)需求,這個(gè)方法相當(dāng)于重寫了一套動(dòng)態(tài)庫(kù)加載函數(shù)。那么,在Linux系統(tǒng)上如果也存在類似的需求,是否也有類似的:從內(nèi)存緩沖區(qū)加載動(dòng)態(tài)庫(kù)的實(shí)現(xiàn)?

問題描述

昨天,因產(chǎn)品需求,需要在Windows操作系統(tǒng)下寫一個(gè)小工具。

這個(gè)小工具中調(diào)用一個(gè)比較重要的DLL動(dòng)態(tài)庫(kù)文件,來完成一些重要的功能。

一般來說,最直接的做法就是調(diào)用Win32 API函數(shù),來動(dòng)態(tài)的加載、獲取函數(shù)地址、釋放:

  • LoadLibrary(...);
  • GetProcAddress(...);
  • FreeLibrary(...);

但是,由于這個(gè)動(dòng)態(tài)庫(kù)比較重要,如果直接把DLL文件放在文件目錄中,就增加了文件被反編譯的風(fēng)險(xiǎn)。

也就是說為了提高DLL文件的安全性,最好不要讓用戶看到/拿到文件;

即使拿到了文件,也不要讓用戶很容易的破解文件。

問題解決

關(guān)于分析過程就不多說了,這里直接給出目前的處理方式:

1.寫一個(gè)小工具軟件,對(duì) DLL 文件進(jìn)行加密

使用了AES對(duì)稱加密算法,主要是為了管理秘鑰簡(jiǎn)單。

圖片

加密后的文件liba_enc.png與可執(zhí)行文件放在一起。

此時(shí),如果用戶獲取到了這個(gè)動(dòng)態(tài)庫(kù),由于沒有秘鑰,理論上是無(wú)法解開這個(gè)文件的。

不過,道高一尺魔高一丈。。。

2.修改應(yīng)用程序,對(duì)加密的 DLL 文件進(jìn)行解密

這個(gè)動(dòng)態(tài)庫(kù)最終肯定是要被加載到應(yīng)用程序的內(nèi)存空間中被使用的,因此在被加載之前,需要被使用者(也就是應(yīng)用程序)解密。

那么,應(yīng)該解密到哪里呢?

用來加載動(dòng)態(tài)庫(kù)的API?函數(shù)LoadLibrary(),需要的參數(shù)是文件的路徑。

也就是說:必須要把一個(gè)動(dòng)態(tài)庫(kù)文件的路徑傳遞給該函數(shù),才可以被正確的加載到內(nèi)存中。

假如是在Linux?系統(tǒng)中,可以解壓到/tmp臨時(shí)文件系統(tǒng)中。

在動(dòng)態(tài)庫(kù)使用期間文件一直存在;一旦使用結(jié)束就立刻刪除掉。

但是在Windows系統(tǒng)中沒有臨時(shí)文件系統(tǒng)之說。

即使存在類似的臨時(shí)文件空間,即使該DLL文件的使用周期非常短,仍然存在暴露給用戶的可能性。

只要用戶有機(jī)會(huì)能夠看到這個(gè)解密后的文件,就有方法把它dump出來,然后進(jìn)行反編譯...

圖片

3.把加密的 DLL 文件解密到內(nèi)存緩沖區(qū)中

目前,能想到的最好的方法就是:先把加密的DLL?文件解壓到一塊空閑的內(nèi)存緩沖區(qū)中(比如:從堆空間中malloc出來的一塊空間),然后再按照動(dòng)態(tài)庫(kù)的加載流程從這塊緩沖區(qū)中讀取字節(jié)流,加載到動(dòng)態(tài)庫(kù)所屬的代碼空間中。

剛才說過,LoadLibrary(...)函數(shù)只能接受文件路徑作為參數(shù),我們不能把緩沖區(qū)的首地址傳給它,因此需要使用其它方式來加載。

剛好,在github?上看到這樣一個(gè)開源C代碼:

圖片

圖中描述的功能正是我所需要的,簡(jiǎn)直是量身定做:

  • 先把 DLL 文件讀取到一個(gè)緩沖區(qū)中;
  • 再?gòu)木彌_區(qū)中加載動(dòng)態(tài)庫(kù)的內(nèi)容;

只需要一個(gè)頭文件MemoryModule.h?和一個(gè)C?文件:MemoryModule.c,提供的函數(shù)也足夠簡(jiǎn)單:

HMEMORYMODULE MemoryLoadLibrary(const void *, size_t);

FARPROC MemoryGetProcAddress(HMEMORYMODULE, LPCSTR);

void MemoryFreeLibrary(HMEMORYMODULE);

與Win32?提供的3個(gè)函數(shù)在語(yǔ)義上是對(duì)應(yīng)的,唯一的區(qū)別是加載函數(shù)傳入的參數(shù)是:緩沖區(qū)的地址和長(zhǎng)度。

經(jīng)過測(cè)試證明:這個(gè)方法工作的很好,很完美的解決了我的問題!

4. Linux 操作系統(tǒng)怎么辦?

因?yàn)槟壳拔抑辉赪indows平臺(tái)上有這個(gè)需求,這個(gè)方法相當(dāng)于重寫了一套動(dòng)態(tài)庫(kù)加載函數(shù)。

那么,在Linux系統(tǒng)上如果也存在類似的需求,是否也有類似的:從內(nèi)存緩沖區(qū)加載動(dòng)態(tài)庫(kù)的實(shí)現(xiàn)?

我目前還沒有發(fā)現(xiàn)類似的代碼,如果您知道的話,不妨在留言中分享一下?灰常感謝!

責(zé)任編輯:武曉燕 來源: IOT物聯(lián)網(wǎng)小鎮(zhèn)
相關(guān)推薦

2011-06-21 18:02:14

Qt 動(dòng)態(tài) 鏈接庫(kù)

2013-03-02 18:00:38

軟件加密軟件授權(quán)WinLicense

2009-10-29 16:36:49

VB.NET .DLL

2022-06-09 09:54:45

編譯軟件開發(fā)

2012-05-08 14:48:23

LinuxUnix動(dòng)態(tài)鏈接庫(kù)

2024-06-06 08:53:13

動(dòng)態(tài)鏈接庫(kù)共享庫(kù)

2012-05-04 08:24:14

LinuxUnix

2009-08-28 16:19:30

C#實(shí)現(xiàn)修改動(dòng)態(tài)鏈接庫(kù)

2023-11-29 08:31:20

PythonRust

2022-05-03 23:44:21

Python動(dòng)態(tài)鏈接庫(kù)Ctypes

2009-07-07 20:57:20

LinuxUnix動(dòng)態(tài)鏈接庫(kù)

2024-03-01 20:59:11

C#DLL開發(fā)

2009-08-05 16:29:18

C#調(diào)用C++動(dòng)態(tài)鏈接

2023-05-09 08:24:11

JNA鏈接庫(kù)代碼

2013-09-12 12:55:53

iOS開發(fā)

2011-05-18 17:15:45

2022-10-24 00:03:21

動(dòng)態(tài)鏈接庫(kù)DLL

2021-11-11 17:36:07

鴻蒙HarmonyOS應(yīng)用

2011-08-02 14:15:05

XCode 靜態(tài) 鏈接庫(kù)

2022-07-12 13:23:59

靜態(tài)鏈接庫(kù)可執(zhí)行文件C 目標(biāo)文件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)