写给软件开发者---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。

相关文章
相关标签/搜索