本文目标: 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。