軟體工程/工具/混淆介紹
混淆程式碼是指經過處理,使其對人類難以理解的原始碼或機器程式碼。程式設計師可能會故意混淆程式碼以隱藏其目的(安全透過模糊性)或其邏輯以防止篡改、阻止逆向工程,或者作為閱讀原始碼者的謎題或娛樂性挑戰。稱為混淆器的程式使用各種技術將可讀程式碼轉換為混淆程式碼。程式碼混淆本質上不同於硬體混淆,在硬體混淆中,電路的描述和/或結構被修改以隱藏其功能。
某些語言可能比其他語言更容易混淆。[1][2] C,[3] C++[4] 和 Perl[5] 就是一些例子。
編寫和閱讀混淆的原始碼可以成為程式設計師的腦筋急轉彎。許多程式設計競賽會獎勵最具創意的混淆程式碼:國際混淆 C 程式碼競賽、混淆 Perl 競賽和 國際混淆 Ruby 程式碼競賽。
混淆的型別包括簡單的關鍵字替換、使用或不使用空格來建立藝術效果,以及自生成或高度壓縮的程式。
簡短的混淆 Perl 程式可能用在 Perl 程式設計師的簽名中。這些是 JAPH(“Just another Perl hacker”)。[需要引用]
這是國際混淆 C 程式碼競賽的獲獎作品 [6],由 Ian Phillipps 於 1988 年編寫 [7],後來由 Thomas Ball 逆向工程。 [8]
/*
LEAST LIKELY TO COMPILE SUCCESSFULLY:
Ian Phillipps, Cambridge Consultants Ltd., Cambridge, England
*/
#include <stdio.h>
main(t,_,a)
char
*
a;
{
return!
0<t?
t<3?
main(-79,-13,a+
main(-87,1-_,
main(-86, 0, a+1 )
+a)):
1,
t<_?
main(t+1, _, a )
:3,
main ( -94, -27+t, a )
&&t == 2 ?_
<13 ?
main ( 2, _+1, "%s %d %d\n" )
:9:16:
t<0?
t<-72?
main( _, t,
"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+,/+#n+,/#;\
#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;\
q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; \
r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#\
\
n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;\
{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;\
#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")
:
t<-50?
_==*a ?
putchar(31[a]):
main(-65,_,a+1)
:
main((*a == '/') + t, _, a + 1 )
:
0<t?
main ( 2, 2 , "%s")
:*a=='/'||
main(0,
main(-61,*a, "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry")
,a+1);}
這是一個 C 程式,編譯並執行後會生成《聖誕節的十二天》的 12 節。它以編碼形式包含了詩歌所需的全部字串。
下面的例子是同年非獲獎作品,展示了空格的創造性運用;它生成任意長度的迷宮 [9]
char*M,A,Z,E=40,J[40],T[40];main(C){for(*J=A=scanf(M="%d",&C);
-- E; J[ E] =T
[E ]= E) printf("._"); for(;(A-=Z=!Z) || (printf("\n|"
) , A = 39 ,C --
) ; Z || printf (M ))M[Z]=Z[A-(E =A[J-Z])&&!C
& A == T[ A]
|6<<27<rand()||!C&!Z?J[T[E]=T[A]]=E,J[T[A]=A-Z]=A,"_.":" |"];}
現代 C 編譯器不允許覆蓋常量字串,可以透過將 "*M" 更改為 "M[3]" 並省略 "M=" 來避免這種情況。
JAPH 的一個例子
@P=split//,".URRUU\c8R";@d=split//,"\nrekcah xinU / lreP rehtona tsuJ";sub p{
@p{"r$p","u$p"}=(P,P);pipe"r$p","u$p";++$p;($q*=2)+=$f=!fork;map{$P=$P[$f^ord
($p{$_})&6];$p{$_}=/ ^$P/ix?$P:close$_}keys%p}p;p;p;p;p;map{$p{$_}=~/^[P.]/&&
close$_}%p;wait until$?;map{/^r/&&<$_>}%p;$_=$d[$q];sleep rand(2)if/\S/;print
這個程式會慢慢地顯示文字“Just another Perl / Unix hacker”,一次顯示多個字元,並帶有延遲。可以在 這裡 找到解釋。
可以在 Python 官方程式設計 FAQ 中找到一些 Python 示例。
充其量,混淆只會讓逆向工程一個程式變得費時,但並非不可能。 [10]
存在各種各樣的工具來執行或協助程式碼混淆。這些工具包括由學者建立的實驗性研究工具、業餘愛好者工具、由專業人士編寫的商業產品以及開源軟體。還存在反混淆工具,試圖執行逆向轉換。
雖然大多數商業混淆解決方案透過轉換程式原始碼[11][12],或 Java[13] 和 .NET[14] 使用的平臺無關位元組碼來工作,但還有一些工具可以與 C 和 C++[15][16] - 通常編譯為本機程式碼的語言一起工作。
- ↑ 混淆:將您的程式碼隱藏在窺探者的眼中
- ↑ Jeff Atwood,2005 年 5 月 15 日
- ↑ 混淆
- ↑ C++ 教程 - 混淆程式碼 - 簡單介紹 | DreamInCode.net
- ↑ Pe(a)rls in line noise
- ↑ [國際混淆 C 程式碼競賽]
- ↑ "1988 年國際混淆 C 程式碼獲獎作品 - 最不可能成功編譯"
- ↑ "由 Thomas Ball 進行的聖誕節十二天的逆向工程"
- ↑ Don Libes,混淆 C 及其他謎題,John Wiley & Sons,1993,第 425 頁。 ISBN 0-471-57805-3
- ↑ "我們可以混淆程式嗎?" by Boaz Barak
- ↑ 開放目錄 - 計算機:程式設計:語言:JavaScript:工具:混淆器
- ↑ 開放目錄 - 計算機:程式設計:語言:PHP:開發工具:混淆和加密
- ↑ 開放目錄 - 計算機:程式設計:語言:Java:開發工具:混淆器
- ↑ 開放目錄 - 計算機:程式設計:元件框架:.NET:工具:混淆器
- ↑ Cloakware 應用程式安全
- ↑ Morpher - 編譯器驅動混淆
- B. Barak, O. Goldreich, R. Impagliazzo, S. Rudich, A. Sahai, S. Vadhan 和 K. Yang。 "關於(不)可能混淆程式"。第 21 屆國際密碼學大會,美國加利福尼亞州聖巴巴拉。施普林格出版社 LNCS 卷 2139,2001 年。
- Mateas, Michael;Nick Montfort。 "一個黑盒子:混淆、奇怪的語言和程式碼美學"。第 6 屆數字藝術與文化會議論文集,哥本哈根 IT 大學,2005 年 12 月 1-3 日。第 144-153 頁. http://nickm.com/cis/a_box_darkly.pdf.
- 國際混淆 C 程式碼競賽
- 透過程式碼混淆保護 Java 程式碼,ACM Crossroads,1998 年春季刊
- 保護你的 Java 程式碼 - 透過混淆器和其他方法,2009 年 4 月
- MSDN 資源頁面上的 Visual Studio 中的 Dotfuscator - Visual Studio 2008 內建 .NET 混淆文件
- 用於 .NET 的混淆工具,在 MSDN 上 - Microsoft 開發人員中心的 .NET 混淆資源。
- 我們可以混淆程式嗎?
- Yury Lifshits。程式混淆講義(2005 年春季)
- 混淆 .NET 程式碼中的成員名稱
- Java 混淆器 在 Curlie
- 對 12 天程式的分析
- 對混淆的迷宮生成程式的分析
- 帶有解釋的混淆 Perl 程式
- 讓 C 編譯器生成混淆程式碼
- 透過程式碼混淆保護 php 程式碼