導航:首頁 > 源碼編譯 > c程序防止反編譯

c程序防止反編譯

發布時間:2023-02-21 18:46:12

A. 我寫的C/S程序怎麼輕易就被人反編譯

簡單回答: 1、理論上不能保證程序不被反編譯。 2、一些加殼軟體可以做到加大被反編譯的難度,迫使操作者先解殼才能做反編譯,但同時會降低程序的運行效率。 3、當前的技術條件下,一般而言,反編譯出的「源代碼」一般而言並不能作學習,參考的源

B. 如何防止程序員反編譯

java從誕生以來,其基因就是開放精神,也正因此,其可以得到廣泛愛好者的支持和奉獻,最終很快發展壯大,以至於有今天之風光!但隨著java的應用領域越來越廣,特別是一些功能要發布到終端用戶手中(如Android開發的app),有時候,公司為了商業技術的保密考慮,不希望這裡面的一些核心代碼能夠被人破解(破解之後,甚至可以被簡單改改就發布出去,說嚴重點,就可能會擾亂公司的正常軟體的市場行為),這時候就要求這些java代碼不能夠被反編譯。

這里要先說一下反編譯的現象。因為java一直秉持著開放共享的理念,所以大家也都知道,我們一般共享一個自己寫的jar包時,同時會共享一個對應的source包。但這些依然與反編譯沒有什麼關系,但java的共享理念,不只是建議我們這樣做,而且它自己也在底層上「強迫」我們這么做!在java寫的.java文件後,使用javac編譯成class文件,在編譯的過程,不像C/C++或C#那樣編譯時進行加密或混淆,它是直接對其進行符號化、標記化的編譯處理,於是,也產生了一個逆向工程的問題:可以根據class文件反向解析成原來的java文件!這就是反編譯的由來。

但很多時候,有些公司出於如上述的原因考慮時,真的不希望自己寫的代碼被別人反編譯,尤其是那些收費的app或桌面軟體(甚至還有一些j2ee的wen項目)!這時候,防止反編譯就成了必然!但前面也說過了,因為開放理念的原因,class是可以被反編譯的,那現在有這樣的需求之後,有哪些方式可以做到防止反編譯呢?經過研究java源代碼並進行了一些技術實現(結果發現,以前都有人想到過,所以在對應章節的時候,我會貼出一些寫得比較細的文章,而我就簡單闡述一下,也算偷個懶吧),我總共整理出以下這幾種方式:

代碼混淆

這種方式的做法正如其名,是把代碼打亂,並摻入一些隨機或特殊的字元,讓代碼的可讀性大大降低,「曲線救國」似的達到所謂的加密。其實,其本質就是打亂代碼的順序、將各類符號(如類名、方法名、屬性名)進行隨機或亂命名,使其無意義,讓人讀代碼時很累,進而讓人乍一看,以為這些代碼是加過密的!

由其實現方式上可知,其實現原理只是擾亂正常的代碼可讀性,並不是真正的加密,如果一個人的耐心很好,依然可以理出整個程序在做什麼,更何況,一個應用中,其核心代碼才是人們想去了解的,所以大大縮小了代碼閱讀的范圍!

當然,這種方式的存在,而且還比較流行,其原因在於,基本能防範一些技術人員進行反編譯(比如說我,讓我破解一個混淆的代碼,我寧願自己重寫一個了)!而且其實現較為簡單,對項目的代碼又無開發上的侵入性。目前業界也有較多這類工具,有商用的,也有免費的,目前比較流行的免費的是:proguard(我現象臨時用的就是這個)。

上面說了,這種方式其實並不是真正加密代碼,其實代碼還是能夠被人反編譯(有人可能說,使用proguard中的optimize選項,可以從位元組流層面更改代碼,甚至可以讓JD這些反編譯軟體可以無法得到內容。說得有點道理,但有兩個問題:1、使用optimize對JDK及環境要求較高,容易造成混淆後的代碼無法正常運行;2、這種方式其實還是混淆,JD反編譯有點問題,可以有更強悍的工具,矛盾哲學在哪兒都是存在的^_^)。那如何能做到我的class代碼無法被人反編譯呢?那就需要我們下面的「加密class」!

加密class

在說加密class之前,我們要先了解一些java的基本概念,如:ClassLoader。做java的人已經或者以後會知道,java程序的運行,是類中的邏輯在JVM中運行,而類又是怎麼載入到JVM中的呢(JVM內幕之類的,不在本文中闡述,所以點到為止)?答案是:ClassLoader。JVM在啟動時是如何初始化整個環境的,有哪些ClassLoader及作用是什麼,大家可以自己問度娘,也不在本文中討論。

讓我們從最常見的代碼開始,揭開一下ClassLoader的一點點面紗!看下面的代碼:

Java代碼

C. perl如何避免反編譯

為了保護Perl源代碼,常用的有三種方法。
1.
使用Perl自帶的perlcc工具。這個工具有一個最大的弱點:它只能作用於一個perl文件。假如你和我一樣寫了十幾二十幾個perl包,主程序里倒是空空如也,估計要郁悶死。用也是可以用的,就是要把所有的源代碼到一個文件,取消所有的package定義,把原來不同package下面同名的函數改名,不同的package裡面的同名全局變數也要改名。然後
$perlcc -o hello hello.pl
得到可執行程序hello. Perlcc的原理是把perl程序轉換成C程序,然後用GNU
C編譯器編譯。它在Windows上也可以用,但需要額外安裝C編譯器,比如Intel C或者MS Microsoft Visual
C。由於perlcc把代碼先變C再變可執行程序,反編譯出來的源碼很難看懂,所以安全性很高。但是把所有的代碼寫一個文件,模塊也不能用了,這簡直是從地鐵時代回到烏蓬船時代,我想不會有人覺得舒服。何況這樣混雜後的代碼該如何維護升級和做版本控制呢,頭大。另外,perlcc有申明,不保證它編譯出來的東西能用(參見$perldoc
perlcc)。我沒遇到這個情況,而是遇到了perlcc直接就對我的程序編譯不通過,沒戲唱了。{2006.12.15更新:找到perl不能編譯我的程序的原因了:1.
只能用use 不能用require,模塊文件名的後綴都改成.pm, use後跟不帶後綴的文件名就可以。2.
所有的全局數組,必須用my, our,
或者local來定義,不可以用預設作用范圍。第二點其實應該是perlcc的一個bug了,因為關聯數組和簡單變數都沒有這個問題。}

2. perl2exe,據說很好用,但令人沮喪的是要license, 而且據說跨平台還有問題。

3. PAR(Perl Archive Toolkit)。這個命名法則是類似於JAR(Java
Archive)。下載下來以後還要從CPAN上下載一些依賴性模塊。CPAN模塊果然好裝,每個模塊都是
$perl Makefile.PL
$make
$make install
就能裝好。最後安裝PAR。裝好以後會在/usr/bin/下面添加一些工具。我不關心別的,就要用pp:
$pp -o hello hello.pl
這樣生成的hello就是可執行文件,而且把用到的perl模塊文件也全打包進來了。運行的時候它會在/tmp/par-username/下生成一個叫
cache-123456789之類的臨時文件夾,打開看看可以發現就是自己的源代碼。這樣不是沒達到我想要的隱藏源代碼的目的么?原來還需要啟動過濾器:
$pp -f Bleach -o hello hello.pl
或者
$pp -f Bytecode -o hello hello.pl
前面的Bleach過濾器是PAR自己實現的,而Bytecode這種過濾方式是Perl的標准格式(需要Perl
5.8.1以上版本支持)。過濾之後,臨時文件夾裡面的文件就不是簡單可讀了。當然是有辦法crack,
但這和恢復帶初始變數名的源代碼是兩回事。

D. python源碼編程成pyc後,怎麼防止反編譯

無法防止反編譯,但可以混淆,讓你即使反編譯了,也看不懂語法
下面一段源碼

sd=1

defseed(s):
globalsd
sd=s

defrandn(n):
globalsd
sd=(sd*1103515245+12345)&0x7fffffff
returnsd%n

defmain():
seed(11)
foriinxrange(4):
printrandn(313)

if__name__=='__main__':
main()

混淆後

oo000=1
if9-9:Ii.o0o00Oo0O-iI11I1II1I1I
defoooo(s):
globaloo000
oo000=s
if11-11:ii1I-ooO0OO000o
defii11i(n):
globaloo000
oo000=(oo000*1103515245+12345)&0x7fffffff
returnoo000%n
if66-66:iIiI*iIiiiI1IiI1I1*o0OoOoOO00
defI11i():
oooo(11)
forO0Oinxrange(4):
printii11i(313)
if78-78:i11ii11iIi11i.oOoO0oo0OOOo+IiiI/Iii1ii1II11i
if__name__=='__main__':
I11i()#

E. C++程序可以被反編譯嗎

c/c++程序是不能被反編譯的,除非是debug版本(包含各種標識符及調試信息),release版本沒有任何有關源碼的信息,是不能被反編譯的

F. 如何防止Unity3D代碼被反編譯

根本的解決辦法是:先對DLL加密,然後在Unity的源碼中載入程序DLL之前進行解密。

這就需要通過逆向工程獲得相應的Unity源碼或者是直接向Unity購買Source Code License。

G. 為何C和C++編寫生成的可執行程序不可反編譯回源程序

因為不同的源程序經過編譯可能得到相同的可執行程序,因此如果反向操作就存在二義性了

H. 如何讓我用C語言寫的程序不讓人家在不反編譯的情況下只運行,不可以看見程序 我用的是VC++

如果樓主想從代碼編寫出發的的話,我看樓主還沒到這個層度,要從代碼上防止反匯編,首先自己得想當熟悉反匯編才行... 簡單的方法可以給你寫的程序加個殼就行了

I. dll如何防止反編譯

1
將你要破解的DLL文件放在C盤
2
執行 開始》所以程序》Microsoft Windows SDK v6.0A》tools》IL 反匯編程序
3
找到放在C盤的DLL文件
4
然後 文件》轉儲》確定位置並確認
5
好了 看看C盤是否多了 兩個文件 xxx.il xxx.res
6
修改 xxx.il 文件內的代碼
7
修改完成後將xxx.il和 xxx.res 把這兩個文件復制到 C:\Program Files\Microsoft Visual Studio 9.0\VC這個目錄下
8
然後執行:開始》所以程序》Microsoft Visual Studio 2008》Visual Studio Tools》Visual Studio 2008 命令提示
9
執行:ilasm /dll /resource=xxx.res xxx.il xxx代表你取的名字
10
然後去看看C:\Program Files\Microsoft Visual Studio 9.0\VC 這個目錄下是不是多了一個xxx.dll文件 把編譯出來的文件拿去使用就OK了

注意事項
一定要確定文件名稱和位置不能有錯!

J. 怎樣防止編譯後的C語言文件被反編譯

app反編譯後防止介面泄露的方法,就是使用谷歌提供的混淆工具,將不要反編譯的文件保留,其他的都進行混淆,這樣之後反編譯看到的都是一些亂碼,例如abc之類的。

閱讀全文

與c程序防止反編譯相關的資料

熱點內容
網站伺服器續費怎麼續費 瀏覽:534
cad等距線段快捷鍵命令 瀏覽:420
冰箱app和黑域哪個好用 瀏覽:223
鶴崗買房軟體app哪個最靠譜 瀏覽:719
python模擬登錄京東 瀏覽:282
irc命令 瀏覽:273
清空cisco交換機命令 瀏覽:760
地面波收費加密台搜不到了 瀏覽:283
小米更新一直顯示加密中 瀏覽:601
jsgzip解壓縮 瀏覽:428
邏輯電路設計怎麼編譯 瀏覽:758
捏手機解壓視頻 瀏覽:498
電腦解鎖加密分區 瀏覽:493
響應文本加密怎麼破解 瀏覽:381
tophlinux 瀏覽:719
3D減少片段數的命令是什麼 瀏覽:558
單片機phy 瀏覽:305
平板壓縮文件打不開 瀏覽:653
dijkstra演算法和a演算法 瀏覽:757
c盤桌面文件夾怎麼改到d盤 瀏覽:813