虚拟文件系统

虚拟文件系统 为什么需要虚拟文件系统 虚拟文件系统 超级块,superblock inode 为什么需要虚拟文件系统 在 Linux 系统中一切皆文件,除了普通文件之外,目录、字符设备、块设备、套接字、进程、线程、管道等都是“文件”。 用户程序需要一个统一的操作接口屏蔽不同文件系统(ext2/3/4,xfs,vfat,socket)的差异和操作细节 在Linux中对文件的 操作可以跨文件系统而执行。如下图所示,我们可以使用 cp 命令从 fat 文件系统格式的硬盘拷贝数据到 ext2 文件系统格式的硬盘;而这样的操作涉及到两个不同的文件系统. 上层应用几乎不用关注底层的实现细节。我们只需要使用VFS暴露出来的标准的read、write等接口就可以了 通过VFS系统,Linux提供了通用的系统调用,可以跨越不同文件系统和介质之间执行,极大简化了用户访问不同文件系统的过程。 “一切皆是文件”是 Unix/Linux 的基本哲学之一。不仅普通的文件,目录、字符设备、块设备、 套接字等在 Unix/Linux 中都是以文件被对待;它们虽然类型不同,但是对其提供的却是同一套操作界面。 虚拟文件系统, Virtual File System,VFS VFS 是 Linux 内核中的一个软件层,是内核的子系统之一,为用户空间的程序提供文件和文件系统操作的统一接口,屏蔽不同文件系统的差异和操作细节 借助 VFS 可以直接使用open()、read()、write() 这样的系统调用操作文件,而无须考虑具体的文件系统和实际的存储介质。 通过 VFS,Linux 提供了通用的系统调用,可以跨越不同文件系统和介质之间执行,极大简化了用户访问不同文件系统的过程。另一方面,新的文件系统、新类型的存储介质,可以无须编译的情况下,动态加载到Linux中。 “一切皆文件"是Linux的基本哲学之一,不仅是普通的文件,包括目录、字符设备、块设备、套接字等,都可以以文件的方式被对待。实现这一行为的基础,正是Linux的虚拟文件系统机制。 VFS原理 VFS之所以能够衔接各种各样的文件系统,是因为它抽象了一个通用的文件系统模型,定义了通用文件系统都支持的、概念上的接口。新的文件系统只要支持并实现这些接口,并注册到Linux内核中,即可安装和使用。 虚拟文件系统组成部分 Linux为了实现这种VFS系统,采用面向对象的设计思路,主要抽象了四种对象类型: 超级块对象:代表一个已安装的文件系统。 索引节点对象:代表具体的文件。 目录项对象:代表一个目录项,是文件路径的一个组成部分。 文件对象:代表进程打开的文件。 每个对象都包含一组操作方法,用于操作相应的文件系统。 备注:Linux将目录当做文件对象来处理,是另一种形式的文件,它里面包含了一个或多个目录项。而目录项是单独抽象的对象,主要包括文件名和索引节点号。因为目录是可以层层嵌套,以形成文件路径,而路径中的每一部分,其实就是目录项。 接下来介绍一下各个对象的作用以及相关操作。 超级块, superblock 存储一个已安装的文件系统的控制信息(文件系统的状态、类型、大小、区块数、索引节点数等),代表一个已安装的文件系统;每次一个实际的文件系统被安装时, 内核会从磁盘的特定位置读取一些控制信息来填充内存中的超级块对象。一个安装实例和一个超级块对象一一对应。 超级块通过其结构中的一个域s_type记录它所属的文件系统类型。 superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等; Superblock 是记录整个 filesystem 相关信息的地方, 没有 Superblock ,就没有这个 filesystem 了. ...

2014-04-14 · 5 min · 916 words · -

对称加密

对称加密 http://baike.baidu.com/view/119320.htm 采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。 需要对加密和解密使用相同密钥的加密算法。由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用。对称性加密也称为密钥加密。 所谓对称,就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密。密钥是控制加密及解密过程的指令。算法是一组规则,规定如何进行加密和解密。 因此[1]加密的安全性不仅取决于加密算法本身,密钥管理的安全性更是重要。因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题。 常用的对称加密有: DES、IDEA、RC2、RC4、SKIPJACK、RC5、AES算法等 安全性: AES> 3DES> DES http://aub.iteye.com/blog/1133494 http://www.blogjava.net/amigoxie/archive/2014/07/06/415503.html

2014-04-14 · 1 min · 14 words · -

classes.dex

classes.dex classes.dex: The classes compiled in the dex file format understandable by the Dalvik virtual machine

2014-04-14 · 1 min · 16 words · -

System.load 和 System.loadLibrary

System.load 和 System.loadLibrary http://blog.csdn.net/ring0hx/article/details/3242245 System.load 和 System.loadLibrary详解 1.它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件。在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI库文件装载。 2.System.load 参数为库文件的绝对路径,可以是任意路径。 例如你可以这样载入一个windows平台下JNI库文件: System.load(“C://Documents and Settings//TestJNI.dll”);。 System.loadLibrary 参数为库文件名,不包含库文件的扩展名。 例如你可以这样载入一个windows平台下JNI库文件 System. loadLibrary (“TestJNI”); 这里,TestJNI.dll 必须是在java.library.path这一jvm变量所指向的路径中。 可以通过如下方法来获得该变量的值: System.getProperty(“java.library.path”); 默认情况下,在Windows平台下,该值包含如下位置: 和jre相关的一些目录 程序当前目录 Windows目录 系统目录 (system32) 系统环境变量path指定目录 4.如果你要载入的库文件静态链接到其它动态链接库,例如TestJNI.dll 静态链接到dependency.dll, 那么你必须注意: 如果你选择 System.load(“C://Documents and Settings// TestJNI.dll”); 那么即使你把dependency.dll同样放在C://Documents and Settings//下,load还是会因为找不到依赖的dll而失败。因为jvm在载入TestJNI.dll会先去载入TestJNI.dll所依赖的库文件dependency.dll,而dependency.dll并不位于java.library.path所指定的目录下,所以jvm找不到dependency.dll。 你有两个方法解决这个问题: 一是把C://Documents and Settings//加入到java.library.path的路径中,例如加入到系统的path中。二是先调用 System.load(“C://Documents and Settings// dependency.dll”); 让jvm先载入dependency.dll,然后再调用System.load(“C://Documents and Settings// TestJNI.dll”); 如果你选择 System. loadLibrary (“TestJNI”); 那么你只要把dependency.dll放在任何java.library.path包含的路径中即可,当然也包括和TestJNI.dll相同的目录。

2014-04-14 · 1 min · 59 words · -

Linux动态链接库.so文件

Linux动态链接库.so文件 http://blog.csdn.net/ithomer/article/details/7346146 **1. 介绍 ** 使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个"程序函数库"简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。 程序函数库可分为3种类型: 静态函数库 (static libraries) 、共享函数库 (shared libraries) 、动态加载函数库 (dynamically loaded libraries) : 静态函数库,是在程序执行前就加入到目标程序中去了; 共享函数库,则是在程序启动的时候加载到程序中,它可以被不同的程序共享;动态加载函数库则可以在程序运行的任何时候动态的加载。 动态函数库,并非另外一种库函数格式,区别是动态加载函数库是如何被程序员使用的。 **2. 静态函数库 ** 静态函数库实际上就是简单的一个普通的目标文件的集合,一般来说习惯用".a"作为文件的后缀。可以用ar这个程序来产生静态函数库文件。Ar是archiver的缩写。静态函数库现在已经不在像以前用得那么多了,主要是共享函数库与之相比较有很多的优势的原因。慢慢地,大家都喜欢使用共享函数库了。不过,在一些场所静态函数库仍然在使用,一来是保持一些与以前某些程序的兼容,二来它描述起来也比较简单。 静态库函数允许程序员把程序link起来而不用重新编译代码,节省了重新编译代码的时间。不过,在今天这么快速的计算机面前,一般的程序的重新编译也花费不了多少时间,所以这个优势已经不是像它以前那么明显了。静态函数库对开发者来说还是很有用的,例如你想把自己提供的函数给别人使用,但是又想对函数的源代码进行保密,你就可以给别人提供一个静态函数库文件。理论上说,使用ELF格式的静态库函数生成的代码可以比使用共享函数库 (或者动态函数库) 的程序运行速度上快一些,大概1-5%。 创建一个静态函数库文件,或者往一个已经存在地静态函数库文件添加新的目标代码,可以用下面的命令: ar rcs my_library.a file1.o file2.o 这个例子中是把目标代码file1.o和file2.o加入到my_library.a这个函数库文件中,如果my_library.a不存在则创建一个新的文件。在用ar命令创建静态库函数的时候,还有其他一些可以选择的参数,可以参加ar的使用帮助。这里不再赘述。 一旦你创建了一个静态函数库,你可以使用它了。你可以把它作为你编译和连接过程中的一部分用来生成你的可执行代码。如果你用gcc来编译产生可执行代码的话,你可以用"-l"参数来指定这个库函数。你也可以用ld来做,使用它的"-l"和"-L"参数选项。具体用法可以参考info:gcc。 **3. 共享函数库 ** 共享函数库中的函数是在当一个可执行程序在启动的时候被加载。如果一个共享函数库正常安装,所有的程序在重新运行的时候都可以自动加载最新的函数库中的函数。对于Linux系统还有更多可以实现的功能: 升级了函数库但是仍然允许程序使用老版本的函数库。 当执行某个特定程序的时候可以覆盖某个特定的库或者库中指定的函数。 可以在库函数被使用的过程中修改这些函数库。 3.1. 一些约定 如果你要编写的共享函数库支持所有有用的特性,你在编写的过程中必须遵循一系列约定。你必须理解库的不同的名字间的区别,例如它的"soname"和"real name"之间的区别和它们是如何相互作用的。你同样还要知道你应该把这些库函数放在你文件系统的什么位置等等。下面我们具体看看这些问题。 3.1.1. 共享库的命名 每个共享函数库都有个特殊的名字,称作"soname"。soname名字命名必须以"lib"作为前缀,然后是函数库的名字,然后是".so",最后是版本号信息。不过有个特例,就是非常底层的C库函数都不是以lib开头这样命名的。 每个共享函数库都有一个真正的名字 (“real name”) ,它是包含真正库函数代码的文件。真名有一个主版本号,和一个发行版本号。最后一个发行版本号是可选的,可以没有。主版本号和发行版本号使你可以知道你到底是安装了什么版本的库函数。另外,还有一个名字是编译器编译的时候需要的函数库的名字,这个名字就是简单的soname名字,而不包含任何版本号信息。 管理共享函数库的关键是区分好这些名字。当可执行程序需要在自己的程序中列出这些他们需要的共享库函数的时候,它只要用soname就可以了;反过来,当你要创建一个新的共享函数库的时候,你要指定一个特定的文件名,其中包含很细节的版本信息。当你安装一个新版本的函数库的时候,你只要先将这些函数库文件拷贝到一些特定的目录中,运行ldconfig这个实用就可以。ldconfig检查已经存在的库文件,然后创建soname的符号链接到真正的函数库,同时设置/etc/ld.so.cache这个缓冲文件。这个我们稍后再讨论。 ldconfig 并不设置链接的名字,通常的做法是在安装过程中完成这个链接名字的建立,一般来说这个符号链接就简单的指向最新的soname或者最新版本的函数库文件。最好把这个符号链接指向soname,因为通常当你升级你的库函数后,你就可以自动使用新版本的函数库类。 我们来举例看看: /usr/lib/libreadline.so.3 是一个完全的完整的soname,ldconfig可以设置一个符号链接到其他某个真正的函数库文件,例如是/usr/lib/libreadline.so.3.0。同时还必须有一个链接名字,例如 /usr/lib/libreadline.so就是一个符号链接指向/usr/lib/libreadline.so.3。 3.1.2. 文件系统中函数库文件的位置 共享函数库文件必须放在一些特定的目录里,这样通过系统的环境变量设置,应用程序才能正确的使用这些函数库。大部分的源码开发的程序都遵循GNU的一些标准,我们可以看info帮助文件获得相信的说明,info信息的位置是: info:standards#Directory_Variables。GNU标准建议所有的函数库文件都放在/usr/local/lib目录下,而且建议命令可执行程序都放在/usr/local/bin目录下。这都是一些习惯问题,可以改变的。 文件系统层次化标准FHS (Filesystem Hierarchy Standard) (http://www.pathname.com/fhs) 规定了在一个发行包中大部分的函数库文件应该安装到/usr/lib目录下,但是如果某些库是在系统启动的时候要加载的,则放到/lib目录下,而那些不是系统本身一部分的库则放到/usr/local/lib下面。 ...

2014-04-14 · 2 min · 405 words · -

Java JNI

Java JNI http://blog.csdn.net/u_xtian/article/details/6033963 我们知道Java是一个运行在虚拟机里面的高级的编程语言,如果要调用系统的动态链接库的话,就要先声明native修饰的方法(类似接口里面的方法),再由C/C++程序来实现(类似实现接口里的方法)。这样Java调用这些native方法就相当于调用了C/C++里面实现了的方法。通常我们把这种机制叫做JNI(Java NativeInterfac),即Java 本地编程接口 Android也同理,要学会在Android上进行NDK开发,首先我们到打好java JNI的基础。现在我们暂时把Android开发丢到一边先,试试在Java之下编译一个C动态链接库,再用Java程序调用。 1)先来个最简单的打印HelloWorld例子: Java代码(HelloJni.java): import java.util.*; public class HelloJni{ static{ System.loadLibrary(“hello”); } public native static void sayHello(); public static void main(String [] args) { HelloJni.sayHello(); } } 生成头文件(HelloJni.h): 先javac HelloJni.java编译你的Java源码,再javah–jni HelloJni生成所需的头文件 头文件内容是这样的: /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class HelloJni */ #ifndef _Included_HelloJni #define _Included_HelloJni #ifdef __cplusplus extern “C” { #endif JNIEXPORT void JNICALL Java_HelloJni_sayHello (JNIEnv *, jclass); ...

2014-04-14 · 5 min · 1039 words · -

HTML DOM Hidden

HTML DOM Hidden Hidden 对象代表一个 HTML 表单中的某个隐藏输入域。 这种类型的输入元素实际上是隐藏的。这个不可见的表单元素的 value 属性保存了一个要提交给 Web 服务器的任意字符串。如果想要提交并非用户直接输入的数据的话,就是用这种类型的元素。 在 HTML 表单中 <input type="hidden"> 标签每出现一次,一个 Hidden 对象就会被创建。 您可通过遍历表单的 elements[] 数组来访问某个隐藏输入域,或者通过使用document.getElementById()。 http://www.w3school.com.cn/jsref/dom_obj_hidden.asp

2014-04-12 · 1 min · 24 words · -

System.load System.loadLibrary

‘System.load System.loadLibrary’ System.load 和 System.loadLibrary详解 分类: Java 2008-11-06 23:21 16051人阅读 评论(4) 收藏 举报 jniwindowsjvm平台pathsystem System.load 和 System.loadLibrary详解 1.它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件。在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI库文件装载。 2.System.load 参数为库文件的绝对路径,可以是任意路径。 例如你可以这样载入一个windows平台下JNI库文件: System.load(“C://Documents and Settings//TestJNI.dll”);。 System.loadLibrary 参数为库文件名,不包含库文件的扩展名。 例如你可以这样载入一个windows平台下JNI库文件 System. loadLibrary (“TestJNI”); 这里,TestJNI.dll 必须是在java.library.path这一jvm变量所指向的路径中。 可以通过如下方法来获得该变量的值: System.getProperty(“java.library.path”); 默认情况下,在Windows平台下,该值包含如下位置: 和jre相关的一些目录 程序当前目录 Windows目录 系统目录 (system32) 系统环境变量path指定目录 4.如果你要载入的库文件静态链接到其它动态链接库,例如TestJNI.dll 静态链接到dependency.dll, 那么你必须注意: 如果你选择 System.load(“C://Documents and Settings// TestJNI.dll”); 那么即使你把dependency.dll同样放在C://Documents and Settings//下,load还是会因为找不到依赖的dll而失败。因为jvm在载入TestJNI.dll会先去载入TestJNI.dll所依赖的库文件dependency.dll,而dependency.dll并不位于java.library.path所指定的目录下,所以jvm找不到dependency.dll。 你有两个方法解决这个问题: 一是把C://Documents and Settings//加入到java.library.path的路径中,例如加入到系统的path中。二是先调用 System.load(“C://Documents and Settings// dependency.dll”); 让jvm先载入dependency.dll,然后再调用System.load(“C://Documents and Settings// TestJNI.dll”); 如果你选择 System. loadLibrary (“TestJNI”); 那么你只要把dependency.dll放在任何java.library.path包含的路径中即可,当然也包括和TestJNI.dll相同的目录。

2014-04-11 · 1 min · 69 words · -

Jode

Jode http://moonights.iteye.com/blog/568886 Jode介绍 源码开放的JODE是全球最大的开源项目网站Sourceforge.net的成员,在所有的JAVA反编译器中,JODE的反编译效果是最好的,尤其是对付一些常见的加密手段,例如混淆技术等,更是出类拔粹。JODE本身也是纯JAVA开发的,最近越来越多的JAVA反编译软件也选择JODE来做它们的核心引擎,例如JCavaj Java Decompiler、BTJ (Back To Java)、jEdit’s JavaInsight plugin等。JODE是一个可运行的JAR文件,在windows环境下双击即可运行。 Jode Eclipse插件安装 顺序点击Eclipse上的==>help ==> Software Updates ==> Find and Install ==> Search for new features to install, 单击"New Remote Site…", 在Name中输入Jode Decompliter在URL栏输入 [http://www.technoetic.com/eclipse/update> 然后下一步,就可以看到"Jode Decompiler"了,选上并单击Finish就开始自动到相应的官网上去下载安装了。安装好后,可以在Window ==> Preferences… ==> Java ==](http://www.technoetic.com/eclipse/update> 然后下一步,就可以看到"Jode Decompiler"了,选上并单击Finish就开始自动到相应的官网上去下载安装了。安装好后,可以在Window ==> Preferences… ==> Java ==) Jode Decompiler选项卡。 安装好了再设置一下文件关联就可以了,Window => Preferences… => General => Editors => File Associations找到"*.class"在"Associated editors"里面可以看到"Jode class file viewer"选中它再单击Default按钮就OK了 3.Jode的使用 其实之所以要使用Jode就是因为我们往往只有Java的class字节码文件却没有源文件,这时就只有进行反编译了,在Eclipse中我们通常为了查看一个class文件的源代码,必须将它与源文件相关联。而如果我们安装了Jode插件,那么就不用去苦苦寻找源文件了,直接反编译就OK (虽然有时会报出一堆的错误@_@) 。要注意的是Jode只认识.jar文件 (不支持war文件,因此如果是war文件,你因该先将之解压然后打包成.jar包) 。 首先将你要反编译的class文件利用Java自带的jar命令将class文件打包成.jar包,然后导入到你的Eclipse的Project中去,接着就可以展开刚才导入的jar包,查看class文件相应的源文件了。

2014-04-11 · 1 min · 71 words · -

Java反编译, jad, jd-gui

Java反编译, jad, jd-gui Jadclipse JadClipse是Jad的Eclipse插件 jad jad是一款使用非常广泛地Java反编译工具,上面这款Jadclipse就是基于jad的反编译插件,JAD 文件包含 MIDlet 套件的标题信息,例如开发应用程序的公司、应用程序名称和大小。 官方网站: http://varaneckas.com/jad/ JD-GUI JD-GUI 是一个用 C++ 开发的 Java 反编译工具,由 Pavel Kouznetsov开发,支持Windows、Linux和苹果Mac Os三个平台。而且提供了Eclipse平台下的插件JD-Eclipse。JD-GUI不需要安装,直接点击运行,可以反编译jar,class文件。 官方网站: http://jd.benow.ca/ jdec http://jdec.sourceforge.net/ uuDeJava http://www.uuware.com/uudejava_cn.htm Minjava Java Decompiler http://jd.benow.ca/ 工具使用jad(还有joda,jd等工具) 使用jad反编译class文件,jad可以配置到eclipse中当做插件,直接下载jad的eclipse插件jar包,放在eclipse的plugin目录下即可。把下载的jad.exe放在JAVA_HOME的bin下。然后eclipse中点击class文件即可查看到源码。 使用其他工具,FrontEnd Plus集成了jad的java反编译工具,支持多个文件的反编译,也支持各种选项。 矫正反编译代码错误和奇怪代码 异常错误 反编译之后出入类似如下代码: DocumentException e; e; e.printStackTrace(); break MISSING_BLOCK_LABEL_67; e; e.printStackTrace(); break MISSING_BLOCK_LABEL_67; e; e.printStackTrace(); break MISSING_BLOCK_LABEL_67; e; 这种处理方式就是异常处理,反编译之后出现的这种情况,修改的时候使用try catch即可,其实完全可以将这块删除之后,然后eclipse会自动提示需要添加异常处理的模块,自动try catch即可。 语句标号 (goto) 这种情况常见于条件语句,即转化为if,else语句即可,这种比较容易判断。 i = 0; goto _L1 _L3: i++; _L1: if(i < 4) goto _L3; else goto_L2 ...

2014-04-11 · 1 min · 180 words · -

CSS中加号、星号及其他符号的作用

CSS中加号、星号及其他符号的作用 http://blog.sina.com.cn/s/blog_6790717801011dx8.html CSS中加号、星号及其他符号的作用 (2012-06-27 14:34:32)转载▼ 标签: 科技 css 浏览器 版本 it 首先,什么是CSS hack? 针对不同的浏览器写不同的CSS code的过程,就叫CSS hack! CSS hack由于不同的浏览器,比如Internet Explorer 6,Internet Explorer 7,Mozilla Firefox等,对CSS的解析认识不一样,因此会导致生成的页面效果不一样,得不到我们所需要的页面效果。 这个时候我们就需要针对不同的浏览器去写不同的CSS,让它能够同时兼容不同的浏览器,能在不同的浏览器中也能得到我们想要的页面效果。 CSS Hack的原理是什么 由于不同的浏览器对CSS的支持及解析结果不一样,还由于CSS中的优先级的关系。我们就可以根据这个来针对不同的浏览器来写不同的CSS。 CSS Hack大致有3种表现形式,CSS类内部Hack、选择器Hack以及HTML头部引用(if IE)Hack,CSS Hack主要针对IE浏览器。 类内部Hack: 比如 IE6能识别下划线"“和星号” * “,IE7能识别星号” * “,但不能识别下划线”",而firefox两个都不能认识。 选择器Hack: 比如 IE6能识别*html .class{},IE7能识别*+html .class{}或者*:first-child+html .class{}。 HTML头部引用(if IE)Hack: 针对所有IE: <!-[if IE]><!-您的代码-><![endif]->,针对IE6及以下版本: <!-[if lt IE 7]><!-您的代码-><![endif]->,这类Hack不仅对CSS生效,对写在判断语句里面的所有代码都会生效。 书写顺序,一般是将识别能力强的浏览器的CSS写在后面。下面如何写里面说得更详细些。 如何写CSS Hack 比如要分辨IE6和firefox两种浏览器,可以这样写: 在IE6中看到是红色的,在firefox中看到是绿色的。 上面的css在firefox中,它是认识不了后面的那个带星号的东西是什么的,于是将它过滤掉,不予理睬,解析得到的结果是:div{background:green},于是理所当然这个div的背景是绿色的。 在IE6中呢,它两个background都能识别出来,它解析得到的结果是:div{background:green;background:red;},于是根据优先级别,处在后面的red的优先级高,于是当然这个div的背景颜色就是红色的了。 ...

2014-04-11 · 3 min · 469 words · -

Java中 goto

Java中 goto http://lavasoft.blog.51cto.com/62575/178997/ Java语言中goto是保留关键字,没有goto语句,也没有任何使用goto关键字的地方。 Java中也可在特定情况下,通过特定的手段,来实现goto的功能。显然Java不愿意开发者随意跳转程序。下面解释两个特定: 特定情况: 只有在循环体内,比如for、while语句 (含do…while语句) 中。 特定手段: 语句标签和循环控制关键字break、continue,语法格式是: break/continue 语句标签。 一、break、continue和语句标签 语句标签 语句标签的语法是: 标签名: 语句标签可以定义在方法体内的最后一条语句之前即可。但是语句标签实际使用的机会是与break和continue结合使用的,而break和continue是和循环语句结合使用的,因此实际上语句标签的使用也是和循环紧密结合的。 语句标签在被使用的情况,只能定义在循环迭代语句之前,否则编译出错! 因此,有意义、可使用的标签含义是: 指定循环语句的标识! break、continue语句单独使用 单独使用情况下: break语句作用是结束当前的循环迭代体,进而执行剩余的语句。 continue语句的作用是结束本次迭代过程,继续执行下一轮迭代。 break、continue语句结合语句标签的使用 为什么需要语句标签呢? 原因是因为程序可能有循环的嵌套,当多层循环嵌套时候,有时候需要一次跳出多级循环,这种情况下就需要结合语句标签才能实现此功能了。 带标签使用情况下: break中断并跳出标签所指定循环,continue跳转到标签指定的循环处,并继续执行该标签所指定的循环。 为了说明情况,看看下面的例子: import java.util.Random; /** 语句标签测试 @author leizhimin 2009-7-16 11:43:08 */ public class TestLable { public static void main(String[] args) { outer: for (int i = 0; i < 10; i++) { System.out.println("\nouter_loop:" + i); inner: for (int k = 0; i < 10; k++) { ...

2014-04-11 · 2 min · 359 words · -

花指令

花指令 花指令是程序中有一些指令,由设计者特别构思,希望使反汇编的时候出错,让破解者无法清楚正确地反汇编程序的内容,迷失方向。经典的是一些跳转指令,目标位置是另一条指令的中间,这样在反汇编的时候便会出现混乱。花指令有可能利用各种指令: jmp, call, ret的一些堆栈技巧,位置运算,等等。花指令生成器 编辑 一、写花指令生成器必备知识 花指令原理 花指令是程序中的无用代码,程序对它没影响,少了它也能正常运行。加花指令后,杀毒软件对木马静态反汇编时,木马的代码就不会正常显示出来,加大杀毒软件的查杀难度。 如何写花指令 下面我们先看看一段花指令,分析理解它的原理: PUSH EBP MOV EBP,ESP push edx pop edx inc ecx dec ecx add esp,21 add esp,-21 add esp,10 sub esp,10 JMP 附近空地址随便乱跳 JMP 原入口点 花指令一般有三部分,开头就是PUSH EBP和MOV EBP,ESP这两句在大部分程序开头可以经常看到。PUSH EBP是把EBP压入堆栈,MOV EBP,ESP是把ESP的值赋给EBP,不懂没关系,只要知道PUSH EBP和MOV EBP,ESP这两句经常出现在文件开头就可以了,随便用OllyDbg打开一个不加壳的文件载入后经常停在PUSH EBP MOV EBP,ESP。 接下来就是花指令啦,push edx是把通用寄存器EDX压入堆栈,pop edx是把通用寄存器EDX弹出堆栈,这两句和起来就相当于什么也没做。接下来的inc ecx,ecx用来保存计数值,也是寄存器,INC是加1;下面的dec ecx中的dec是减1,加1减1相抵消,又是什么也没做。add esp,21这是寄存器esp加21,add是加上,下面一句add esp,-21是寄存器esp加-21,小学知识,+21+ (-21) =0,还是什么也没做。再下来add esp,10寄存器esp加21,sub esp,10寄存器esp减10,sub是减去。一个+10,一个-10相互抵消了。 最后是跳转语句,我用两句JMP,第一句在花指令附近随便跳到个空地址,第二个JMP是从空地址跳回文件的原入口点。 如何写入花指令 我们来看看加花指令的一般步骤: 准备好要加的花指令; 准备未加壳的黑客软件; 用OllyDbg打开这个黑客软件,记下入口点的内存地址; 找到零地址,一句一句写入花指令,再用JMP跳回程序入口点; (如果找不到空白地址,我们可以用zeroadd加区段,英文软件,我汉化好的,操作简单就不演示了。) 保存后用Peditor修改文件入口点为开始写花指令的地址。这样运行程序就先运行花指令再跳回程序的原始开头执行程序了; 检测程序是否正常运行和免杀效果。 http://baike.baidu.com/view/592213.htm http://www.blogjava.net/Todd/archive/2010/05/20/321429.html

2014-04-11 · 1 min · 68 words · -

apk Decompiler

apk Decompiler 下载dex2jar:https://code.google.com/p/dex2jar/ 当前版本dex2jar-0.0.9.15 用dex2jar把apk转换为.jar文件 解压apk文件得到classes.dex 把classes.dex转成.jar: 在命令行中执行d2j-dex2jar.bat classes.dex 得到jar文件classes-dex2jar.jar

2014-04-10 · 1 min · 10 words · -

dex2jar

dex2jar https://code.google.com/p/dex2jar/ http://blog.csdn.net/kesenhoo/article/details/6544094 dex2jar contains following compment dex-reader is designed to read the Dalvik Executable (.dex/.odex) format. It has a light weight API similar with ASM. An example here dex-translator is designed to do the convert job. It reads the dex instruction to dex-ir format, after some optimize, convert to ASM format. dex-ir used by dex-translator, is designed to represent the dex instruction dex-tools tools to work with .class files. here are examples: Modify a apk DeObfuscate a jar d2j-smali [To be published] disassemble dex to smali files and assemble dex from smali files. different implementation to smali/baksmali, same syntax, but we support escape in type desc “Lcom/dex2jar\t\u1234;” dex-writer [To be published] write dex same way as dex-reader.

2014-04-10 · 1 min · 118 words · -

OutOfMemoryError, StackOverflowError

OutOfMemoryError, StackOverflowError 这是IGT笔试的题目,分别写出可以造成两种错误的代码。由于之前测试过HashMap的容量的时候出现过内存不足的错误,所以能写出来,但StackOverflowError没什么印象了。 回来查了下StackOverflowError的资料,在德问社区上有人发帖子java产生StackOverflowError的原因是什么?询问: 请问java.lang.StackOverflowError产生的原因有什么? 已知的有死循环,循环的嵌套层数达到了环境的设定值 谢谢 有人回复说: 死循环本身是不会StackOverflow的,只有无限递归的时候会出现。原则上循环嵌套次数本身是没有限制的,限制的是占用的栈空间,如果你的函数里定义了很多很多变量,栈空间就会用完得比较快。 还有人讲的更详细: JVM里会有两种StackOverflowError, 一种是对应JVM stack, 一种是对应Native Method stack. 我们一般说的都是JVM stack. 每一个JVM线程维护自己的JVM stack. JVM stack里面存放 JVM栈帧. 栈帧中存放 数据和中间结果(本地变量数组, 操作符栈, 和对runtime 常量池的引用). 这些数据都比较小(对象都在堆中, 栈帧仅存放对象引用), 所以想单纯通过 在栈帧中存放大数据的方法 去引入StackOverflowError, 基本是不现实的.一般都是因为方法调用嵌套层数过大. http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5.2 JVM stack的大小是可以调节的, sun的windows jvm6 x64,jvm栈默认大小为1024k.可以通过-Xss1024k来调节. http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#threads_oom 另外,在oracle的docsChapter 2. The Structure of the Java Virtual Machine中,有如下解释: Java Virtual Machine Stacks The following exceptional conditions are associated with Java Virtual Machine stacks: If the computation in a thread requires a larger Java Virtual Machine stack than is permitted, the Java Virtual Machine throws a StackOverflowError. ...

2014-04-09 · 2 min · 379 words · -

第三人称单数, third person singular

第三人称单数, third person singular 第三人称单数是语言中对对话双方外其它某一个人指示时使用的代词。(简称三单)第三人称是相对于对话时,某一句话中,言语发出方(第一人称)和言语的听受方(第二人称)以外的其它人称。单数是指该句中提到的其它人是一个人,相对于两个人(双数,在太平洋岛屿土著语言中广泛存在人称代词的双数)或更多人(复数)。如汉语中的“他”“她”“它”,英语中的he\she\it\him\her。 要搞清楚第一、第二、第三人称各是什么。第一人称就是“我”和“我们”。第二人称是“你”和“你们”。第三人称单数是“他”、“她”和“它”,复数则是“他们”、“她们”和“它们”。 动词第三人称单数变化规则有: 大多数实义动词在词尾加 s 在清辅音后发音为 /s/;在浊辅音及元音音素后发音为 /z/。如 speak > speaks / s /; come→comes / z / ; play→plays /z/ 。 以辅音字母加 y 结尾的动词,要先将 y 变为 i 然后再加 es 读/ iz /。如study→studies / iz / ; fly→flies / iz /。 以“s、x、ch、sh”结尾的动词在词尾加“es”发音为/ iz / 。如teach→teaches / iz / ; watch→watches / iz /。 以“o”结尾的动词,在词尾加“es”。常出现的两个以“o”结尾的动词go和do后加“es”读/ z / 。如go→goes / z / ; do→does / z /。 记住最为特别的be的三单is ,have的三单是has。 注意: ...

2014-04-09 · 1 min · 205 words · -

在MySQL中修改表名的sql语句

在MySQL中修改表名的sql语句 http://blog.csdn.net/xrt95050/article/details/2441458 在使用MySQL时,经常遇到表名不符合规范或标准,但是表里已经有大量的数据了,如何保留数据,只更改表名呢? 可以通过建一个相同的表结构的表,把原来的数据导入到新表中,但是这样视乎很麻烦。 能否简单使用一个SQL语句就搞定呢?当然可以,MySQL5.0下我们使用这样的SQL语句就可以了。 ALTER TABLE table_name RENAME TO new_table_name 例如 ALTER TABLE admin_user RENAME TO a_user

2014-04-09 · 1 min · 18 words · -

MySQL的大小写敏感性 lower_case_table_names

MySQL的大小写敏感性 lower_case_table_names MySQL的大小写敏感性 lower_case_table_names 在 MySQL 中,数据库和表对就于那些目录下的目录和文件。因而,操作系统的敏感性决定数据库和表命名的大小写敏感。这就意味着数据库和表名在 Windows 中是大小写不敏感的,而在大多数类型的 Unix 系统中是大小写敏感的。 奇怪的是列名与列的别名在所有的情况下均是忽略大小写的,而表的别名又是区分大小写的。 要避免这个问题,你最好在定义数据库命名规则的时候就全部采用小写字母加下划线的组合,而不使用任何的大写字母。 或者也可以强制以 -O lower_case_table_names=1 参数启动 MySQLd (如果使用 -defaults-file=…\my.cnf 参数来读取指定的配置文件启动 MySQLd 的话,你需要在配置文件的 [MySQLd] 区段下增加一行 lower_case_table_names=1) 。这样MySQL 将在创建与查找时将所有的表名自动转换为小写字符 (这个选项缺省地在 Windows 中为 1 ,在 Unix 中为 0。从 MySQL 4.0.2 开始,这个选项同样适用于数据库名) 。 当你更改这个选项时,你必须在启动 MySQLd 前首先将老的表名转换为小写字母。 换句话说,如果你希望在数据库里面创建表的时候保留大小写字符状态,则应该把这个参数置: lower_case_table_names=0 。否则的话你会发现同样的sqldump脚本在不同的操作系统下最终导入的结果不一样 (在Windows下所有的大写字符都变成小写了) 。 值 含义 使用CREATE TABLE或CREATE DATABASE语句指定的大写和小写在硬盘上保存表名和数据库名。名称比较对大小写敏感。在Unix系统中的默认设置即如此。请注意如果在大小写不敏感的文件系统上用-lower-case-table-names=0强制设为0,并且使用不同的大小写访问MyISAM表名,会导致索引破坏。 1 表名在硬盘上以小写保存,名称比较对大小写敏感。MySQL将所有表名转换为小写以便存储和查找。该行为也适合数据库名和表的别名。该值为Windows和Mac OS X系统中的默认值。 2 表名和数据库名在硬盘上使用CREATE TABLE或CREATE DATABASE语句指定的大小写进行保存,但MySQL将它们转换为小写以便查找。名称比较对大小写敏感。注释: 只 在对大小写不敏感的文件系统上适用! InnoDB表名以小写保存,例如lower_case_tables_name=1。 MySQL的大小写敏感其实是根据用户的操作系统来的, 可以强制以 -O lower_case_table_names=1 参数启动 MySQLd (如果使用 -defaults-file=…\my.cnf 参数来读取指定的配置文件启动 MySQLd 的话,你需要在配置文件的 [MySQLd] 区段下增加一行 lower_case_table_names=1) 。 ...

2014-04-09 · 1 min · 171 words · -

ByteArrayInputStream ByteArrayOutputStream

ByteArrayInputStream ByteArrayOutputStream http://blog.csdn.net/rcoder/article/details/6118313 bytejdkclassstream存储socket 第一次看到ByteArrayOutputStream的时候是在Nutch的部分源码,后来在涉及IO操作时频频发现这两个类的踪迹,觉得确实是很好用,所以把它们的用法总结一下。 ByteArrayOutputStream的用法 以下是JDK中的记载: public class ByteArrayOutputStream extends OutputStream 此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray()和 toString()获取数据。 关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何IOException。 我的个人理解是ByteArrayOutputStream是用来缓存数据的 (数据写入的目标 (output stream原义) ) ,向它的内部缓冲区写入数据,缓冲区自动增长,当写入完成时可以从中提取数据。由于这个原因,ByteArrayOutputStream常用于存储数据以用于一次写入。 实例: 从文件中读取二进制数据,全部存储到ByteArrayOutputStream中。 FileInputStream fis=new FileInputStream(“test”); BufferedInputStream bis=new BufferedInputStream(fis); ByteArrayOutputStream baos=new ByteArrayOutputStream(); int c=bis.read();//读取bis流中的下一个字节 while(c!=-1){ baos.write(c); c=bis.read(); } bis.close(); byte retArr[]=baos.toByteArray(); ByteArrayInputStream的用法 相对而言,ByteArrayInputStream比较少见。先看JDK文档中的介绍: public class ByteArrayInputStreamextends InputStreamByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪 read 方法要提供的下一个字节。 关闭 ByteArrayInputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。 构造函数: ByteArrayInputStream(byte[] buf) 注意它需要提供一个byte数组作为缓冲区。 与大部分Inputstream的语义类似,可以从它的缓冲区中读取数据,所以我们可以在它的外面包装另一层的inputstream以使用我们需要的读取方法。 个人认为一个比较好的用途是在网络中读取数据包,由于数据包一般是定长的,我们可以先分配一个够大的byte数组,比如byte buf[]=new byte[1024]; 然后调用某个方法得到网络中的数据包,例如: Socket s=…; DataInputStream dis=new DataInputStream(s.getInputStream()); ...

2014-04-04 · 1 min · 85 words · -