當前位置:首頁 » 編程軟體 » 反編譯需要多少內存

反編譯需要多少內存

發布時間: 2024-08-06 02:18:43

⑴ app可以被反編譯到什麼程度

Android APK中的java代碼可以被反編譯到什麼程度主要看APK的加密程度。

第一種情況:無混淆無加密無加殼。
直接利用Dex2jar和JD-GUI可把源碼從APK里摳出來,代碼邏輯清晰,基本上做到可復用,只是資源文件的引用需要計算一下。

第二種情況:混淆。
通常是利用Proguard做的防護。因為是對jar做的不可逆混淆(除非有mapping),因此不能還原成原來的代碼。但是代碼結構,代碼邏輯一致,只要花長時間對代碼進行梳理一樣可找准核心代碼,解密方法跟第一種一致。

第三種情況:加密。
這里以DexGuard為例。對於這種代碼加密的方法,在程序運行中必定會進行解密,只要抽出它解密的邏輯便可。PS:我自己做過DexGuard的解密,如果用Dex2jar反編譯看的話邏輯是不對的,一定要從Smali代碼看。後來發現網上已經有人做了。
解密的腳本:A look inside Dexguard

第四種情況:加殼。
這種情況跟第三種類似。無論你怎麼加殼,運行的時候必定是Dalvik可識別的Odex代碼,建議直接在內存里mp出來。這里推薦Xpose的ZjDroid。

加固可以在一定程度上保護自己核心代碼演算法,提高破解/盜版/二次打包的難度,緩解代碼注入/動態調試/內存注入攻擊等。
目前市面上有很多第三方加固的平台, 如果新應用發布前需要掃描或者加固的話,可以先試試免費的,例如騰訊御安全,建議自己先去掃描測試下。

⑵ delPhi有反編譯工具嗎

反向工程一直被認為是技術奇才的專有藝術,需要熟悉匯編語言和調試器。下面幾個Delphi反編譯器允許任何人反編譯大多數Delphi可執行文件,即使只有有限的技術知識。 如果你對Delphi程序反向工程感興趣,我建議你看一看以下幾個「反編譯器」:DeDeDeDe是一個非常快的程序,用於分析Delphi編譯的可執行文件。反編譯之後,DeDe會提供以下信息:所有的目標dfm文件。你可以用Delphi打開並編輯它們; 帶有良好的注釋的ASM代碼的所有發布的方法,它涉及字元串、輸入函數調用、類方法調用、單元的組件、Try-Except和Try-Finally塊。默認情況下,DeDe僅僅只獲得已發布方法的源代碼,但如果你通過使用Tools | Disassemble Proc菜單知道RVA偏移量的話,你也可以處理可執行文件中的其他過程。 大量的附加信息。 你可以創建一個帶有所有的dfm、pas、dpr文件的Delphi工程的文件夾。註:pas文件包含上面提及的被良好注釋過的ASM代碼。他們不能被再編譯!RevendeproRevendepro可以找到程序中幾乎所有的結構(類、類型、過程等),並生成pascal表達式、過程則以匯編程序的形式寫出來。由於匯編程序的某些限制,生成的結果不能被在編譯。這個反編譯器的源代碼可以免費獲得。不幸的是,這是唯一一個我不能使用的反編譯器—當試圖用它反編譯某些Delphi可執行文件時,總提示異常。 MRIP這個對用途文件分割器可以從其它文件中尋找和摘取文件。MRIP分割100多種文件格式。對我們而言,最重要的是MRipper可以反編譯任何Delphi可執行文件。該工具可以從Delphi應用程序中摘取所有的資源:cursors(游標)、icons(圖標)、dfm文件、pas文件和其他資源。pas文件不包含事件過程執行。MRIP是一個DOS工具。 DfmExplorer 以下是DfmExplorer的說明(包括原始資料):通過調用Win32 API的「LoadLibrary」或「LoadLibraryEx」函數在內存中載入可執行模塊(EXE\DLL\BPL\DPL)。 通過Win32 API的「EnumResourceName」函數找尋RCDATA資源。 載入每個發現的DFM塊,解碼它並以表的形式(包括它們的名稱)存儲在內存中。 在程序的主窗口我們可以以文本方式可視化所有載入可執行文件的所有的DFM。 最後,程序可以保存到DFM選擇的磁碟,作為ASCII文件(.RC)或作為二進制塊(DAT)連接到可執行文件中。 Exe2Dpr如果你試圖放鬆你的工程源代碼,這個Delphi工程源代碼救助器可以挽救丟失的源碼部分。救助器生成所有的帶已分配屬性和事件的工程表單和數據模塊。生成的事件過程沒有主程序(它不是反編譯器),但又在可執行文件中的代碼地址。這個工具沒有GUI—它使用命令行的形式:'exe2dpr [-o] exeFile'。工程源代碼在當前目錄創建。

⑶ 易語言反破解教程說信息框用自定義窗口就是自己新建窗口,請問新建窗口怎麼做到程序等待或者系統等待效果

4.隨機驗證
隨機驗證很重要,例如你的一處驗證是一直存在的,奸人就很容易地下斷點跟蹤了。因此在軟體啟動時進行一次正常驗證外,其他情況下的驗證最好是隨機的,用30分之一或50分之一的機會進行驗證,這樣奸人會不停地試你的軟體在哪一處進行了驗證,因此破解的時間會相當地長。
加密第14定理:足夠多的隨機驗證足以讓破解者累死。
隨機驗證包括隨機進入不同的驗證子程序。
或隨機中的最大數大一些,只有30分之一的機會驗證。
或在窗口中放上一些顏色與底圖一樣的圖片框,這樣奸人不一定會點擊這里,但用戶萬一點中了,就會觸發驗證。
我們假設所有軟體都能被破解,包括易語言在內,那麼如果他破解的速度跟不上你發布新軟體的速度,那麼他永遠在破最新版而累死。或者說他破解的時間比你寫一個軟體的代價大,這時還不如他直接寫這個軟體來得合算。
反破解的任務之一就是讓奸人累死,或浪費他的生命。
下面的辦法也可以使用:你可以在讀到待驗證的注冊碼、公鑰、注冊文件後,通過定義10000個數組,存入上述同樣的內容以備以後進行驗證,這最多浪費一些內存。驗證時隨機使用其中的一個進行驗證,由於奸人不知你用的是數組中的哪一個進行的比對,而且是隨機的,每次驗證的值都不一樣,不讓奸人吐血才怪呢。
計次循環首(10000,計次)
數組[計次] = 「123456」 』 復制一萬個公開注冊碼或公鑰,破解者知道也無所謂。
計次循環尾
數組[取隨機數(1,10000)]
你不要立刻檢查注冊碼,10000份拷貝你只要以後隨機找一份用就行了,破解的人不知道你正在用的是那一個,同時你可以事先編好且運行時不斷使用一些假的讀取注冊碼數組的調用干擾破解者。這種方法對程序的性能影響微不足到,只是浪費一點內存。因為Debug對內存下斷點的局限,這種情況他要下斷點,累死的就是破解的人了。
5.不同許可權驗證
在啟動時進行一次驗證是非常必要的,這樣讓奸人知道確實是驗證了,以讓他心理放鬆警惕,而這次的驗證只是一部分驗證,並沒有完全驗證。
還有的建議在啟動時將注冊信息讀入後不要進行驗證,保不定在哪裡進行驗證,個人認為這樣讓破解者提高了警惕性,會認為軟體作者很有經驗。麻痹敵人也很重要呀。
例如,在啟動時驗證通過一次,驗證級別加強一級,然後再在其他的地方再進行驗證就可以了。
下面代碼是確認了一個級別
計次循環首(到數值(驗證1),)
已注冊 = 1
計次循環尾()
……
……
在另一個觸發子程序中再通過這個級別再驗證:
計次循環首(已注冊)
計次循環首(到數值(驗證2),)
已注冊 = 2
跳出循環()
計次循環尾()
跳出循環()
計次循環尾()
在其他觸發子程序中再通過這個級別再驗證:
計次循環首(已注冊)
計次循環首(到數值(驗證3),)
已注冊 =3
跳出循環()
計次循環尾()
跳出循環()
計次循環尾()
有時也可以將級別降一降,怎麼降,當然是不考慮級別直接驗證了:
6.忽悠型的GHOFFICE過濾詞語驗證代碼
前面已講過花指令的原理,在程序中人為地再放一些GHOFFICE過濾詞語代碼以忽悠奸人也是一個好辦法。GHOFFICE過濾詞語代碼就是一些假的驗證代碼,基本上是明文的,這樣的代碼上百上千,足以讓奸人累死。
其實對付那些「根據跳轉指令的爆破」高手來說,一個辦法就夠他們頭疼的了,就是你在程序中不明顯加入與判斷是否正版有關的語句,也不做任何提示,以免讓他們順藤摸瓜,而是在判斷為盜版後,跳轉到另一個看似很合理的分支,而那個分支和正版的分支代碼差不多,只是在計算公式或其它演算法上稍動一下,使其運算結果不正確,這樣,他們就在機器碼級別上就分不清哪個是對的,哪個是錯的了,即使他們認為破解成功,其實運行時,得的結果錯誤百出,他們就沒興趣了,呵呵,算損的吧!!!
加密第15定理:大量添加GHOFFICE過濾詞語代碼雖然是無奈之舉,但很管用。
作業1:製作一個常量****器
要求:製作一個常量代碼自動生成器。可隨機生成成百上千個易語言源代碼形式,可直接拷貝到易語言中成為常量。變數也可以這樣製作。
寫好這樣一個程序後,就可以自動生成GHOFFICE過濾詞語代碼,然後復制,粘貼到易語言的常量表中即可。如下圖所示:
變數也可以這樣生成,不過生成的變數可以任意拷貝為全局變數,或程序集變數,或局部變數。製作時的名稱可以為中文名稱,直接編譯後不會在EXE文件中找到同名的中文名稱。因此您可以放心地將這些名稱定義為:「GHOFFICE過濾詞語常量1」、「GHOFFICE過濾詞語變數1」等等以示與正常代碼進行區別。
作業2:製作一個代碼迷亂器
本次作業性質同上,也是自動生成易語言的一些無用GHOFFICE過濾詞語代碼,以迷亂奸人的破解,讓他找到的全是GHOFFICE過濾詞語代碼,從而大大延長了破解時間。
通過直接拷貝編輯框中的內容,粘貼到您的代碼中,可自動完成任務,如下圖所示:
上圖所生成的是一些明文的加密方法的GHOFFICE過濾詞語代碼,讓奸人去研究這些GHOFFICE過濾詞語吧。
上述子程序名稱最好也有時調用一下,反正不會真正產生作用的,用多線程調用最好。
或者您平時注意多收集一些別人用於加密時的子程序,拷貝到一個易語言程序中,保存,這樣的代碼作為GHOFFICE過濾詞語代碼放在你有用的程序中,雖然增加了一些程序的體積,但安全性是大大提高了。並且基本上沒有犧牲軟體性能與穩定性。
7.偽驗證技術
還是先舉一個例子說明吧,易表軟體在10.0版本前已發現有大量的注冊機存在,於是易表作者其後改變了加密方式,易表10.0推出後還是出現了注冊機,並且這種注冊機注冊過的軟體可以使用。於是有些用戶用注冊機取得的注冊碼使用了,過了一段時間,當盜版用戶將重要數據存入易表後,突然有一天資料庫被鎖定了,於是只好注冊易表,並且讓易表作者為資料庫解鎖。
從這里可以基本上判定易表新版本採用了偽驗證技術,即在較為明顯的地方提供了一級驗證,這種驗證方式沒有經過太強的加密,而二級驗證在一定的條件下才觸發,而這個條件是檢查到了用戶輸入了重要的數據,或大量的數據,或使用次數較多。
基本原理是注冊文件由前後兩個注冊碼拼接而成。一般情況下只進行第一個注冊碼的驗證,而當條件成熟時進行第二個注冊碼驗證。
這是一種雙贏的策略,易表作者即收到了注冊費,付費的人還會道歉,並且感謝易表作者。哈哈,大家要學習這招哦。
但本辦法對於資料庫應用及數據量大時檢查最好,而對於一些沒有生成數據的用戶無效。
發布軟體的時候發布自己編寫的注冊機,弄個假破解版,那麼想破解的就可能不來了,即使有真的破解,誰會有自己給自己寫假破解快啊!可能假破解版中只破解一半,等用戶使用了,有數據了再鎖定,讓他們注冊後再給解鎖,付了錢還要謝謝你,哈哈,損招,但有用!
加密第16定理:偽驗證可以迷惑一般破解者,甚至自己發布一個偽注冊機。
8.定時驗證、延時驗證、客戶數據集累驗證
過一段時間後再驗證,如你在2005年1月發布一個軟體,那麼就內定2005年6月後觸發驗證機會。
或您的軟體是一個資料庫產品,那麼您可以在程序中設置如果資料庫大於5MB時就進行驗證,並且最好您能確定這些數據是不重復的,刻意加入的。
如易表設置了偽驗證,這時市場上出現了新的注冊機,當用戶用這個注冊機後,提示是注冊成功了,但當用戶輸入重要數據後的某個日子,突然打不開資料庫了,用戶很著急,因為以為是破解成功了,所以將重要的資料輸入了,只能拿錢向易表作者進行注冊了。而且還千恩萬謝,後悔自己不該用破解。哈哈,一舉兩得呀。
這個方法對於資料庫應用軟體來說是絕好的辦法。
作業:製作一個演算法程序放在你的資料庫軟體中,這個子程序可以統計你的資料庫軟體使用時,用戶輸入的是否是拷貝的東西,還是正常的數據。當統計到1000時觸發驗證。方法思路為:可以通過查看用戶有沒有使用復制與粘貼快捷鍵,或資料進行排序,如果有大量重復的,就說明是奸人在拷貝數據破解,否則是一個資料一個資料的輸入的,說明是正常使用的重要資料,這時進行對比就好了。
本方法對有資料的破解使用者有極好的控製作用,通過第6條的偽驗證技術與本技術結合,那麼就可以知道是不是正版用戶,並且可以鎖定資料庫,等他注冊後再給他解鎖。
加密第17定理:加密的結果應該是雙贏,偽驗證是一個上策。
9.驗證與專業知識相結合技術
將驗證與專業知識相結合,讓奸人必須學習專業知識後才能真正去破解,這樣所花的功夫比自己寫一個軟體的代價還要大,而有的專業知識不是專家是不知道的,因此是一個較好的加密方法。
前述中採用了「到數值(驗證1())」這樣的代碼返回的是0或1兩者之間的一個數,可以用乘法進行混合計算,如:
音量 = 播放位置X到數值(驗證1())
當驗證正確時返回的是1,這時的結果是正確的,否則返回0,這時的結果為0,是錯誤的。
這樣的代碼可以混合到您的專業知識中,如:算命軟體可將天乾地支、生辰八字中的某個地方進行此類計算,計算類軟體可以將某種特殊的計算過程如此結合計算,繪圖類軟體可將繪圖中的演算法部分加入此類計算,音響設計類、機床設計軟體……
加密第18定理:你知道的專業知識,破解者不一定了解哦。讓專業知識與驗證相結合吧。
10.偽裝,用易語言寫自有支持庫
大家可以將DLL文件的擴展名改為易語言的支持庫文件FNE擴展名,這樣進行非獨立編譯後,與其他FNE文件混合在一起,甚至您可以用易語言寫一個支持庫,將其中一部分作為驗證部分。
易語言的支持庫文件FNE文件其實就是一個DLL文件,只不過擴展名改變了而已,用易語言寫支持庫的方法金眼睛已發過一篇貼子,進行過說明,請大家在易語言論壇上搜索金眼睛的貼子就可以找到了。
作業:找到金眼睛關於用易語言寫支持庫的貼子,並且自己寫一個支持庫。
11.絕妙的暗樁設置
應該想到的用代碼實現的暗樁前面都講了不少,下面是一些特別的暗樁供奸人品味的。
大家可以在一些不起眼的地方再放一些暗樁,如:在窗口最小化事件中隨機驗證,如在某個組件滑鼠被移動事件中驗證,
有時需要將數據完整性驗證放在更高一級的驗證中,不要一上來就檢查文件是否被更改。
同一驗證可以使用多次,這樣奸人認為你已經驗證過了,沒有必要會再驗證一次,而相反這時又產生了驗證,讓奸人防不勝防。如啟動時就立即檢查程序完整性,如果發現被更改,那就立即退出程序,而在一些子程序中也隨機放這樣的驗證。
更多的暗樁大家自己設計最好。
加密第19定理:加密重要的是暗樁的設置,破解不完全就是一個無效破解。
12.發布不完整版本
有的軟體作者在發布共享軟體時,放在外面的是不完整版本,將更多的數據資料在注冊後提供。這樣做也可以,只是麻煩一些而已。如有的圖形製作軟體,將圖片資源另外打包,用戶注冊後再給完全版的圖片。
也有的將DLL文件中的驗證部分作了空處理,而在注冊後提供真正的注冊DLL文件及注冊碼。還有的直接將KEY文件放在了DLL文件中另外提供。
加密第20定理:不要發布完整版本,以靜制動。
13.程序、數據結合加密技術
把程序運行所必需要的資源放到一個資料庫文件中,給這個資料庫設密碼,密碼是主程序的數據摘要變換後的結果。程序運行是先驗證有沒有注冊,如果已經注冊,就對運行程序本身(取執行文件名())取數據摘要,用自己設計的演算法多次變換後形成一個字串,用該字串作為資料庫的密碼打開資料庫文件。如果打開資料庫失敗,就說明主程序被人修改了,終止程序運行即可。(不終止也沒戲,程序找不到運行所需的資源。)
另外設計一個程序,用同樣的演算法算出資料庫密碼,然後給資料庫加密即可。
密碼形成演算法建議使用大數支持庫。但如果是匯編高手用匯編寫注冊機的話,會直接將支持庫的所有反匯編碼抄進去就可以了,問題是他們有沒有時間搞。
14.自定義演算法
前面講過採用RSA與數值計算支持庫交叉計算的辦法,這就是一種自有的演算法,如果能用上數值計算支持庫中的矩陣、傅麗葉變換等高級功能就更好了。
多重RSA交叉打亂:大家也可以多用一些RSA密鑰,如用5個,10個都無所謂,重要的是將這些注冊碼都打亂,讓奸人哭死。打亂的方法就是你自己獨創的方法了。
更多的自有演算法就要靠大家自己去研究了。祝大家好運。
加密第21定理:加密不反對古怪和變態的方法,鼓勵哦。
15.加密框圖
下面給出一個加密的設計框圖,大家可以根據自己的實際情況改變加密的策略:
圖中主程序外圍進行了花指令編譯,並且用加普通殼進行保護。脫殼了也無所謂,因為設置了暗樁,隨機檢查。
圖中表示主程序運行後,首先進行了常規的注冊碼第一次驗證,找有沒有注冊文件。如果這個被破解,注冊碼應該是一個短的RSA,而真正的注冊碼是三個RSA的疊加。會生成偽注冊機也無所謂。
主程序中用暗樁的形式對窗口標題、版權信息進行驗證,這是考慮到如果一啟動就驗證這些很容易被奸人看出來從而會跳過去。因此用一些隨機,或分級,或條件法取得不固定的驗證。
主程序中用暗樁的方式對加殼後主程序的完整性進行校驗,這個也不要放在常規的驗證中,否則很容易被跳過去。可以查文件長度,MD5或CRC32都可以上。
主程序中用暗樁的方式加入了反調試模塊。
主程序中布滿GHOFFICE過濾詞語驗證代碼。並且源代碼有備注,不會搞錯的。
主程序在某個條件下隨機進行第二級驗證,從注冊碼中取第二段數據,如果注冊碼長度不夠且取不到第二段數據,那麼就說明已使用了偽注冊機,將用戶的資料庫鎖定,等他付錢來注冊。
主程序在一個條件下再激活驗證,從注冊碼文件中取第三段數據,如果注冊碼長度不夠,且取不到第三段數據,那麼就說明已使用了偽注冊機,將用戶的資料庫鎖定,等他付錢來注冊。
編程中還注意將加密的字元串攪亂且分不同地方存放,用吳氏加密命令加密重要數據,也可加入數值計算支持庫的演算法,也可以加入一些懲罰手段,也可以再加入自己的一些演算法。
以下是一些人的編程體會摘錄,基本未改其中的內容,在此表示感謝!
附錄1加密已形成密碼學
我引用《應用密碼學》作者的話:
世界上有兩種密碼:一種是防止你的小妹妹看你的文件;另一種是防止奸人閱讀你的文件資料。
如果把一封信鎖在保險櫃中,把保險櫃藏在紐約的某個地方…,然後告訴你去看這封信。這並不是安全,而是隱藏。相反,如果把一封信鎖在保險櫃中,然後把保險櫃及其設計規范和許多同樣的保險櫃給你,以便你和世界上最好的開保險櫃的專家能夠研究鎖的裝置。而你還是無法打開保險櫃去讀這封信,這樣才是安全的。
意思是說,一個密碼系統的安全性只在於密鑰的保密性,而不在演算法的保密性。
對純數據的加密的確是這樣。對於你不願意讓他看到這些數據(數據的明文)的人,用可靠的加密演算法,只要破解者不知道被加密數據的密碼,他就不可解讀這些數據。
但是,軟體的加密不同於數據的加密,它只能是「隱藏」。不管你願意不願意讓他(合法用戶,或 Cracker)看見這些數據(軟體的明文),軟體最終總要在機器上運行,對機器,它就必須是明文。既然機器可以「看見」這些明文,那麼 Cracker,通過一些技術,也可以看到這些明文。
於是,從理論上,任何軟體加密技術都可以破解。只是破解的難度不同而已。有的要讓最高明的 Cracker 忙上幾個月,有的可能不費吹灰之力,就被破解了。
所以,反盜版的任務(技術上的反盜版,而非行政上的反盜版)就是增加 Cracker 的破解難度。讓他們花費在破解軟體上的成本,比他破解這個軟體的獲利還要高。這樣 Cracker 的破解變得毫無意義——誰會花比正版軟體更多的錢去買盜版軟體 ?
然而,要做到「難破解」,何嘗容易? Sony 曾宣稱的超強反盜版(Key 2 Audio音樂 CD反盜版),使用了很尖端的技術,然而最近卻被一枝記號筆破解了,成為人們的飯後笑料!
所以,很多看上去很好的技術,可能在 Cracker 面前的確不堪一擊。就像馬其諾防線一樣,Cracker 不從你的防線入手,而是「繞道」。這樣,讓你的反盜版技術在你做夢也想不到的地方被 Crack 了。
為什麼會這樣呢 ?歸根到底是因為軟體在機器上運行,並且軟體和機器是分離的——這一點是關鍵,如果軟體和硬體完全綁定,不能分離,是可以做到象 IDEA 之類幾乎不可破解的系統的。這將在後面談傳統軟體保護技術時詳細說明。
對我的這個解決方案,我不能保證Crack高手在幾天之內不能破解它,我只能說:「在這個軟體中,我盡量堵住了當前破解者普遍使用的方法以及「我想得到」的可能的缺口。」但是我相信,傾注了我三個月心血的反盜版軟體,決不是一個「玩具式」的反盜版軟體。
附錄2《如何用簡單方法防止破解》
北極異型
在Debug的手冊里可以看到Debug工具的局限:第一個局限是只能下4個內存區域的斷點,每個斷點不能控制超過兩個位元組,這樣內存斷點不能控制超過16個位元組的區域;第二個局限是對多線程只能同時跟蹤一個線程。
假設你的注冊部分有300行,你可以分成30個子程序調用或重復的func1(),func2()... func30()。將他們隨意放到程序的各個部分,一定不能放在一起(自己能找到就行了)。不要用Memcpy等常用系統調用拷貝注冊碼,盡可能自己寫,像Memcpy很好寫,性能差點無所謂。經過編譯後inline函數展開,注冊部分和其他代碼混在一起,他要寫出注冊機就像大海里撈針,在幾十萬甚至上百萬匯編代碼里找出有用的注冊部分。
利用Debug的第一個局限最重要的一點是:注冊碼也不要放在一起,假設你的注冊碼是12位,千萬不要用一個12位的數組放注冊碼,你可以在程序的不同位置定義12個全局字元變數,每個放一位,這樣注冊碼在內存就不連續了。最好再加密處理一下(簡單的字元異或就可以),驗證時再解密。也不要用連續內存保存驗證用到的變數,盡量將用到的驗證臨時變數分散定義在程序的不同處,再在驗證中,不斷轉移一些值到其他變數中,對付暴力和Loader會比較有效。
沒有必要用復雜的加密演算法,更容易成為追蹤的目標。只要你將注冊部分隱藏的足夠好,也沒有漏洞,你花1天寫的加密演算法,破解者可能會花100-1000倍的時間破解。大部分人都會放棄。
你將注冊做在一起,就像將你的財寶放在現代保險箱里,雖然非常堅固難以解密,對於開鎖高手兩分鍾就打開了。
而古代海盜用的方法是將財寶埋在海島上,這樣沒有藏寶圖,對所有高手和低手都只有一條路,拿一把鐵撬挖,可能要挖一生。程序有那麼多代碼,反編譯出來可能超過百萬行,你將注冊部分藏在裡面,藏的好就如同將財寶埋在海島里。那些所謂的Crackme只是給高手玩兒的現代保險箱而已,用原始的方法可以達到同樣效果。

⑷ 如何防止程序員反編譯

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代碼

  • publicclassDemo{

  • publicstaticvoidmain(String[]args){

  • System.out.println(「helloworld!」);

  • }

  • }

  • 上面這段代碼,大家都認識。但我要問的是:如果我們使用javac對其進行編譯,然後使用java使其運行(為什麼不在Eclipse中使用Runas功能呢?因為Eclipse幫我們封閉,從而簡化了太多東西,使我們忽略了太多的底層細節,只有從原始的操作上,我們才能看到本質),那麼,它是怎麼載入到JVM中的?答案是:通過AppClassLoader載入的(相關知識點可以參考:http://hxraid.iteye.com/blog/747625)!如果不相信的話,可以輸出一下System.out.println(Thread.currentThrea().getContextLoader());看看。

    那又有一個新的問題產生了:ClassLoader又是怎樣載入class的呢?其實,AppClassLoader繼承自java.lang.ClassLoader類,所以,基本操作都在這個類裡面,讓我們直接看下面這段核心代碼吧:



    看到這里,已經沒有必要再往下面看了(再往下就是native方法了,這是一個重大伏筆哦),我們要做的手腳就在這里!

    手腳怎麼做呢?很簡單,上面的代碼邏輯告訴我們,ClassLoader只是拿到class文件中的內容byte[],然後交給JVM初始化!於是我們的邏輯就簡單了:只要在交給JVM時是正確的class文件就行了,在這之前是什麼樣子無所謂!所以,我們的加密的整個邏輯就是:

  • 在編譯代碼時(如使用ant或maven),使用插件將代碼進行加密(加密方式自己選),將class文件裡面的內容讀取成byte[],然後進行加密後再寫回到class文件(這時候class文件裡面的內容不是標準的class,無法被反編譯了)

  • 在啟動項目代碼時,指定使用我們自定義的ClassLoader就行了,而自定義的部分,主要就是在這里做解密工作!

  • 如此,搞定!以上的做法比較完整的闡述,可以仔細閱讀一下這篇文章:https://www.ddtsoft.com/#developerworks/cn/java/l-secureclass/文章中的介紹。

    通過這個方法貌似可以解決代碼反編譯的問題了!錯!這里有一個巨大的坑!因為我們自定義的ClassLoader是不能加密的,要不然JVM不認識,就全歇菜了!如果我來反編譯,呵呵,我只要反編譯一下這個自定義的ClassLoader,然後把裡面解密後的內容寫到指定的文件中保存下來,再把這個加了邏輯的自定義ClassLoader放回去運行,你猜結果會怎樣?沒錯,你會想死!因為你好不容易想出來的加密演算法,結果人家根本不需要破解,直接就繞過去了!

    現在,讓我們總結一下這個方法的優缺點:實現方式簡單有效,同時對代碼幾乎沒有侵入性,不影響正常開發與發布。缺點也很明顯,就是很容易被人破解!

    當然啦,關於缺點問題,你也可以這么干:先對所有代碼進行混淆、再進行加密,保證:1、不容易找到我們自定義的那個ClassLoader;2、就算找到了,破解了,代碼可讀性還是很差,讓你看得吐血!(有一篇文章,我覺得寫得不錯,大家可以看一看:http://www.scjgcj.com/#blog/851544)

    嗯,我覺得這個方法很好,我自己也差點被這個想法感動了,但是,作為一個嚴謹的程序員,我真的不願意留下一個隱患在這里!所以,我繼續思索!

    高級加密class

    前面我們說過有個伏筆來著,還記得吧?沒錯,就是那個native!native定義的方法是什麼方法?就是我們傳說中的JNI調用!前面介紹過的有一篇文章中提到過,其實jvm的真實身份並不是java,而是c++寫的jvm.dll(windows版本下),java與dll文件的調用就是通過JNI實現的!於是,我們就可以這樣想:JNI可以調用第三方語言的類庫,那麼,我們可不可以把解密與裝載使用第三方語言寫(如C++,因為它們生成的庫是不好反編譯的),這樣它可以把解密出來的class內容直接調jvm.dll的載入介面進行初始化成class,再返回給我們的ClassLoader?這樣,我們自定義的ClassLoader只要使用JNI調用這個第三方語言寫的組件,整個解密過程,都在黑盒中進行,別人就無從破解了!

    嗯,這個方法真的很不錯的!但也有兩個小問題:1.使用第三方語言寫,得會第三方語言,我說的會,是指很溜!2.對於不同的操作系統,甚至同一操作系統不同的版本,都可能要有差異化的代碼生成對應環境下的組件(如window下是exe,linux是so等)!如果你不在乎這兩個問題,我覺得,這個方式真的挺不錯的。但對於我來說,我的信條是,越復雜的方式越容易出錯!我個人比較崇尚簡潔的美,所以,這個方法我不會輕易使用!

    對了,如果大家覺得這個方法還算可行的話,可以推薦一個我無意中看到的東西給大家看看(我都沒有用過的):jinstall,

    更改JVM

    看到這個標題,我想你可能會震驚。是的,你沒看錯,做為一個程序員,是應該要具有懷疑一切、敢想敢做的信念。如果你有意留心的話,你會發現JVM版本在業界其實也有好幾個版本的,如:Sun公司的、IBM的、Apache的、Google的……

    所以,不要阻礙自己的想像力,現在沒有這個能力,並不代表不可能。所以,我想到,如果我把jvm改了,在裡面對載入的類進行解密,那不就可以了嗎?我在設計構思過程中,突然發現:人老了就是容易糊塗!前面使用第三方語言實現解密的兩個問題,正好也是更改JVM要面對的兩個問題,而且還有一個更大的問題:這個JVM就得跟著這個項目到處走啊!

⑸ 如何反編譯EXE執行文件

C32asm 可反編譯成匯編文件
http://www.25it.net/SoftView.Asp?SoftID=227
C32asm 是一款非常不錯的國產靜態反編譯工具!
C32Asm現具有如下功能:
快速靜態反編譯PE格式文件(Exe、Dll等)
提供Hex文件編輯功能,功能強大
提供內存Dump、內存編輯、PE文件Dump、PE內存ImageSize修正等多種實用功能
提供內存反匯編功能,提供匯編語句直接修改功能,免去OPCode的直接操作的繁瑣
提供反編譯語句彩色語法功能,方便閱讀分析,能方便自定義語法色彩
提供輸入表、輸出表、參考字元、跳轉、調用、PE文件分析結果等顯示
提供方便的跳轉、調用目標地址的代碼顯示
提供匯編語句逐位元組分析功能,有助於分析花指令等干擾代碼

⑹ 如何修改EXE文件

exe文件信息一般不能直接更改,因為是編譯好的,並且一般都加了殼。
想改的話,得用脫殼了吧。不同的文件有可能用了不同的軟體加了殼。
用各類脫殼工具測試並脫殼後,再反編譯,有可能得到相關文件信息並更改。

(一)殼的概念

作者編好軟體後,編譯成exe可執行文件。 1.有一些版權信息需要保護起來,不想讓別人隨便改動,如作者的姓名,即為了保護軟體不被破解,通常都是採用加殼來進行保護。 2.需要把程序搞的小一點,從而方便使用。於是,需要用到一些軟體,它們能將exe可執行文件壓縮, 3.在黑客界給木馬等軟體加殼脫殼以躲避殺毒軟體。實現上述功能,這些軟體稱為加殼軟體。

(二)加殼軟體最常見的加殼軟體ASPACK ,UPX,PEcompact 不常用的加殼軟體WWPACK32;PE-PACK ;PETITE NEOLITE

(三)偵測殼和軟體所用編寫語言的軟體,因為脫殼之前要查他的殼的類型。 1.偵測殼的軟體fileinfo.exe 簡稱fi.exe(偵測殼的能力極強) 2.偵測殼和軟體所用編寫語言的軟體language.exe(兩個功能合為一體,很棒) 推薦language2000中文版(專門檢測加殼類型) 3.軟體常用編寫語言Delphi,VisualBasic(VB)---最難破,VisualC(VC)

(四)脫殼軟體。 軟體加殼是作者寫完軟體後,為了保護自己的代碼或維護軟體產權等利益所常用到的手段。目前有很多加殼工具,當然有盾,自然就有矛,只要我們收集全常用脫殼工具,那就不怕他加殼了。軟體脫殼有手動脫和自動脫殼之分,下面我們先介紹自動脫殼,因為手動脫殼需要運用匯編語言,要跟蹤斷點等,不適合初學者,但我們在後邊將稍作介紹。

加殼一般屬於軟體加密,現在越來越多的軟體經過壓縮處理,給漢化帶來許多不便,軟體漢化愛好者也不得不學習掌握這種技能。現在脫殼一般分手動和自動兩種,手動就是用TRW2000、TR、SOFTICE等調試工具對付,對脫殼者有一定水平要求,涉及到很多匯編語言和軟體調試方面的知識。而自動就是用專門的脫殼工具來脫,最常用某種壓縮軟體都有他人寫的反壓縮工具對應,有些壓縮工具自身能解壓,如UPX;有些不提供這功能,如:ASPACK,就需要UNASPACK對付,好處是簡單,缺點是版本更新了就沒用了。另外脫殼就是用專門的脫殼工具來對付,最流行的是PROCDUMP v1.62 ,可對付目前各種壓縮軟體的壓縮檔。在這里介紹的是一些通用的方法和工具,希望對大家有幫助。我們知道文件的加密方式,就可以使用不同的工具、不同的方法進行脫殼。下面是我們常常會碰到的加殼方式及簡單的脫殼措施,供大家參考: 脫殼的基本原則就是單步跟蹤,只能往前,不能往後。脫殼的一般流程是:查殼->尋找OEP->Dump->修復 找OEP的一般思路如下: 先看殼是加密殼還是壓縮殼,壓縮殼相對來說容易些,一般是沒有異常,找到對應的popad後就能到入口,跳到入口的方式一般為。 我們知道文件被一些壓縮加殼軟體加密,下一步我們就要分析加密軟體的名稱、版本。因為不同軟體甚至不同版本加的殼,脫殼處理的方法都不相同。

常用脫殼工具: 1、文件分析工具(偵測殼的類型):Fi,GetTyp,peid,pe-scan, 2、OEP入口查找工具:SoftICE,TRW,ollydbg,loader,peid 3、mp工具:IceDump,TRW,PEditor,ProcDump32,LordPE 4、PE文件編輯工具PEditor,ProcDump32,LordPE 5、重建Import Table工具:ImportREC,ReVirgin 6、ASProtect脫殼專用工具:Caspr(ASPr V1.1-V1.2有效),Rad(只對ASPr V1.1有效),loader,peid(1)Aspack: 用的最多,但只要用UNASPACK或PEDUMP32脫殼就行了 (2)ASProtect+aspack:次之,國外的軟體多用它加殼,脫殼時需要用到SOFTICE+ICEDUMP,需要一定的專業知識,但最新版現在暫時沒有辦法。 (3)Upx: 可以用UPX本身來脫殼,但要注意版本是否一致,用-D 參數 (4)Armadill: 可以用SOFTICE+ICEDUMP脫殼,比較煩 (5)Dbpe: 國內比較好的加密軟體,新版本暫時不能脫,但可以破解 (6)NeoLite: 可以用自己來脫殼 (7)Pcguard: 可以用SOFTICE+ICEDUMP+FROGICE來脫殼 (8)Pecompat: 用SOFTICE配合PEDUMP32來脫殼,但不要專業知識 (9)Petite: 有一部分的老版本可以用PEDUMP32直接脫殼,新版本脫殼時需要用到SOFTICE+ICEDUMP,需要一定的專業知識 (10)WWpack32: 和PECOMPACT一樣其實有一部分的老版本可以用PEDUMP32直接脫殼,不過有時候資源無法修改,也就無法漢化,所以最好還是用SOFTICE配合 PEDUMP32脫殼 我們通常都會使用Procmp32這個通用脫殼軟體,它是一個強大的脫殼軟體,他可以解開絕大部分的加密外殼,還有腳本功能可以使用腳本輕松解開特定外殼的加密文件。另外很多時候我們要用到exe可執行文件編輯軟體ultraedit。我們可以下載它的漢化注冊版本,它的注冊機可從網上搜到。ultraedit打開一個中文軟體,若加殼,許多漢字不能被認出 ultraedit打開一個中文軟體,若未加殼或已經脫殼,許多漢字能被認出 ultraedit可用來檢驗殼是否脫掉,以後它的用處還很多,請熟練掌握例如,可用它的替換功能替換作者的姓名為你的姓名注意位元組必須相等,兩個漢字替兩個,三個替三個,不足處在ultraedit編輯器左邊用00補。

常見的殼脫法:

(一)aspack殼 脫殼可用unaspack或caspr 1.unaspack ,使用方法類似lanuage,傻瓜式軟體,運行後選取待脫殼的軟體即可. 缺點:只能脫aspack早些時候版本的殼,不能脫高版本的殼 2.caspr第一種:待脫殼的軟體(如aa.exe)和caspr.exe位於同一目錄下,執行windows起始菜單的運行,鍵入 caspr aa.exe脫殼後的文件為aa.ex_,刪掉原來的aa.exe,將aa.ex_改名為aa.exe即可。使用方法類似fi 優點:可以脫aspack任何版本的殼,脫殼能力極強缺點:Dos界面。第二種:將aa.exe的圖標拖到caspr.exe的圖標上***若已偵測出是aspack殼,用unaspack脫殼出錯,說明是aspack高版本的殼,用caspr脫即可。 (二)upx殼 脫殼可用upx待脫殼的軟體(如aa.exe)和upx.exe位於同一目錄下,執行windows起始菜單的運行,鍵入upx -d aa.exe (三)PEcompact殼 脫殼用unpecompact 使用方法類似lanuage傻瓜式軟體,運行後選取待脫殼的軟體即可 (四)procmp 萬能脫殼但不精,一般不要用 使用方法:運行後,先指定殼的名稱,再選定欲脫殼軟體,確定即可脫殼後的文件大於原文件由於脫殼軟體很成熟,手動脫殼一般用不到。

三、壓縮與脫殼

現在脫殼一般分手動和自動兩種,手動就是用TRW2000、TR、SOFTICE等調試工具對付,對脫殼者有一定水平要求。而自動就稍好些,用專門的脫殼工具來脫,最常用某種壓縮軟體都有他人寫的反壓縮工具對應,有些壓縮工具自身能解壓,如UPX;有些不提供這功能,如:ASPACK,就需要UNASPACK對付。很多文件使用了一些壓縮加殼軟體加密過,這就需要對文件進行解壓脫殼處理後,才能漢化。這種壓縮與我們平時接觸的壓縮工具如winzip,winrar等壓縮不同,winzip和winrar等壓縮後的文件不能直接執行,而這種 EXE 壓縮軟體,EXE文件壓縮後,仍可以運行。這種壓縮工具把文件壓縮後,會在文件開頭一部分,加了一段解壓代碼。執行時該文件時,該代碼先執行解壓還原文件,不過這些都是在內存中完成的,由於微機速度快,我們基本感覺不出有什麼不同。這樣的程序很多,如 The bat,Acdsee,Winxfile等等。

要脫殼就應先了解常用壓縮工具有哪些,這樣知己知彼,如今越來越多的軟體商喜歡用壓縮方式發行自己的產品,如The bat!用UPX壓縮,ACDSEE3.0用ASPACK壓縮等。它有以下因素:一是:微機性能越來越好,執行過程中解壓使人感覺不出來,用戶能接受(給軟體加殼,類似WINZIP 的效果,只不過這個加殼壓縮之後的文件,可以獨立運行,解壓過程完全隱蔽,都在內存中完成。解壓原理,是加殼工具在文件頭里加了一段指令,告訴CPU,怎麼才能解壓自己。現在的CPU都很快,所以這個解壓過程你看不出什麼異常。因為軟體一下子就打開了,只有你機器配置非常差,才會感覺到不加殼和加殼後的軟體運行速度的差別。)。 二是:壓縮後軟體體積縮小,便於網路傳輸。三是:增加破解的難度。首先,加殼軟體不同於一般的winzip,winrar等壓縮軟體.它是壓縮exe可執行文件的,壓縮後的文件可以直接運行.而winzip,winrar等壓縮軟體可壓縮任何文件,但壓縮後不能直接運行。很多站點不允許上傳可執行文件,而只能上傳壓縮的文件,一方面處於速度考慮,也是為了安全性考慮。用加殼軟體壓縮的文件就是體積縮小,別的性質沒改變。還是EXE文件,仍可執行,只是運行過程和以前不一樣了。壓縮工具把文件壓縮後,在文件開頭一部分,加了一段解壓代碼。執行時該文件時,該代碼先執行解壓還原文件,不過這些都是在內存中完成的,由於微機速度快,我們基本感覺不出有什麼不同。

⑺ 一個小程序反編譯,誰會破解exe文件,能繞過驗證碼

……都不用說了……7ZIP加上SIXXPACK估計沒人脫得掉了

用VS調試可以到驗證的地方通過改EIP可以跳過驗證但是不能得到內存的地址只是知道那個函數叫ZhuCe.Check……

反編譯這個文件裡面除了MANIFEST就兩塊東西……sevenzip和sixxpack……

這兩個不用說都知道是什麼了……又得不到內存地址不知道是不是我的VS設置有問題反正看不到函數所在的內存要不然內存補丁都行……

還有哪位牛人自認為真的很牛的可以來試試看我試過了IDAODSmartCheckVBExplorer都不行的……只有VS的調試器可以……

(PS.分數給我好不好……呵呵我加了你的)

⑻ VB反編譯還原代碼 求助

如果說 VB3、VB4 還有可能的話,那麼 VB5、VB6 反編譯就是完全的痴人說夢了,VB6 已經不是純粹的解釋性語言了,根本不可能反編譯出完整的源代碼,對於這種語言寫出來的程序,只能獲得中間語言或低級語言。一般來說 VB6 都是 P 代碼,而 P-Code 的代碼逆向回來只能自己看,機器是識別不了的。

舉個例子:

比如在 VB6 中有一句代碼 : MsgBox "Decompile Test."

那麼反編譯出來的結果就是:

(代碼太長不貼,這里貼主要的)
...

mov dword ptr [ebp-58], 004012E4 ; 這里把 "Decompile Test."的地址弄進去了。
...

call dword ptr [<&MSVBVM60.__vbaVarDup>]; 可以清楚的看出來,復制了一份變數的句柄。因為VB里字元串指向的是內存地址。
...

call dword ptr [<&MSVBVM60.#595>] ; 這一句彈出了MsgBox.這里如果跟進去的話是一大堆API 。
...

所以正常反編譯(學匯編語言和計算機編譯原理去吧)的話,看到段了就會知道這是一個 Msgbox 函數,但是具體顯示的內容是什麼,那是根本看不出來的。

P.S. 針對樓上[你不懂就別亂說]說的插一嘴,未加殼的 .NET 為何能被反編譯出源代碼,那是因為 .NET 是託管,而託管有中間語言,所以它的源代碼被編譯成 msil 這種中間語言而非像 VB6 直接編譯成機器語言了。

熱點內容
qq訪問問題 發布:2024-11-06 23:29:20 瀏覽:648
手機郵件接收伺服器怎麼設置 發布:2024-11-06 23:23:35 瀏覽:128
c語言循環例題 發布:2024-11-06 23:05:01 瀏覽:332
外星人m15r6選哪個配置 發布:2024-11-06 23:03:58 瀏覽:999
linuxmysql資料庫安裝 發布:2024-11-06 23:01:28 瀏覽:117
壓縮器能幹嘛 發布:2024-11-06 23:01:16 瀏覽:464
分布式存儲演算法 發布:2024-11-06 22:55:09 瀏覽:872
住宅區弱電有哪些強制配置規定 發布:2024-11-06 22:51:22 瀏覽:827
資料庫綁定 發布:2024-11-06 22:50:31 瀏覽:651
巧飯巧算演算法 發布:2024-11-06 22:44:49 瀏覽:853