寫給軟件開發者---Binnary Security.

本文目標: java

  1. 大體瞭解Java byte code以及Assembly.
  2. 簡單概述如何反編譯Java Class
  3. 二進制文件的反編譯
  4. 回答難道真的不能保護程序源碼嗎?

Java Byte Code: 算法

  1. 使用命令javap -c <ClassName>來把Java源代碼編譯爲Java Byte Code
  2. 要編譯Java源代碼必須保證所在機器上有JVM環境
  3. 不一樣的操做系統必須安裝相應的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

上述例子有什麼用處? 加密

  • 反編譯可讓咱們看明白整個程序的運行過程 而且能夠了解一些軟件的內部算法
  • 反編譯能夠更好的更改和從新編譯程序
  • 全部被用來保護軟件核心機制的代碼均可以被移除,好比破解軟件等

固然反編譯不是萬能的,只能編譯出大概,並不能保證百分百的正確。例如,trueByte Code中的顯示和1是同樣的。所以反編譯並不能分辨1true, 0false。(不過相差不會太多。)  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的,一個通常是用戶輸入的。只要在調試器中更改ECXEDX便可讓程序比對密碼時,提取同一個密碼,也就是說講永遠爲True。值得說明,下一句的TEST便是比對。

Ollydbg在破解中的做用是什麼:

  • 能夠搜索內存中的String,初級軟件,好比教學視頻通常會把密碼直接藏在內存中。
  • 能夠查看Register中的KeyValue 
  • 能夠經過調換JEQJNEQ來繞過IF語句。
  • …… 

如何防護反編譯或者調試程序探查:

  • 動態生成 Key 可是黑客能夠運行程序
  • 加密程序或者加殼 可是程序中其實依舊有相對應用來解密的 Key 能被黑客發現
  • 混編數據和代碼,甚至加入無用信息 可以拖延黑客破解所用的時間,數月甚至幾年,例如 Skype
  • 現實中真正有用的防護手段 -    部分或者所有數據存放在網絡服務器上,例如 WoW, BlueRay 或者 硬件級別的保護措施

End:

結尾送你們兩句話,是我對互聯網以及安全領域的真正理解。寫完了才發現貌似和開源不要緊T.T

  1. Attackers own the internet.
  2. Good protection tends to slow down this decryption, not stop it.

本文爲原創,轉載請註明出處Oschina。

相關文章
相關標籤/搜索