代碼解混淆
A. js混淆後的代碼如何解密
混淆的作用就是用無意義的關鍵字元替代原來有意義的關鍵字元,讓瀏覽者「看不懂」代碼,不了解代碼的運行邏輯,也就無法復用。
混淆不同於加密解密,因為原來有意義的字元已經被替換了,不存在演算法上的反推,任何的技術不可能再得出原來的那些有意義的字元。
所以理論上,混淆後的代碼無法解密。但因為它的整個運算邏輯關系鏈是完整的,與混淆前的代碼關系鏈是完全一致的,所以非要「破解」,只能說摸清它的邏輯關系鏈,人為去做的話,燒腦又復雜。技術上需要一定的運算能力來做這個工作,比如雲計算甚至超級計算機,但即便「破解」,它也是只能分析出一個函數大致是干什麼用的,原來的關鍵字元名稱還是不可能得出。
B. 解密php混淆代碼,求解碼(過程)完整方法。。
不知道你給的代碼全不全,解密後只有這一段
<?php
$v000000=;
if(preg_match(O0O0000O0('.'),$v000002[1],$v000003))
{
$v000000=str_replace(O0O0000O0(',,$y[0]);
$content=str_replace('),,$v000000);
$v000000=base64_decode($v000000);
}
?>
C. JS代碼混淆了,怎麼反混淆回去
js反混淆需要藉助第三方工具:
1、在網路搜索js混淆還原
D. 混淆過的代碼有辦法還原嗎
工具:
apktool,作用:資源文件獲取,可以提取出圖片文件和布局文件進行使用查看
dex2jar,作用:將apk反編譯成java源碼(classes.dex轉化成jar文件)
jd-gui,作用:查看APK中classes.dex轉化成出的jar文件,即源碼文件
反編譯流程:
一、apk反編譯得到程序的源代碼、圖片、XML配置、語言資源等文件
下載上述工具中的apktool,解壓得到3個文件:aapt.exe,apktool.bat,apktool.jar ,將需要反編譯的APK文件放到該目錄下,
打開命令行界面(運行-CMD) ,定位到apktool文件夾,輸入以下命令:apktool.bat d -f test.apk test
(命令中test.apk指的是要反編譯的APK文件全名,test為反編譯後資源文件存放的目錄名稱,即為:apktool.bat d -f [apk文件 ] [輸出文件夾])
獲取成功之後,發現在文件夾下多了個test文件,點擊便可以查看該應用的所有資源文件了。
如果你想將反編譯完的文件重新打包成apk,那你可以:輸入apktool.bat b test(你編譯出來文件夾)便可
之後在之前的test文件下便可以發現多了2個文件夾:
build
dist(裡面存放著打包出來的APK文件)
二、Apk反編譯得到Java源代碼
下載上述工具中的dex2jar和jd-gui ,解壓
將要反編譯的APK後綴名改為.rar或則 .zip,並解壓,得到其中的額classes.dex文件(它就是java文件編譯再通過dx工具打包而成的),將獲取到的classes.dex放到之前解壓出來的工具dex2jar-0.0.9.15 文件夾內,
在命令行下定位到dex2jar.bat所在目錄,輸入dex2jar.bat classes.dex,
在改目錄下會生成一個classes_dex2jar.jar的文件,然後打開工具jd-gui文件夾里的jd-gui.exe,之後用該工具打開之前生成的classes_dex2jar.jar文件,便可以看到源碼了
E. 混淆過的js代碼如何還原
1:利用IE開發人員工具(IE8開始已經自帶,IE7以前需要下載安裝IEDeveloperToolbar)進行反混淆,
2:代碼實現
混淆後的測試代碼
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\b'+e(c)+'\b','g'),k[c]);return p;}('1("0-6");2 4(){1("0-5")}8 3=2(){1("0-7")};4();3()',9,9,'憂郁的匹格|alert|function|b|a|反混淆測試2|反混淆測試1|反混淆測試3|var'.split('|'),0,{}))
開始實施:
2.加入一個div容器 id="divTest"
3.最關鍵的一步--賦值執行:(在上面混淆的代碼中,將eval()中的內容提取出來賦值(或直接列印)給document.getElementById('divTest').innerText)
document.getElementById('divTest').innerText=function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\b'+e(c)+'\b','g'),k[c]);return p;}('1("0-6");2 4(){1("0-5")}8 3=2(){1("0-7")};4();3()',9,9,'憂郁的匹格|alert|function|b|a|反混淆測試2|反混淆測試1|反混淆測試3|var'.split('|'),0,{})
打開xxx.html 顯示結果:(反混淆後的代碼已經被壓縮了,去掉了換行等字元)
alert("憂郁的匹格-反混淆測試1");
function a(){alert("憂郁的匹格-反混淆測試2")}
var b=function(){alert("憂郁的匹格-反混淆測試3")};
a();
b();
PS:使用packed這個混淆過的js都可以使用這個方法還原,找了幾個項目裡面混淆過的js都可以還原,只是去掉了換行符,
F. 混淆字元串後能破解嗎
基礎知識
物極必反。我們已經研究了閱讀Windows內核的方法,現在開始討論在 我們自己的驅動編碼中採用特殊的編碼方法,來簡單地防止反匯編閱讀。這是有趣的一種事態:一方面我們研究如何閱讀別人的(尤其是MS的)代碼;另一方面, 我們不得不採取措施保護自己的技術不被他人簡單地竊取。
我這里要用到的這種方法不同於加殼或者加密。加殼和加密的方法比較單一,從而容易被人以同樣單一的方法整體解密,同時內核驅動中進行加密稍顯復雜,難以做 得穩定,而且我手頭沒有成熟的整體加密的代碼。實際上代碼如果在運行,則一定必須被解密,因此從內存中得到解密的代碼並不困難。所以我並不太傾向於使用加 殼或者加密的方案。
劉濤濤的「扭曲變換」是根本的防止逆向解決方案,但是需要付出巨大的努力才得以實現。
下面的一些方法是比較簡單的。這樣的做法顯然不能完全防止逆向,但是能起到一定的「遮掩」作用。好處是隨時可以做,而且可以個人根據代碼的重要程度,決定哪些部位做,哪些部位不做。無論有多簡陋,有勝於無。
劉濤濤的扭曲變換
由於破解技術的發展,實際上大部分商業軟體的合法性驗證機制都變成了僅具有裝飾性,而且一些難以開發的底層軟體的技術細節,往往在發行不久就被人理解並發表在網上。這成為許多開發者厭惡的事(當然另一些開發者則樂於此道)。
於是如何讓編譯後的機器代碼更難以理解就成為一個切實有用的研究方向。編譯器有效地優化了代碼,但這僅僅是將代碼變得更簡單。一般地說,簡單的東西總是比復雜的要容易理解,雖然和源代碼的關系變得模糊了。
國內著名技術牛人劉濤濤在網上發表「扭曲變換」的思想。這個思想和「優化」完全相反,主旨不是讓代碼更簡單、效率更高,而是讓代碼更加復雜——毫無疑問效率也更低。但是相比技術秘密的泄露,效率的損失其實並不那麼重要了。
這種復雜性有著無限的潛力。比如,讀者計劃一次從北京到上海的旅行,最近的直線航行路線當然只有一條。但是如果想要路線更長更復雜的話,則完全有無限種可 能:你可以先從北京抵達紐約,在紐約休息後前往南極,然後北上到達撒哈拉沙漠,最後再前往上海。復雜的代碼使破解者無法找到驗證相關代碼的所在,也使試圖 竊取技術的讀者一無所獲。
劉濤濤的工具可以將編譯後的obj文件進行扭曲,鏈接後生成的可執行文件變得極難閱讀,而且可以反復地執行下去:一段代碼可以無限地變大變長——功能卻是和原來等價的。這真是不可思議的技術。
技術細節
在代碼中,出現了直接字元串是非常不妥的一件事。往往這些常數字元串在反匯編的時候會直接被人看見,對反工程者是最好的引導。
以下的代碼都會暴露我們的字元串:
char *str = "mystr";
wchar_t buffer[2] = { L"hello,world."};
UNICODE_STRING my_str;
RtlInitUnicodeString(&my_str,L"hello,world");
隱藏這些常數字元串並不能完全防止逆向工程,但是毫無疑問的是,會給逆向工程增加很多麻煩。
隱藏這些字元串的手法是:在寫代碼的時候並不寫字元串的明文,而是書寫密文,總是在使用之前解密。這樣的手法的後果是,在靜態反匯編的時候,反工程者是看不見字元串的。但是,反匯編者顯然會在調試的時候看見字元串。
在調試的時候才看見合法的字元串比靜態反匯編的時候看見字元串要麻煩許多,因為一般只有對一段代碼有興趣才去調試它。而之所以對那段代碼有興趣,有些時候是因為看見了感興趣的字元串。全部跟蹤調試所有的代碼,是艱巨的任務,只有具有重大價值的目標才值得那樣去做。
想保護代碼,請首先保密常數字元串。
不過有點要注意的是,你不能把所有的字元串都用同樣的一招進行加密,至少不能用相同的密鑰;否則,也許一個簡單的解密程序就把你所有的字元串恢復為明文了。
考慮:
char *str = "mystr";
改為:
char str[] = { 'm' ^ 0x12, 'y' ^ 0x12, 's' ^ 0x12 ,'t' ^ 0x12,'r' ^ 0x12,'/0' ^ 0x12}
如果認為異或是最簡單的加密方法,那麼0x12就是這里的密鑰。現在編譯出來的字元串已經面目全非了,當然,要解密這個字元串需要一個函數。
char *dazeEstr(char *str, char key)
{
char *p = str;
while( ((*p) ^= key) != '/0')
{ p++; }
return str;
}
你可以試試靜態反匯編下面的代碼:
char *str = { 'm' ^ 0x12, 'y' ^ 0x12, 's' ^ 0x12 ,'t' ^ 0x12,'r' ^ 0x12,'/0' ^ 0x12};
dazeEstr(str,0x12);
printf(str);
當然你通過分析一定會知道printf的結果。調試也可以知道結論,但是比直接用眼睛可以看見可是麻煩多了。當然這樣寫代碼也有些讓人抓狂,但是,你總是可以先按自己的本來的習慣寫完代碼,然後把關鍵的字元串這樣處理。
下面是一個寬字元的處理方法。
wchar_t *dazeEstrW(wchar_t *str, wchar_t key)
{
wchar_t *p = str;
while( ((*p) ^= key) != '/0')
{ p++; }
return str;
}
下面的代碼:
UNICODE_STRING my_str;
RtlInitUnicodeString(&my_str,L"hello,world");
其實總是可以改為:
wchar_t buffer[] = { L"hello,world."};
UNICODE_STRING my_str;
RtlInitUnicodeString(&my_str,buffer);
那麼加密的寫法是:
wchar_t buffer[] = {
L'h' ^ 0x3a,L'e' ^ 0x3a,L'l' ^ 0x3a,L'l' ^ 0x3a,
L'o' ^ 0x3a,L' ^ 0x3a,'L'w' ^ 0x3a,L'o' ^ 0x3a,
L'r' ^ 0x3a,L'l' ^ 0x3a,L'd' ^ 0x3a,L'.' ^ 0x3a,
L'/0' ^ 0x3a};
UNICODE_STRING my_str;
RtlInitUnicodeString(&my_str,dazeEstrW(buffer,0x3a));
比 較明顯的缺陷是書寫常數字元串的時候變得麻煩。我一直在追尋更簡單的寫法,但是遺憾的是,我還沒有找到。怎麼說呢?如果你覺得隱蔽是值得的,那就這樣做。 你甚至可以用更復雜的加密演算法,只要你能算出密文,然後填寫在代碼常數中,不過那樣修改代碼變得太困難了。如果你能寫一個預編譯工具自動修改代碼,確實是 一個好辦法,不過對於一種僅僅防止肉眼直觀看到字元串的方式,更復雜的加密方法往往沒必要,因為無論多復雜的演算法,解密演算法都很容易在你自己的代碼里找到
G. 怎樣破解被混淆的Java代碼
如果連變數名都混淆了,就是說所有有具體意義的英文變數名都用a,b,c,x,y等等來表示,那這是不可能還原的,因為電腦也不可能知道你這個a實際上代表了你的年齡而那個c代表了你老婆的胸圍!但如果只是個事混淆,那網上倒有不少工具可以格式化源代碼!自己搜一搜吧!推薦一款編輯器,IntelliJ,很不錯,值得一提的是,我用過的眾多編輯器中,這款編輯器的代碼格式化功能最強大!
H. 如何破解混淆的js代碼
js反混淆需要藉助第三方工具:
1、在網路搜索js混淆還原
2、把要還原的代碼放在第一個文本框,點擊js解混淆就可以了。
結果在下面顯示