導航:首頁 > 源碼編譯 > c代碼怎麼防反編譯

c代碼怎麼防反編譯

發布時間:2022-09-18 08:58:22

『壹』 怎樣防止編譯後的C語言文件被反編譯

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

『貳』 c語言怎麼防止別人抄襲

這個問題嘛。不太好解決。
以下方法僅供參考:
1、做注釋,在注釋中寫明author,一般來說都放在函數前。每個c文件也應該在開頭部分這樣做
2、在變數名稱中嵌入自己的名字簡寫或者直接就是名字
3、C測試數據中使用的數據用與自己相關的數據。
4、在C語言中設置類似水印的東西,例如,在某些程序的某些地方,悄悄的輸出自己的名字(當然,你不能讓別人知道你都什麼地方輸出了這些信息)。

暫時就想到這么多,如果,一個人能把上面的所有東西都改掉,那麼,我感覺他還不如自己做一個呢。。。
就是,你確定一個宗旨,讓他們改起來比做起來更加浪費時間和精力就ok了!

『叄』 如何有效防止C#編寫的DLL被反編譯

為防止這類反向工程的威脅,最有效的辦法是模糊。
模糊工具運用各種手段達到這一目標,但主要的途徑是讓變數名字不再具有指示其作用的能力、加密字元串和文字、插入各種欺騙指令使反編譯得到的代碼不可再編譯。
例子:
對未經模糊處理的代碼執行反向工程:
Private Sub CalcPayroll(ByVal employeeGroup As SpecialList)
While employeeGroup.HasMore
employee = employeeGroup.GetNext(True)
employee.updateSalary
DistributeCheck(employee)
End While
End Sub

同樣的代碼,經過模糊處理再執行反向工程:
Private Sub a(ByVal b As a)
While b.a
a = b.a(True)
a.a
a(a)
End While
End Sub

顯然,兩段代碼的處理邏輯相同。但是,要說清楚第二段代碼到底在做些什麼極其困難,甚至要判斷它正在訪問哪些方法、哪些變數也很困難。
這種改變變數名稱的功能是可配置的,例如,假設正在構造一個DLL,可以要求不改動API,有趣的是,這一處理過程顯然只是簡單地把大量變數的名稱簡縮成單個字元,但獲得了非常好的模糊效果。

『肆』 如何防止程序員反編譯

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++寫的dll不被反編譯

簡單回答:
1、理論上不能保證程序不被反編譯。
2、一些加殼軟體可以做到加大被反編譯的難度,迫使操作者先解殼才能做反編譯,但同時會降低程序的運行效率。
3、當前的技術條件下,一般而言,反編譯出的「源代碼」一般而言並不能作學習,參考的源代碼,多數情況下只能用於分析區部片斷分析,主要用於破解或小范圍類修改。
4、一些簡單的加殼軟體:ASPACK、UPX、PECompact等,如果想嘗試,自個去搜索下載後試試。加殼後的軟體還有可能被某些殺軟當成惡意軟體。
5、這也正是很多對安全要求高的系統使用「三層架構」(類似訪問網頁/網站)的原因。因為在三層架構中,核心軟體、數據不被用戶直接接觸。

************以下是相關知識,有耐心可看看************
一、關於反編譯與破解。
1、以當前的技術來說,理論上,所有的程序都存在被反編譯的可能。
2、但是反編譯出來的代碼並不一定能被技術不高的人看懂,因為反編譯出來的「源代碼」與編寫者寫出的原代碼在80%以上是不同的。這是因為反編譯的原理是根據機器碼(或中間碼),讓機算機進行反向生成高級語言,而不是找出編寫者原有的代碼,找出原有的代碼是不可能的。反編譯出來的代碼在可理解性、可閱讀性上,一般而言是非常差的。
3、但是,這並不代碼反編譯出來的「源代碼」沒有價值,對於內行來說,分析反編譯出來的代碼中的某些特定片段,就可以對程序進行破解,找出程序的關鍵點、口令、數據來源等等。因為破壞總是比建設要容易,分析局部比規劃全局要容易得多。
4、如果考慮到被反編譯將關鍵代碼進行特殊處理的話,可能加大相關的難度,比如將特定的字元串分成多個字串在程序中存儲,或是進行加密後存儲,在使用時合成/生成,不用時即時在內存中清除等等……。
5、反編譯後對關鍵部分的定位往往是根據字元串來進行的,比如在用戶沒有注冊時,跳出一行對話,告訴用戶「請注冊後再使用」,破解者就會在反編譯後追查這個字串所在,然後查到這個字串對應的變數與地址,再追查調用這個變數或地址的代碼,然後再延伸查到什麼情況下調用「調用這個變數或地址的代碼」,最後,設定跳過語句。這就是最典型的破解注冊的方法。破解完再將修改了的「源代碼」進行編譯,或是根據「源代碼」直接修正程序中對應的代碼,OK,破解版正式完成。
二、關於加殼。
1、理論上,同樣,沒有破解不了的殼。
2、但是有些加殼軟體使用了一些特別的方法,使得破解殼的難度變得非常難,技術不夠的朋友很難下手,比如將原程序代碼拆分、變型、植入自校驗等等技術。
3、但加殼軟體同樣是程序,它自身就存在被反編的可能,加了殼可以類比成,在一個木箱外面再加個保險櫃。但千萬別以為保險櫃就一定是保險的,面對各種技術開鎖、暴力開箱,再強的保險櫃也只能是加大難度而已。
4、越復雜的加殼,就會使得程序運行時效率降得越低,這是必然的,因為原本只關注目標任務的程序現在還要時時提防著被提取、被監測。

『陸』 如何防止代碼被反編譯

針對代碼反編譯,推薦使用CBS賽博鎖,通過把安全容器內嵌到操作系統中,對容器內的應用和數據進行加鎖,程序和數據在容器內運行,實現最後一米數據安全,防止核心數據被泄露,防止伺服器終端中病毒,防止反編譯,反破解。

『柒』 C#怎樣防止反編譯

我使用的方法是利用加殼工具:virboxProtectorStandalone。直接進行加殼。高級混淆、虛擬化代碼、智能壓縮等加密策略。如果要授權控制,可使用許可版本的virboxProtector。

未經加殼保護的 ILspy 反編譯效果如下:

public int add(int a, int b){
return a + b;}public int div(int a, int b){
return a / b;}public int mul(int a, int b){
return a * b;}public int sub(int a, int b){
return a - b;}

解決方案:

深思自主研發了為 C# .net 語言做保護的外殼(Virbox Protector)。將C# .net 編譯成的執行程序(.exe),動態庫(.dll)直接拖入加殼工具即可完成保護操作,十分方便。並且在效果上已經完全看不到源碼中的邏輯。

加密後的效果

public int add(int a, int b){
return (int)dm.dynamic_method((object)this, System.Reflection.MethodBase.GetCurrentMethod(), 16416u, 21, 16384u, 32u, 31516u, 5).Invoke(this, new object[]
{
this,
a,
b
});}
public int div(int a, int b){
return (int)dm.dynamic_method((object)this, System.Reflection.MethodBase.GetCurrentMethod(), 16956u, 21, 16924u, 32u, 31516u, 2).Invoke(this, new object[]
{
this,
a,
b
});}
public int mul(int a, int b){
return (int)dm.dynamic_method((object)this, System.Reflection.MethodBase.GetCurrentMethod(), 16776u, 21, 16744u, 32u, 31516u, 3).Invoke(this, new object[]
{
this,
a,
b
});}
public int sub(int a, int b){
return (int)dm.dynamic_method((object)this, System.Reflection.MethodBase.GetCurrentMethod(), 16596u, 21, 16564u, 32u, 31516u, 4).Invoke(this, new object[]
{
this,
a,
b
});}

架構支持

IIS 服務架構的後台邏輯 DLL 文件

windows PC 應用程序 EXE 文件

windows PC 應用程序動態庫 DLL 文件

UG等第三方繪圖工具使用的 DLL 文件

Unity3d 編譯使用的 DLL 文件

『捌』 如何防止代碼被反編譯

由於apk是Android虛擬機載入的,它有一定的規范,加密apk後Dalvik無法識別apk了。完全避免是不可能的,總有人能夠破解你的代碼。但是有幾種方式來提高被反編譯取代碼的難度。
1 關鍵代碼使用jni調用本地代碼,用c或者c++編寫,因此相對比較難於反編譯

2 混淆java代碼。混淆是不改變代碼邏輯的情況下,增加無用代碼,或者重命名,使反編譯後的源代碼難於看懂。 網上開源的java代碼混淆工具較多,一般是用ant的方式來編譯的。

1 . 在工程文件project.properties中加入下proguard.config=proguard.cfg , 如下所示:
target=android-8
proguard.config=proguard.cfg
Eclipse會通過此配置在工程目錄生成proguard.cfg文件

2 . 生成keystore (如已有可直接利用)
按照下面的命令行 在D:\Program Files\Java\jdk1.6.0_07\bin>目錄下,輸入keytool -genkey -alias android.keystore -keyalg RSA -validity 100000 -keystore android.keystore
參數意義:-validity主要是證書的有效期,寫100000天;空格,退格鍵 都算密碼。
命令執行後會在D:\Program Files\Java\jdk1.6.0_07\bin>目錄下生成 android.keystore文件。

3. 在Eclipce的操作
File -> Export -> Export Android Application -> Select project -> Using the existing keystore , and input password -> select the destination APK file

經過混淆後的源代碼,原先的類名和方法名會被類似a,b,c。。。的字元所替換,混淆的原理其實也就是類名和方法名的映射。
但4大組件並沒有混淆(所有在清單文件定義的組件不能被混淆),因為系統需要通過清單文件來查找和運行應用程序。

proguard.cfg 文件代碼解讀
-optimizationpasses 5 ->設置混淆的壓縮比率 0 ~ 7
-dontusemixedcaseclassnames -> Aa aA
- ->如果應用程序引入的有jar包,並且想混淆jar包裡面的class
-dontpreverify
-verbose ->混淆後生產映射文件 map 類名->轉化後類名的映射

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* ->混淆採用的演算法.

-keep public class * extends android.app.Activity ->所有activity的子類不要去混淆
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService

-keepclasseswithmembernames class * {
native <methods>; -> 所有native的方法不能去混淆.
}

-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
-->某些構造方法不能去混淆
}

-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}

-keepclassmembers enum * { -> 枚舉類不能去混淆.
public static **[] values();
public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable { -> aidl文件不能去混淆.
public static final android.os.Parcelable$Creator *;
}

『玖』 如何防止C++或C#程序被反編譯

兩者都不能反編譯,c++ 變成機器碼,反匯編就可以。c# 變成 il 位元組碼,ildasm 就能看。
混餚一下,加個殼什麼的比較可行。
然而加殼容易被殺毒軟體殺掉……
混餚下代碼就好了吧。比如 google 的 sdk 都混餚成變數名全部看不懂了。

『拾』 C#如何防止被別人反編譯

C#
編寫的代碼通過VS編譯器生成
dll

exe
,很容易被一些反編譯工具查看到源碼或對源碼進行修改。
為防止代碼被反編譯或被篡改,我們可以進行一定的防範措施。但不能杜絕,因為DotNet編寫代碼運行必須編譯成IL
中間語言,IL是很規則,同時也很好反編譯。
反編譯防範措施:
設置項目代碼反匯編屬性
混淆
方法一:防止
Ildasm.exe(MSIL
反匯編程序)
反匯編程序集
方法很簡單在項目文件AssemblyInfo.cs中增加SuppressIldasm屬性。
當項目中增加SuppressIldasm屬性後在使用ildasm.exe反編譯代碼,會提示:"受保護的模塊
--
無法進行反匯編"
ildasm.exe
讀取項目中包含
SuppressIldasm
屬性就不對此程序集進行反編譯。但ILSyp,Reflector等反編譯工具針對程序集設置SuppressIldasm屬性置之不理,一樣可以反編譯源碼。
缺點:
可見SuppressIldasm
屬性只針對ildasm.exe工具起效果,同時也能刪除ildasm.exe工具的此項限制。參考:《去掉ILDasm的SuppressIldasmAttribute限制》
方法二:混淆
混淆原理:將VS編譯出的文件(exe

dll)通過ildasm對文件進行重命名,字元串加密,移動等方式將原始代碼打亂。這種方式比較常見。
VS2013
自帶混淆工具:工具-->PreEmptive
Dotfuscator
and
Analytics
但VS2013自帶Dotfuscator
5.5
需購買激活才能使用全部功能。目前網路提供
DotfuscatorPro
4.9
破解版版本下載。
打開
DotfuscatorPro
4.9
主界面
Settings->Global
Options
全局配置
常用功能配置:Disable
String
Encryption=NO
啟用字元串加密
選擇需混淆C#編譯代碼(dll

exe)
其中Library不要勾選,否則有些類、變數等等不會混淆;
Rename
重命名配置
常用功能配置:
勾選
=
use
enhanced
overload
inction
使用增強模式
重命名方案
Renaming
Scheme
=
Unprintable
(不可列印字元,即亂碼),也可以選擇其他如小寫字母、大寫字元、數字的方式。
String
Encryption
字元串加密
勾選需要加密字元串文件(exe

dll)
可根據各自需求可進行其他相關配置。(如:control
flow,Output,Setting
->Build
Settings,Settings
-->
Project
Properties等)
最後生成混淆文件
Build
Project。
Build
Project
生成混淆項目錯誤:
Could
not
find
a
compatible
version
of
ildasm
to
run
on
assembly
C:Users***.exe.??This
assembly
was
originally
built
with
.NET
Framework
v4.0.30319.
Build
Error.
處理方法:
ILASM_v4.0.30319
=
C:WindowsMicrosoft.NETFrameworkv4.0.30319ilasm.exe
ILDASM_v4.0.30319
=
C:Program
Files
(x86)Microsoft
SDKsWindowsv8.1AinNETFX
4.5.1
Toolsildasm.exe
[安裝VS版本不同對應目錄會有所變化]
混淆代碼對比
未使用混淆工具,反編譯出的源碼:
使用混淆工具,反編譯出的源碼:
效果很明顯,很難看出反編譯代碼所寫的真正邏輯。
缺點:
C#代碼通過混淆工具生成後,增加了很多轉換過程。這使得反編譯工具無法很直觀看到源碼真正邏輯。但源碼代碼過多轉換會使軟體本身運行效率降低,甚至會出現報錯情況。

閱讀全文

與c代碼怎麼防反編譯相關的資料

熱點內容
web應用安全pdf 瀏覽:47
linuxintel網卡驅動下載 瀏覽:217
資源解壓後怎麼刪除 瀏覽:868
編程之美15種演算法 瀏覽:147
java的圖形用戶界面設計 瀏覽:769
算數游戲源碼 瀏覽:999
壓縮機工作聲音判斷 瀏覽:985
事業單位程序員 瀏覽:506
易語言取相似顏色源碼 瀏覽:773
pyodbclinux 瀏覽:585
vivo為什麼把伺服器沉到深海 瀏覽:460
程序員能為電商做什麼 瀏覽:401
騰訊直充qq號加密碼 瀏覽:140
qt搭建msvc編譯器環境 瀏覽:338
單片機晶振壞了會不會工作不穩定 瀏覽:770
天天影迷APP顯示連接伺服器失敗怎麼回事 瀏覽:961
鋼鐵命令同盟第七關怎麼過 瀏覽:7
android底部控制項彈出 瀏覽:43
為程序員而自豪 瀏覽:583
可以進行c語言編譯的文件名 瀏覽:384