2013-05-19 50 views
6

因此,我用visual 2012製作了一個應用圖像和着色器(純文本)的應用程序。但是,真的,我不希望人們打開圖像和着色器並且四處亂竄。我如何將所有這些外部文件壓縮爲單個或多個文件,但仍然可執行文件可讀?如何編碼.exe附帶的外部文件

+0

[zlib](http://en.wikipedia.org/wiki/Zlib) – deepmax

+1

您是否試圖阻止人們將您的圖像和着色器用於其他目的,或者修改它們以使您的程序看起來或行爲不同?或兩者?前者需要某種加密或混淆,而後者只需要驗證。另外,除非您擁有防篡改的硬件支持,否則這兩項任務對於堅決的攻擊者實際上是不可能的,因此另一個問題是您想要實現它有多困難?勸阻臨時用戶不會很難,但嚴重的黑客是另一回事。 – rhashimoto

+0

嗨,謝謝你的回答。我很高興有一個簡單的例子,所以他們不會輕易獲得圖像,着色器,模型等。 – marcg11

回答

5

這個問題很難以權威的方式回答,因爲沒有防篡改硬件,對於複雜的黑客來說,保護內容本質上是不可能的。但是,鑑於一個簡單的威懾力是足夠好的澄清,那麼embedding your content as resources in the executable呢?請注意,有免費的工具可以從.exe文件中提取資源。

或者,您可以加密每個文件並在您的應用程序加載時對其進行解密。加密可以像使用已知恆定字節對每個字節進行異或操作一樣簡單,或者您可以使用真正的加密算法,如Microsoft CryptoAPI。使用真正的算法會改善混淆,但仍然不會真正安全。

下面是一個使用this RC4 implementation(這是很容易,CryptoAPI的使用)來加密或解密文件,並將其寫入到標準輸出一個簡單的程序:

#include <algorithm> 
#include <iostream> 
#include <fstream> 
#include <iterator> 
#include <vector> 

// insert RC4 implementation here 

int main(int argc, char *argv[]) { 
    const std::string password = "no more secrets"; 
    const std::string filename = argv[1]; 

    // Read file into a buffer. 
    std::ifstream f(filename.c_str(), std::ios::in | std::ios::binary); 
    std::vector<char> buffer; 
    f >> std::noskipws; 
    std::copy(
     std::istream_iterator<char>(f), std::istream_iterator<char>(), 
     std::back_inserter(buffer)); 

    // Initialize the key from a password. 
    rc4_key key; 
    prepare_key((unsigned char *)password.data(), (int)password.size(), &key); 

    // Encrypt or decrypt (same operation). 
    rc4((unsigned char *)&buffer[0], (int)buffer.size(), &key); 

    // Write result to stdout. 
    std::cout.write(&buffer[0], buffer.size()); 

    return 0; 
} 

注意,這是不使用RC4的安全方式而RC4算法本身不再被認爲是安全的。

+0

嚴格地說,將簡單的xor稱爲「加密」是不負責任的。 –

+1

@IronSavior我試圖向後彎腰說這是不安全的。有一整套的加密算法 - 有些(相信)是安全的,有些則不是。異或是替代密碼的一個例子 - 我不同意替換密碼不是原始形式的加密。 – rhashimoto

+0

你能提供一些加密和解密文件的代碼嗎?它將如何工作? – marcg11

2

編碼文件到源代碼可執行文件。創建一個數組,文件的每個字節一次編碼一個字節。將數據包含在可執行文件中是一種非常簡單的技術。

相關問題