本文目標: java
- 大體瞭解Java byte code以及Assembly.
- 簡單概述如何反編譯Java Class
- 二進制文件的反編譯
- 回答「難道真的不能保護程序源碼嗎?」
Java Byte Code: 算法
- 使用命令javap -c <ClassName>來把Java源代碼編譯爲Java Byte Code
- 要編譯Java源代碼必須保證所在機器上有JVM環境
- 不一樣的操做系統必須安裝相應的JVM環境
Java Byte Code的簡單語法: 安全
- iconst_0 : push 0 onto the stack
- istore_1: pop the top of the stack as variable 1
- goto: jump to line
- iload_1: push variable 1 onto the stack
- bipush, ldc: push value onto stack
- if_icmplt: if 1St item on stack > 2nd jump to line
- Ifeq: if 1st item on stack > 2nd jump to line
更多語法請本身Google. 服務器
反編譯: 網絡
反編譯一般執行編譯器的相反動做 —---- 即把含有相對抽象的底層代碼(一般指那些被設計用來給計算機讀取的語言)轉化爲高級語言代碼(咱們常常使用並能簡單看懂的語言)。 函數
這裏以JD-GUI來講明,它自己是一款Java發編譯軟件,即把Java Byte Code轉化爲Java 源代碼。 ui
圖1. 使用JD-GUI來查看一個可運行的JAR文件,源文件是一個軟件須要註冊碼的例子。 this
上述例子有什麼用處? 加密
- 反編譯可讓咱們看明白整個程序的運行過程 而且能夠了解一些軟件的內部算法
- 反編譯能夠更好的更改和從新編譯程序
- 全部被用來保護軟件核心機制的代碼均可以被移除,好比破解軟件等
固然反編譯不是萬能的,只能編譯出大概,並不能保證百分百的正確。例如,true在Byte Code中的顯示和1是同樣的。所以反編譯並不能分辨1和true, 0和false。(不過相差不會太多。) spa
Binaries:
- 即彙編語言
- 相對於 Java Byte Code 更加底層
- 不一樣的 OS 須要使用不一樣的編譯器,固然原理是同樣的
彙編語法:
- PUSH: add to top of stack
- CALL: execute a function
- RET, RETN, RETF: end a function and restart calling code
更多信息依舊請本身查閱Google
圖2. Windows中最經典的調試程序ollydbg。說明一下上述兩個軟件都是Free的。
原理解析:上圖中被選中的那行執行了StrCmp這個函數,事實上就是比對兩個String,也就是一般程序用來驗證密碼的最基本方式。這一行的上面兩行則是提取了2個密碼,一個是Built-in的,一個通常是用戶輸入的。只要在調試器中更改ECX爲EDX便可讓程序比對密碼時,提取同一個密碼,也就是說講永遠爲True。值得說明,下一句的TEST便是比對。
Ollydbg在破解中的做用是什麼:
- 能夠搜索內存中的String,初級軟件,好比教學視頻通常會把密碼直接藏在內存中。
- 能夠查看Register中的Key和Value。
- 能夠經過調換JEQ和JNEQ來繞過IF語句。
- ……
如何防護反編譯或者調試程序探查:
- 動態生成 Key – 可是黑客能夠運行程序
- 加密程序或者加殼 – 可是程序中其實依舊有相對應用來解密的 Key 能被黑客發現
- 混編數據和代碼,甚至加入無用信息 – 可以拖延黑客破解所用的時間,數月甚至幾年,例如 Skype
- 現實中真正有用的防護手段 - 部分或者所有數據存放在網絡服務器上,例如 WoW, BlueRay 或者 硬件級別的保護措施
End:
結尾送你們兩句話,是我對互聯網以及安全領域的真正理解。寫完了才發現貌似和開源不要緊T.T
- Attackers own the internet.
- Good protection tends to slow down this decryption, not stop it.
本文爲原創,轉載請註明出處Oschina。