我們先寫出函數:
<?php
function encode_file_contents($filename) {
$type=strtolower(substr(strrchr($filename,'.'),1));
if ('php' == $type && is_file($filename) && is_writable($filename)) { //
如果是PHP文件 並且可寫 則進行壓縮編碼
$contents = file_get_contents($filename); // 判斷文件是否已經被編碼處
理
$contents = php_strip_whitespace($filename);
// 去除PHP頭部和尾部標識
$headerPos = strpos($contents,'<?php');
$footerPos = strrpos($contents,'?>');
$contents = substr($contents, $headerPos + 5, $footerPos -
$headerPos);
$encode = base64_encode(gzdeflate($contents)); // 開始編碼
$encode = '<?php'." eval(gzinflate(base64_decode("."'".
$encode."'"."))); ?>";
return file_put_contents($filename, $encode);
}
return false;
}
調用此函數:
$filename = 'result1.php';
encode_file_contents($filename);
echo "OK,加密完成!";
?>
3
測試是否加密成功:文件名為result1.php,運行代碼
4
運行成功。
B. 如何對公司的源代碼加密
對公司源代碼加密的話 我推薦使用域之盾軟體 以下是軟體加密的具體流程 希望可以幫到你。
1,首先安裝軟體 安裝完成後 開啟 透明加密。對重要文件進行加密。
2,通過 軟體限制陌生u盤的試用,設置只讀或禁止使用。對常用U盤設置白名單
3,開啟軟體的外發審核,外發的一切文件資料 等 需要管理員審核否則非法外發 即為亂碼。
C. iOS代碼加密的幾種方式
眾所周知的是大部分iOS代碼一般不會做加密加固,因為iOS
APP一般是通過AppStore發布的,而且蘋果的系統難以攻破,所以在iOS里做代碼加固一般是一件出力不討好的事情。萬事皆有例外,不管iOS、adr還是js,加密的目的是為了代碼的安全性,雖然現在開源暢行,但是不管個人開發者還是大廠皆有保護代碼安全的需求,所以iOS代碼加固有了生存的土壤。下面簡單介紹下iOS代碼加密的幾種方式。
iOS代碼加密的幾種方式
1.字元串加密
字元串會暴露APP的很多關鍵信息,攻擊者可以根據從界面獲取的字元串,快速找到相關邏輯的處理函數,從而進行分析破解。加密字元串可以增加攻擊者閱讀代碼的難度以及根據字元串靜態搜索的難度。
一般的處理方式是對需要加密的字元串加密,並保存加密後的數據,再在使用字元串的地方插入解密演算法。簡單的加密演算法可以把NSString轉為byte或者NSData的方式,還可以把字元串放到後端來返回,盡量少的暴露頁面信息。下面舉個簡單例子,把NSString轉為16進制的字元串:
2.符號混淆
符號混淆的中心思想是將類名、方法名、變數名替換為無意義符號,提高應用安全性;防止敏感符號被class-mp工具提取,防止IDA Pro等工具反編譯後分析業務代碼。目前市面上的IOS應用基本上是沒有使用類名方法名混淆的。
別名
在編寫代碼的時候直接用別名可能是最簡單的一種方式,也是比較管用的一種方式。因為你的app被破解後,假如很容易就能從你的類名中尋找到蛛絲馬跡,那離hook只是一步之遙,之前微信搶紅包的插件應該就是用hook的方式執行的。
b.C重寫
編寫別名的方式不是很易讀,而且也不利於後續維護,這時你可能需要升級一下你的保護方式,用C來重寫你的代碼吧。這樣把函數名隱藏在結構體中,用函數指針成員的形式存儲,編譯後,只留下了地址,去掉了名字和參數表,讓他們無從下手( from 念茜)。如下例子:
c.腳本處理
稍微高級一點的是腳本掃描處理替換代碼,因為要用到linux命令來編寫腳本,可能會有一點門檻,不過學了之後你就可以出去吹噓你全棧工程師的名頭啦。。。
linux腳本比較常用的幾個命令如下:
腳本混淆替換是用上述幾個命令掃描出來需要替換的字元串,比如方法名,類名,變數名,並做替換,如果你能熟練應用上述幾個命令,恭喜你,已經了解了腳本的一點皮毛了。
如以下腳本搜索遍歷了代碼目錄下的需要混淆的關鍵字:
替換的方式可以直接掃描文件並對文件中的所有內容替換,也可以採用define的方式定義別名。例如:
d.開源項目ios-class-guard
該項目是基於class-mp的擴展,和腳本處理類似,是用class-mp掃描出編譯後的類名、方法名、屬性名等並做替換,只是不支持隱式C方法的替換,有興趣的同學可以使用下。
3.代碼邏輯混淆
代碼邏輯混淆有以下幾個方面的含義:
對方法體進行混淆,保證源碼被逆向後該部分的代碼有很大的迷惑性,因為有一些垃圾代碼的存在;
對應用程序邏輯結構進行打亂混排,保證源碼可讀性降到最低,這很容易把破解者帶到溝里去;
它擁有和原始的代碼一樣的功能,這是最最關鍵的。
一般使用obfuscator-llvm來做代碼邏輯混淆,或許會對該開源工具做個簡單介紹。
4.加固SDK
adr中一般比較常見的加固等操作,iOS也有一些第三方提供這樣的服務,但是沒有真正使用過,不知道效果如何。
當然還有一些第三方服務的加固產品,基本上都是採用了以上一種或幾種混淆方式做的封裝,如果想要直接可以拿來使用的服務,可以採用下,常用的一些服務如下:
幾維安全
iOS加密可能市場很小,但是存在必有道理,在越獄/開源/極客的眼中,你的APP並沒有你想像的那麼安全,如果希望你的代碼更加安全,就應給iOS代碼加密。
D. 怎麼給自己寫的程序加密啊
如果你的程序核心模塊不希望被第3方知道,可以在代碼里直接加密,用時解密,或者你有匯編實力,直接將功能模塊寫成SHELLCODE,加密SHELLCODE,需要調用時動態解密。都整個文件加密的可行性比較低
E. 如何給代碼加密
推薦試試IP-guard
IP-guard支持對多種類型源代碼進行自動加密保護,不需要用手手動操作,而只要在部署了IP-guard的授權環境下,用戶就可以正常打開使用加密了的源代碼,而脫離了授權環境則無法打開,這樣即使泄露出去也不用擔心泄密發生
IP-guard的加密基於驅動層和應用層,所以在加密強度上能得到保證,建議不要只上加密,對於防泄密,員工的上網行為、桌面操作行為最好也進行管控。
F. 如何用代碼給文件夾加密
方法一:利用文件本身的屬性對文件進行隱身
准備工作:電腦一台,有效文件夾一個
具體步驟:首先,我們找到需要加密的文件夾。右擊打開「屬性」,然後選擇「隱藏」。其次再選擇「將更改應用於此文件夾、子文件夾和文件」,再單擊回車確定。這個時候我們的文件就已經隱身成功了。那麼怎麼樣將其恢復打開呢?我們首先要選擇工具欄,將其打開然後選擇「文件夾選項」。再是在「查看」中選擇「顯示隱藏的文件、文件夾和驅動器」,再單擊回車確定就可以了。
方法二:利用文件壓縮加密
准備工作:電腦一台,有效文件夾一個,壓縮文件一個(比如說:WinRAR)
具體步驟:首先,找到要加密的文件夾。然後右擊選擇WinRAR中的「添加到壓縮文件」。操作成功後,我們可以看到一個對話框,在其對話框裡面設置解壓縮的密碼。設置好之後,點擊「確定」,將文件壓縮成功就可以了,然後我們將原文件刪除即可。想要查看文件的時候,我們只需要將其壓縮包解壓即可,不過大家可要牢記解壓密碼哦!
方法三:加密軟體
准備工作:電腦一台,有效文件夾一個,加密軟體一個
具體步驟:在網上下載好適宜的加密軟體將其安裝即可,注冊賬號。加密軟體它有一定的要求,我們要在磁碟上給其單獨的劃分一個區來作為它的庫,並且設置好它的位置,大小以及密碼就可以。那麼將文件移進加密軟體可以了,要查看的時候輸入密碼就可以打開加密文件了。
綜上所述:上述三種辦法都是可以對文件夾來進行加密的,並且它們有自己各自的優缺點。大家在選擇哪種辦法進行加密的時候,可以按照個人的需求來決定,不過加密的秘密是一定要記住的哦!
G. 如何給代碼加密
進入js在線加密工具
把要加密的代碼復制到這個框中
得到加密後的代碼
右鍵點擊復制
回到桌面,創建一個文件
命名為funs.js
如果不能更新文件名後綴,可以打開任意一個文件夾,左側-組織-文件夾和搜索選項-隱藏已知文件的擴展名,取消勾選
右鍵點擊文件funs.js,選擇編輯,然後將加密後的js文件復制到這里,保存即可
H. 源代碼加密 C#
c# dll 加密最快的方法使用加殼工具Virbox Protector,直接加密,Virbox Protectorke可以對dll進行性能分析,分析每個函數的調用次數,對每個函數選擇保護方式如:混淆/虛擬化/碎片化/代碼加密等;每種加密方法的特點是什麼呢?
代碼加密(X86):
針對X86匯編代碼:一種代碼自修改技術(SMC)保護代碼。把當前代碼加密存儲為密文,存儲起來,當程序運行到被保護函數時候自動解密並且執行,執行之後再擦除代碼,運行到哪裡才解密哪裡的代碼,黑客無法獲得原始機器指令和內存完整性的代碼,由於是純內存操作所以運行速度快, 性價高的保護手段,建議全加
代碼加密(IL)
針對dotNet程序,保護IL代碼:一種動態運行方法解密被保護代碼。把當前代碼加密存儲為密文,存儲起來,當程序運行到被保護函數時候自動解密並且執行,執行之後再擦除代碼,執行之後再擦除代碼,運行到哪裡才解密哪裡的代碼,黑客無法獲得原始的中間語言的指令和內存完整性的代碼,由於是純內存操作所以運行速度快, 性價高的保護手段,建議全加
壓縮
類似zip等壓縮軟體把代碼和數據段壓縮,由於帶有動態密碼,沒有任何工具可以自動脫殼,是防止反編譯和反匯編關鍵手段。
代碼混淆(IL):
將代碼中的各種元素,如變數,函數,類的名字改寫成無意義的名字。比如改寫成單個字母,或是簡短的無意義字母組合,甚至改寫成「__」這樣的符號,使得閱讀的人無法根據名字猜測其用途。
a)重寫代碼中的部分邏輯,將其變成功能上等價,但是更難理解的形式。比如將for循環改寫成while循環,將循環改寫成遞歸,精簡中間變數,等等。
b) 打亂代碼的格式。比如刪除空格,將多行代碼擠到一行中,或者將一行代碼斷成多行等等。
c) 添加花指令,通過特殊構造的指令來使得反匯編器出錯,進而干擾反編譯工作的進行。
代碼混淆器也會帶來一些問題。主要的問題包括:· 被混淆的代碼難於理解,因此調試除錯也變得困難起來。開發人員通常需要保留原始的未混淆的代碼用於調試。· 對於支持反射的語言,代碼混淆有可能與反射發生沖突。· 代碼混淆並不能真正阻止反向工程,只能增大其難度。因此,對於對安全性要求很高的場合,僅僅使用代碼混淆並不能保證源代碼的安全。
代碼混淆的特點是安全度低、不會影響效率。
代碼虛擬化:
針對X86代碼: 是指將機器代碼翻譯為機器和人都無法識別的一串偽代碼位元組流;在具體執行時再對這些偽代碼進行一一翻譯解釋,逐步還原為原始代碼並執行。 這段用於翻譯偽代碼並負責具體執行的子程序就叫作虛擬機VM(好似一個抽象的CPU)。它以一個函數的形式存在,函數的參數就是位元組碼的內存地址。 由於虛擬機代碼和虛擬機CPU的實現可以做到每次都是隨機設計和隨機執行 並且代碼每次可以隨機變化,包括一些邏輯上的等價變化可以參考硬體N個與非門NOT-AND實現各種邏輯門,演算法和訪問內存形式的變化,包括數學上的非等價變化,代碼體積幾乎可以膨脹達到100到10000倍,造成機器無法做演算法還原到原有邏輯。
代碼虛擬化的特點是:安全度中、不會影響效率。
代碼碎片化:
深思自主知識產權的最新技術:基於 LLVM 和 ARM 虛擬機技術,自動抽取海量代碼移入 SS 內核態模塊,極大的降低了使用門檻, 不再需要手動移植演算法,可移植的演算法從有限的幾個增長到幾乎無限多,支持的語言也不再限於 C, 這是加密技術的一次綜合應用,效果上類似於將軟體打散執行,讓破解者無從下手。
安全度高、建議關鍵函數或調用加密鎖方法;使用太多會影響效率
I. 如何給c/c++源代碼加密
#include#include#includevoid findKey(char* key, char* mark){int len = strlen(key);int i = 0;int j = 0;memset(mark,0,26);for (i = 0; i 96){encrypt[i] = map[encrypt[i] - 97];}}outputFile = fopen("output.txt", "w+");fwrite(encrypt,nFileLen,1,outputFile);printf("加密的密文:%s\n", encrypt);fclose(outputFile);fclose(inputFile);free(encrypt);system("pause");return 0;}
J. 如何給代碼加密
下面是一個Step by Step的教程,教你如何把一個清晰的代碼變得復雜難懂的。當然,這只是一個「簡明教程」了。還是那句話——「本文僅供朋友們「消遣作樂」,如果你要覺得有意思的話,頂個貼。如果你覺得沒什麼意思的話,一笑了之。僅供娛樂而已,不必太過認真。」
開始程序
下面是一個找出素數的程序:void primes(int cap)
{
int i, j, composite;
for(i = 2; i < cap; ++i) {
composite = 0;
for(j = 2; j * j < i; ++j) {
composite += !(i % j);
}
if(!composite){
printf("%dt", i);
}
}
}
int main()
{
primes(100);
}
下面我們來看看如何把上面這段代碼搞得復雜難懂。
第一步、把for變成while
通常來說,for循壞要以while循壞簡單一些,上面的程序有二重for循環,我們不但要把其變成while循環,而且還要把二重循環的變成一重的循環,然後使用大量的if-else語句來判斷。void primes(int cap)
{
int i, j, composite, t = 0;
while(t < cap * cap) {
i = t / cap;
j = t++ % cap;
if(i <= 1);
else if(!j)
composite = j;
else if(j == i && !composite)
printf("%dt",i);
else if(j > 1 && j < i)
composite += !(i % j);
}
}
int main()
{
primes(100);
}
第二步,把循壞變成遞歸
遞歸在某些時候是可以把代碼變得簡單,但大多數的情況下是把代碼變得復雜,而且很沒有效率。下面是把上面的while循環變成了遞歸。變成了遞歸後,函數的參數都變成3個了。void primes(int cap, int t, int composite)
{
int i,j;
i = t / cap;
j = t % cap;
if(i <= 1)
primes(cap,t+1,composite);
else if(!j)
primes(cap,t+1,j);
else if(j == i && !composite)
(printf("%dt",i), primes(cap,t+1,composite));
else if(j > 1 && j < i)
primes(cap,t+1, composite + !(i % j));
else if(t < cap * cap)
primes(cap,t+1,composite);
}
int main()
{
primes(100,0,0);
}
第三步,弄亂代碼結構/使用沒有含義的變數名
關於如何弄亂代碼結構,其中一個小技巧是,使用「?」表達式代替if-else語句。void primes(int m, int t, int c)
{
int i,j;
i = t / m;
j = t % m;
(i <= 1) ? primes(m,t+1,c) : (!j) ? primes(m,t+1,j) : (j == i && !c) ?
(printf("%dt",i), primes(m,t+1,c)) : (j > 1 && j < i) ?
primes(m,t+1,c + !(i % j)) : (t < m * m) ? primes(m,t+1,c) : 0;
}
int main()
{
primes(100,0,0);
}
第四步,取消臨時變數
臨時變數一般用來保存反復使用的一個表達式的值。使用大量重復的表達式來取消這些臨時變數的也可以讓代碼復雜起來。void primes(int m, int t, int c)
{
((t / m) <= 1) ? primes(m,t+1,c) : !(t % m) ? primes(m,t+1, t % m) :
((t % m)==(t / m) && !c) ? (printf("%dt",(t / m)), primes(m,t+1,c)) :
((t % m)> 1 && (t % m) < (t / m)) ? primes(m,t+1,c + !((t / m) % (t % m))) :
(t < m * m) ? primes(m,t+1,c) : 0;
}
int main()
{
primes(100,0,0);
}
第五步,繼續弄亂變數名
我們知道,下劃線是合法的變數名,所以,我們不妨用__,___,____來代替m,t,c。函數名也可以使用下劃線來代替。讓我們來看看求素數的函數能變成什麼。
void _(int __, int ___, int ____)
{
((___ / __) <= 1) ? _(__,___+1,____) : !(___ % __) ? _(__,___+1,___ % __) :
((___ % __)==(___ / __) && !____) ? (printf("%dt",(___ / __)),
_(__,___+1,____)) : ((___ % __) > 1 && (___ % __) < (___ / __)) ?
_(__,___+1,____ + !((___ / __) % (___ % __))) : (___ < __ * __) ?
_(__,___+1,____) : 0;
}
int main()
{
_(100,0,0);
}
第六步,移除常量
在上面的程序中,還有一些常量,你可以通過增加一個宏定義,或是增加一個函數的形參來取代這一常量。void _(int __, int ___, int ____, int _____)
{
((___ / __) <= _____) ? _(__,___+_____,____,_____) : !(___ % __) ? _(__,___+_____,___ % __, _____) :
((___ % __)==(___ / __) && !____) ? (printf("%dt",(___ / __)),
_(__,___+_____,____,_____)) : ((___ % __) > _____ && (___ % __) < (___ / __)) ?
_(__,___+_____,____,_____ + !((___ / __) % (___ % __))) : (___ < __ * __) ?
_(__,___+_____,____,_____) : 0;
}
int main() {
_(100,0,0,1);
}
程序到這里應該差不多了。還是那句話——「每一個程序員都有把源代碼弄復雜的潛質」,大家好自為之。
轉載