Jackson

Jackson Jackson 框架,轻易转换JSON Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。 前面有介绍过json-lib这个框架,在线博文: http://www.cnblogs.com/hoojo/archive/2011/04/21/2023805.html 相比json-lib框架,Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。而且Jackson社区相对比较活跃,更新速度也比较快。 一、准备工作 下载依赖库jar包 Jackson的jar all下载地址: http://jackson.codehaus.org/1.7.6/jackson-all-1.7.6.jar 然后在工程中导入这个jar包即可开始工作 官方示例: http://wiki.fasterxml.com/JacksonInFiveMinutes 因为下面的程序是用junit测试用例运行的,所以还得添加junit的jar包。版本是junit-4.2.8 如果你需要转换xml,那么还需要stax2-api.jar 测试类基本代码如下 package com.hoo.test; import java.io.IOException; import java.io.StringWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.codehaus.jackson.JsonEncoding; import org.codehaus.jackson.JsonGenerationException; import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.JsonParseException; import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.node.JsonNodeFactory; import org.codehaus.jackson.xml.XmlMapper; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.hoo.entity.AccountBean; /** function:Jackson 将java对象转换成JSON字符串,也可以将JSON字符串转换成java对象 jar-lib-version: jackson-all-1.6.2 jettison-1.0.1 @author hoojo @createDate 2010-11-23 下午04:54:53 ...

2014-04-04 · 9 min · 1809 words · -

java 内部类, 静态内部类, inner class

java 内部类, 静态内部类, inner class 内部类 public class OuterClass { private String name; private int age; class InnerClass { public InnerClass(){ name = "mark"; age = 20; } public void echo() { System.out.println(name + " " + age); } } } 问题思考 上面这个很简单的例子中,也包含了很多应该思考的问题: 内部类如何被实例化? 内部类能否改变外围类的属性,两者之间又是什么一种关系? 内部类存在的意义是什么? 在回答这三个问题之前,必须要明确一个点,那就是内部类是依附于外围类而存在的,其实也就是内部类存在着指向外围类的引用。明白了这个之后,上面的问题就好解答了。 实例化与数据访问 内部类与外围类之间形成了一种联系,使得内部类可以无限制地访问外围类中的任意属性。 正如上面的例子中,InnerClass内部可以随意访问OuterClass中的private属性。 同样的,因为内部类依赖与外围类的存在,所以无法在外部直接将其实例化,而是必须先实例化外围类,才能够实例化内部类 (注意,在外围类的成员方法里仍然是可以直接实例化内部类的): public static void main(String[] args) { InnerClass inner = new OuterClass().new InnerClass(); inner.echo(); } 复制代码使用外围类的.new来创建外部类。 我们也知道,内部类和外围类的联系是通过内部类所持有的外部类的引用来实现的,想要获取这个引用,可以使用外围类的.this来实现,可以参考下面这个测试用例 public class OuterClass { private String name; private int age; class InnerClass { public InnerClass(){ name = “mark”; age = 20; } public void echo() { System.out.println(name + " " + age); } public OuterClass getOuter() { return OuterClass.this; } } ...

2014-04-04 · 5 min · 876 words · -

XML CDATA

XML CDATA 所有 XML 文档中的文本均会被解析器解析。 只有 CDATA 区段 (CDATA section) 中的文本会被解析器忽略。

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

HashMap遍历

HashMap遍历 HashMap 遍历 // 1 Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); Object key = entry.getKey(); Object val = entry.getValue(); } // 2 Map map = new HashMap(); Iterator iter = map.keySet().iterator(); while (iter.hasNext()) { Object key = iter.next(); Object val = map.get(key); } 前一种性能好些. 第一种可以把 key value 同时取出,第二种还得需要通过 key 取一次 value,效率较低。 ...

2014-04-02 · 1 min · 170 words · -

JAVA获取时间戳

JAVA获取时间戳 http://tangmingjie2009.iteye.com/blog/1543166 JAVA时间戳 目前获取毫秒值大概有下面三种方法 Java代码 收藏代码 //方法 一 System.currentTimeMillis(); //方法 二 Calendar.getInstance().getTimeInMillis(); //方法 三 new Date().getTime(); 最近做监控系统,发现代码中有前两种方法,然后突然有了一个想法,到底哪个更快呢? 然后做了如下实验: Java代码 收藏代码 import java.util.Calendar; import java.util.Date; public class TimeTest { private static long _TEN_THOUSAND=10000; public static void main(String[] args) { long times=1000*_TEN_THOUSAND; long t1=System.currentTimeMillis(); testSystem(times); long t2=System.currentTimeMillis(); System.out.println(t2-t1); testCalander(times); long t3=System.currentTimeMillis(); System.out.println(t3-t2); testDate(times); long t4=System.currentTimeMillis(); System.out.println(t4-t3); } public static void testSystem(long times){//use 188 for(int i=0;i<times;i++){ long currentTime=System.currentTimeMillis(); } } public static void testCalander(long times){//use 6299 for(int i=0;i<times;i++){ long currentTime=Calendar.getInstance().getTimeInMillis(); } } public static void testDate(long times){ ...

2014-04-01 · 1 min · 107 words · -

SAX 解析和生成XML文档

SAX解析和生成XML文档 SAX解析和生成XML文档 分类: 【xml】 2013-09-24 22:37 2207人阅读 评论(6) 收藏 举报 生成解析xmljavasax 目录? 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本人声明。否则将追究法律责任。 作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui0317/article/details/11990891 一、前言 SAX操作xml是基于事件来完成的,自己只负责调用解析的方法,然后具体解析操作都是交给DefaultHandler处理者来完成的,总的来说使用SAX解析和生成xml文档还是比较方便的 。 二、准备条件 因为SAX是jdk自带的解析方式,所以不用添加jar包引用。 三、使用SAX实战 解析xml文档 实现思路: <1>先由SAXParserFactory这个工厂的实例生产一个SAXParser解析器; <2>然后根据读取的xml路径,传递给SAXParser这个解析器,再调用parse()方法; <3>在parse()方法中需要传递DefaultHandler这个类的扩展类的实例,因为它才会真正去一步步去解析xml文档的; <4>在DefaultHandler扩展类中需要重写startDocument(),endDocument()等等方法,因为他们方法内部有返回的具体文档的结果。 具体代码如下: print? import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Result; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.sax.SAXTransformerFactory; import javax.xml.transform.sax.TransformerHandler; import javax.xml.transform.stream.StreamResult; import org.xml.sax.Attributes; ...

2014-04-01 · 7 min · 1333 words · -

4款json的java类库, FastJson

4款json的java类库, FastJson JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言。 下面介绍四款处理json的java类库: Json-lib、Gson、Jackson、Fastjson FastJson Fastjson是一个Java语言编写的JSON处理器,由阿里巴巴公司开发。网址: https://github.com/alibaba/fastjson maven依赖配置: <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.79</version> </dependency> 示例: 复制代码 public static String bean2Json(Object obj){ return JSON.toJSONString(obj); } VO vo = JSON.parseObject("...", VO.class);``` Json-lib JSON-lib is a java library for transforming beans, maps, collections, java arrays and XML to JSON and back again to beans and DynaBeans. 官网: http://json-lib.sourceforge.net/ ...

2014-03-31 · 5 min · 923 words · -

audio, 音量, 静音, ALSA

audio, 音量, 静音, ALSA ubuntu系统的声音太小,通过终端调高 alsamixer linux audio, 音量,静音 # archlinux+kde 不需要手动修改默认静音设置, 安装alsa-utils, plasma-pa后重启即可。 sudo pacman -S alsa-utils #kde sudo pacman -S plasma-pa # gnome sudo pacman -S gnome-alsamixer 调音量 alsamixer ArchLinux 安装完没有声音 解除静音 amixer -c 0 sset 'Master',0 100%,100% unmute http://blog.csdn.net/weed_hz/article/details/9226055 ALSA https://segmentfault.com/a/1190000002918394 高级 Linux 声音体系 (Advanced Linux Sound Architecture,ALSA)是Linux中提供声音设备驱动的内核组件,用来代替原来的开放声音系统 (Open Sound System,OSSv3)。除了声音设备驱动,ALSA还包含一个用户空间的函数库,以方便开发者通过高级API使用驱动功能,而不必直接与内核驱动交互。 Arch 默认的内核已经通过一套模块提供了 ALSA,不必特别安装。 udev 会在系统启动时自动检测硬件,并加载相应的声音设备驱动模块。这时,你的声卡已经可以工作了,只是所有声道默认都被设置成静音了。

2014-03-30 · 1 min · 59 words · -

linux sha1sum

linux sha1sum Print or check SHA1 (160-bit) checksums. With no FILE, or when FILE is -, read standard input. sha1sum {file} If you want to send the file together with its sha1sum output redirect the output to a file: sha1sum {file} > {file}.sha1 Send both files and the other party can do a… sha1sum -c {file}.sha1 It should show OK if the sha1 is correct.

2014-03-22 · 1 min · 65 words · -

apache commons StringUtils

apache commons StringUtils http://vipcowrie.iteye.com/blog/1513017 org.apache.commons.lang.StringUtils StringUtils是apache commons lang库 (http://commons.apache.org/lang)旗下的一个工具类,提供了很多有用的处理字符串的方法,本文不打算把所有的方法都介绍一遍,我会介绍一些精选的常用的给大家。 目前StringUtils有两个版本可用,分别是较新的org.apache.commons.lang3.StringUtils和较老的org.apache.commons.lang.StringUtils,他们有比较大的区别,前者需要JAVA 5,我想这个应该是我们希望使用的。 public static boolean equals(CharSequence str1,CharSequence str2) 我们就先从最简单的方法equals开始,和你想的一样,他需要两个字符串参数,当相同的时候返回true,否则返回false。 但是java.lang.String已经有现成的比较完美的equals方法了,为何我们还需要一个第三方的实现呢? 这个问题很好,让我们来看看下面这些代码,看看有何问题? Java代码 收藏代码 public void doStuffWithString(String stringParam) { if(stringParam.equals(“MyStringValue”)) { // do stuff } } 这个可能有NullPointerException出现,那么有几个办法处理: Java代码 收藏代码 public void safeDoStuffWithString1(String stringParam) { if(stringParam != null && stringParam.equals(“MyStringValue”)) { // do stuff } } public void safeDoStuffWithString2(String stringParm) { if(“MyStringValue”.equals(stringParam)) { // do stuff } } 我本人不喜欢上面的两个方法,第一个看起来太臃肿,第二个看起来像错误的。这里我们就可以用一些StringUtils类了,这个类提供的equals方法是空指针安全的,不用担心传递给他的是什么参数,他不会抛出空指针异常,这样写: Java代码 收藏代码 public void safeDoStuffWithString3(String stringParam) { if(StringUtils.equals(stringParam,“MyStringValue)) { // do stuff } } 这个是我个人的喜好,但是这个确实看起来比较简单易读。前面的两个方法虽然么有什么问题,但是我想StringUtils.equals还是值得考虑的。 isEmpty,isNotEmpty,isBlank,isNotBlank 和前面一样,这些方法相对于jdk提供的isEmpty方法来说,多了一个"空指针安全”,即不用考虑传递参数的空值问题,让我们来看一个例子: Java代码 收藏代码 if(myString != null && !myString.isEmpty()) { ...

2014-03-21 · 1 min · 176 words · -

excel vlookup

excel vlookup http://www.utosee.com/post/vlookup.html 今天在百度知道的时候,看到旁边有人问excel中条件查找vlookup的问题,有几位高手都知道使用vlookup作答,可惜都是没有经过测试,直接复制别人的答案,让所有的读者都无法实施,一头雾水。今天我们详细解答一下vlookup函数的实际应用问题: 问题: 如下图,已知表sheet1中的数据如下,如何在数据表二 sheet2 中如下引用: 当A列学号随机出现的时候,如何在B列显示其对应的物理成绩? vlookup-excel数据引用 首先我们知道需要用到vlookup函数,那么先介绍一下使用 vlookup函数的几个参数,vlookup是判断引用数据的函数,它总共有四个参数,依次是: 判断的条件 跟踪数据的区域 返回第几列的数据 是否精确匹配 根据以上参考,和上述在sheet2表的B列显示问题的实际需求,在sheet2表的B2单元格输入这个公式是: =vlookup(a2,sheet1!$a$2:$f$100,6,true) 详细说明一下,在此vlookup函数例子中各个参数的使用说明: a2 是判断的条件,也就是说sheet1表和sheet2表中学号相同者,即sheet2表a列对应的数据和sheet1表中学号列a列的数据相同方能引用; sheet1!$a$2:$f$100 是数据跟踪的区域,因为需要引用的数据在f列,所以跟踪的区域至少在f列,sheet1!是不同表间引用所用的表名称,和标志是表间引用的!符号,$是绝对引用 (关于绝对引用可以参考这里) ,$a$2:$f$100 表明从A2到F100单元格的数据区域,如果数据区域不止100,那么可以直接使用A:F,这样虽然方便但是有风险,因为如果sheet1表的下方还有其它数据,就有可能出现问题; 6 这是返回什么数的列数,如上图的物理是第6列,所以应该是6,如果要求英语的数值,那么此处应该是5 是否绝对引用,如果是就输入 true 如果是近似即可满足条件 那么输入false (近似值主要用于带小数点的财务、运算等) vlookup是垂直方向的判断,如果是水平方向的判断可使用Hlookup函数 结果如下图: vlookup-excel数据引用 不知道你是否已经会使用vlookup这个条件查找函数,如果你有兴趣可以试试本例。与本例结合紧密的是excel数据引用,更多的excel可以参考这里。 本文是 有图小站 原创,原地址 http://www.utosee.com/post/vlookup.html 转载请保留。

2014-03-21 · 1 min · 42 words · -

Pivot Table

Pivot Table http://www.cnblogs.com/waitrabbit/archive/2010/06/29/1767702.html “数据透视表” 英文是 Pivot Table ,直接翻译是轴向旋转表 ,什么意思呢? 及把我们的数据分成多个维度来进行统计,可以理解为我们平时说的简单报表。 (透视表?当初是那个白痴汉化的?)。举个例子来说明。 假设我们有如下的Excel数据表: 图1 可以看到销售员和产品列有许多重复的字段,那么如果我们想得到两个统计信息: 每名销售员每种产品的销售额情况和每种产品的销售额,我们应该怎么使用"透视表"得到呢? 在当前表菜单上"插入"->“数据透视表”,英文版为 “Insert”-> “Pivot Table”。 图2 红色区域为要分析的数据所在区域,即我们上面的销售数据,蓝色区域为存放"透视表"及统计报表的区域。最好在一个新的SHEET中。 点击透视表区域,出现如下图,如果不小心关了,点击右键"Show filed list": 图3 把我们想要的字段托到图示位置,显然统一销售员每种产品的销售情况,我们希望的纵轴是"销售员",横轴为"产品",统计信息为求和"销售数量"。分别对应为Row Labels, Column Labels, Values. 设置完成后会出现如下透视表: 图4 这样就完成了我们的第一个报表。 那么每种产品的销售情况怎么做? 只要在图3 的界面中 把"产品名称"拖拽到 Row labels, “销售数量"拖拽到Values 即可。读者自行实践即可。 注意在图3的界面中,我们可以使用拖拽和勾选CheckBox实现对字段配置和删除等操作。只要我们心中有了报表的设计样子,按照我们的设想,配置字段就可以了。 注意一点,源数据更新后,透视表数据并不会自动更新,需要右键->Refresh 一下。还可以在每次打开数据透视表时自动更新其中的数据。右键单击任意单元格 “Pivot Table Option” > “Data” .选中 " Refersh the data when open file”. 另外,数据统计默认是求和,如果是求最大值等等,右键单击任意单元格->“Value Filed Setting” ,可以设置其他统计方式,如下图: 简单报表就生成好了,下一讲我们可能结合具体例子,讲讲明细表等的应用。

2014-03-21 · 1 min · 62 words · -

加壳与脱壳

加壳与脱壳 http://blog.csdn.net/lzyzuixin/article/details/4104334 加壳一般是指保护程序资源的方法. 脱壳一般是指除掉程序的保护,用来修改程序资源. 病毒加壳技术与脱壳杀毒方法 : 壳是什么?脱壳又是什么?这是很多经常感到迷惑和经常提出的问题,其实这个问题一点也不幼稚。当你想听说脱壳这个名词并试着去了解的时候,说明你已经在各个安全站点很有了一段日子了。下面,我们进入"壳"的世 界吧。 金蝉脱壳的故事 我先想讲个故事吧。那就是金蝉脱壳。金蝉脱壳属于三十六计中的混战计。金蝉脱壳的本意是: 寒蝉在蜕变时,本体脱离皮壳而走,只留下蝉蜕还挂在枝头。此计用于军事,是指通过伪装摆脱敌人,撤退或转移,以实现我方的战略目标的谋略。稳住对方,撤退或转移,决不是惊慌失措,消极逃跑,而是保留形式,抽走内容,稳住对方,使自己脱离险境达到己方战略目标,己方常常可用巧妙分兵转移的机会出击另一部分敌人。三国时期,诸葛亮六出祁山,北伐中原,但一直未能成功,终于在第六次北伐时,积劳成疾,在五丈原病死于军中。 维遵照诸葛亮的吩咐,在诸葛亮死后,秘不发丧,对外严密封锁消息。他带着灵柩,秘密率部撤退。司马懿派部队跟踪追击蜀军。姜维命工匠仿诸葛亮摸样,雕了一个木人,羽扇纶巾,稳坐车中。并派杨仪率领部分人马大张旗鼓,向魏军发动进攻。魏军远望蜀军,军容整齐,旗鼓大张,又见诸葛亮稳坐车中,指挥若定,不知蜀军又耍什么花招,不敢轻举妄动。司马懿一向知道诸葛亮"诡计多端",又怀疑此次退兵乃是诱敌之计,于是命令部队后撤,观察蜀军动向。姜维趁司马懿退兵的大好时机,马上指挥主力部队,迅速安全转移,撤回汉中。等司马懿得知诸葛亮已死,再进兵追击,为时已晚。相信这个故事,大家在大型连续剧《三国演义》里已经看过了。呵呵,只是没有理解得这么深入罢了!而在黑客入侵技术中,金蝉脱壳则是指: 删除系统运行日志 攻击者攻破系统后,常删除系统运行日志,隐藏自己的痕迹…呵呵 二、壳,脱壳,加壳 在自然界中,我想大家对壳这东西应该都不会陌生了,由上述故事,我们也可见一斑。自然界中植物用它来保护种子,动物用它来保护身体等等。同样,在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。就像动植物的壳一般都是在身体外面一样理所当然 (但后来也出现了所谓的"壳中带籽"的壳) 。由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,大家就把这样的程序称为"壳"了。就像计算机病毒和自然界的病毒一样,其实都是命名上的方法罢了。 从功能上抽象,软件的壳和自然界中的壳相差无几。无非是保护、隐蔽壳内的东西。而从技术的角度出发,壳是一段执行于原始程序前的代码。原始程序的代码在加壳的过程中可能被压缩、加密……。当加壳后的文件执行时,壳-这段代码先于原始程序运行,他把压缩、加密后的代码还原成原始程序代码,然后再把执行权交还给原始代码。 软件的壳分为加密壳、压缩壳、伪装壳、多层壳等类,目的都是为了隐藏程序真正的OEP (入口点,防止被破解) 。关于"壳"以及相关软件的发展历史请参阅吴先生的《一切从"壳"开始》。 壳的概念 作者编好软件后,编译成exe可执行文件。 1.有一些版权信息需要保护起来,不想让别人随便改动,如作者的姓名,即为了保护软件不被破解,通常都是采用加壳来进行保护。 2.需要把程序搞的小一点,从而方便使用。于是,需要用到一些软件,它们能将exe可执行文件压缩, 3.在黑客界给木马等软件加壳脱壳以躲避杀毒软件。实现上述功能,这些软件称为加壳软件。 (二) 加壳软件最常见的加壳软件 ASPACK ,UPX,PEcompact 不常用的加壳软件WWPACK32;PE-PACK ;PETITE NEOLITE (三) 侦测壳和软件所用编写语言的软件 因为脱壳之前要查他的壳的类型。 1.侦测壳的软件fileinfo.exe 简称fi.exe (侦测壳的能力极强) 。 2.侦测壳和软件所用编写语言的软件language.exe (两个功能合为一体,很棒) ,推荐language2000中文版 (专门检测加壳类型) 。 3.软件常用编写语言Delphi,VisualBasic (VB) -最难破,VisualC (VC) 。 (四) 脱壳软件 软件加壳是作者写完软件后,为了保护自己的代码或维护软件产权等利益所常用到的手段。目前有很多加壳工具,当然有盾,自然就有矛,只要我们收集全常用脱壳工具,那就不怕他加壳了。软件脱壳有手动脱和自动脱壳之分,下面我们先介绍自动脱壳,因为手动脱壳需要运用汇编语言,要跟踪断点等,不适合初学者,但我们在后边将稍作介绍。 加壳一般属于软件加密,现在越来越多的软件经过压缩处理,给汉化带来许多不便,软件汉化爱好者也不得不学习掌握这种技能。现在脱壳一般分手动和自动两种,手动就是用TRW2000、TR、SOFTICE等调试工具对付,对脱壳者有一定水平要求,涉及到很多汇编语言和软件调试方面的知识。而自动就是用专门的脱壳工具来脱,最常用某种压缩软件都有他人写的反压缩工具对应,有些压缩工具自身能解压,如UPX;有些不提供这功能,如: ASPACK,就需要UNASPACK对付,好处是简单,缺点是版本更新了就没用了。另外脱壳就是用专门的脱壳工具来对付,最流行的是PROCDUMP v1.62 ,可对付目前各种压缩软件的压缩档。在这里介绍的是一些通用的方法和工具,希望对大家有帮助。我们知道文件的加密方式,就可以使用不同的工具、不同的方法进行脱壳。下面是我们常常会碰到的加壳方式及简单的脱壳措施,供大家参考: 脱壳的基本原则就是单步跟踪,只能往前,不能往后。脱壳的一般流程是: 查壳->寻找OEP->Dump->修复 找OEP的一般思路如下: 先看壳是加密壳还是压缩壳,压缩壳相对来说容易些,一般是没有异常,找到对应的popad后就能到入口,跳到入口的方式一般为。 我们知道文件被一些压缩加壳软件加密,下一步我们就要分析加密软件的名称、版本。因为不同软件甚至不同版本加的壳,脱壳处理的方法都不相同。 常用脱壳工具: 文件分析工具 (侦测壳的类型) : Fi,GetTyp,peid,pe-scan, OEP入口查找工具: SoftICE,TRW,ollydbg,loader,peid dump工具: IceDump,TRW,PEditor,ProcDump32,LordPE PE文件编辑工具PEditor,ProcDump32,LordPE ...

2014-03-20 · 1 min · 154 words · -

Android APK加壳技术方案

Android APK加壳技术方案 本文章由Jack_Jia编写,转载请注明出处。 文章链接: http://blog.csdn.net/jiazhijun/article/details/8678399 作者: Jack_Jia 邮箱: 309zhijun@163.com 一、什么是加壳? 加壳是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,做一些额外的工作。大多数病毒就是基于此原理。PC EXE文件加壳的过程如下: 二、加壳作用 加壳的程序可以有效阻止对程序的反汇编分析,以达到它不可告人的目的。这种技术也常用来保护软件版权,防止被软件破解。 三、Android Dex文件加壳原理 PC平台现在已存在大量的标准的加壳和解壳工具,但是Android作为新兴平台还未出现APK加壳工具。Android Dex文件大量使用引用给加壳带来了一定的难度,但是从理论上讲,Android APK加壳也是可行的。 在这个过程中,牵扯到三个角色: 加壳程序: 加密源程序为解壳数据、组装解壳程序和解壳数据 解壳程序: 解密解壳数据,并运行时通过DexClassLoader动态加载 源程序: 需要加壳处理的被保护代码 阅读该文章,需要您对DEX文件结构有所了解,您可以通过以下网址了解相关信息: http://blog.csdn.net/jiazhijun/article/details/8664778 根据解壳数据在解壳程序DEX文件中的不同分布,本文将提出两种Android Dex加壳的实现方案。 (一) 解壳数据位于解壳程序文件尾部 该种方式简单实用,合并后的DEX文件结构如下。 加壳程序工作流程: 加密源程序APK文件为解壳数据 把解壳数据写入解壳程序Dex文件末尾,并在文件尾部添加解壳数据的大小。 修改解壳程序DEX头中checksum、signature 和file_size头信息。 修改源程序AndroidMainfest.xml文件并覆盖解壳程序AndroidMainfest.xml文件。 解壳DEX程序工作流程: 读取DEX文件末尾数据获取借壳数据长度。 从DEX文件读取解壳数据,解密解壳数据。以文件形式保存解密数据到a.APK文件 通过DexClassLoader动态加载a.apk。 (二) 解壳数据位于解壳程序文件头 该种方式相对比较复杂, 合并后DEX文件结构如下: 加壳程序工作流程: 加密源程序APK文件为解壳数据 计算解壳数据长度,并添加该长度到解壳DEX文件头末尾,并继续解壳数据到文件头末尾。 (插入数据的位置为0x70处) 修改解壳程序DEX头中checksum、signature、file_size、header_size、string_ids_off、type_ids_off、proto_ids_off、field_ids_off、 method_ids_off、class_defs_off和data_off相关项。 分析map_off 数据,修改相关的数据偏移量。 修改源程序AndroidMainfest.xml文件并覆盖解壳程序AndroidMainfest.xml文件。 解壳DEX程序工作流程: 从0x70处读取解壳数据长度。 从DEX文件读取解壳数据,解密解壳数据。以文件形式保存解密数据到a.APK 通过DexClassLoader动态加载a.APK。 四、加壳及脱壳代码实现 http://blog.csdn.net/jiazhijun/article/details/8809542

2014-03-20 · 1 min · 62 words · -

Android程序的反破解技术

Android程序的反破解技术 http://blog.csdn.net/viviwen123/article/details/9117589 逆向Android软件的步骤: 首先是对其进行反编译,然后阅读反汇编代码,如果有必要还会对其进行动态调试,找到突破口后注入或直接修改反汇编代码,最后重新编译软件进行测试。整个过程可分为反编译、静态分析、动态调试、重编译等4个环节。反破解技术也是从这四个方面进行的。 一、对抗反编译工具 (如ApkTool、BackSmali、dex2jar) ,使其无法进行反编译,或者反编译后无法得到软件正确的反汇编代码。 思路是: 寻找反编译工具在处理apk或dex文件时的缺陷,然后在自己的软件中加以利用。主要方法有: 阅读反编译工具源码。 压力测试。测试大量apk文件,找到反编译工具反编译不了的,分析其特征。 此方法难度较大,而且反编译工具不断升级,方法容易过时,因此不太建议。 二、对抗静态分析。 代码混淆技术: Android2.3的SDK中正式加入了ProGuard代码混淆工具,开发人员可以使用该工具对自己的代码进行混淆。Android2.3以前的项目同样可以使用此工具。 NDK保护。 外壳保护。java由于其语言自身特殊性,没有外壳保护这个概念,只能通过混淆方式对其进行保护。外壳保护重点针对使用NDK编写的Native代码,逆向Native本身就已经够困难了,如果添加了外壳保护则更是难上加难,目前已知可用于ARM Linux内核程序的加壳工具只有upx。 三、对抗动态调试。 检测调试器: 动态调试使用调试器来挂钩软件,获取软件运行时的数据,我们可以在软件中加入检测调试器的代码,当检测到软件被调试器连接时,中止软件的运行。 首先,在AndroidManifest.xml文件的Application标签中加入android:debuggable=“false”,让程序不可调试,这样,如果别人想调试该程序,就必然会修改它的值,我们在代码中检查它的值来判断程序是否被修改过。代码如下: if (0!=(getApplicationInfo().flags&=ApplicationInfo.FLAG_DEBUGGABLE)) { Log.e("DEBUG", "程序被修改为可调试状态!!!"); android.os.Process.killProcess(android.os.Process.myPid()); } 另外,Android SDK中提供了一个方法方便程序员来检测调试器是否已经连接,代码如下: android.os.Debug.isDebuggerConnected() 如果方法返回真,说明了调试器已经连接。我们可以随机地在软件中插入这行代码来检测调试器,碰到有调试器连接就果断地结束程序运行。 检测模拟器。 软件发布后会安装到用户的手机中运行,如果有发现软件运行在模拟器中,很显然不合常理,可能是有人试图破解或分析它,这种情况我们必须予以阻止。 模拟器与真实的Android手机有许多差异,我们可以在命令提示符下执行"adb shell getprop"查看并对比它们的属性值,经过对比发现如下几个属性值可以用来判断软件是否运行在模拟器中: ro.product.model、ro.build.tag、ro.kernel.qemu。编写检测代码如下: boolean isRunningInEmualtor() { boolean qemuKernel = false; Process process = null; DataOutputStream os = null; try{ process = Runtime.getRuntime().exec("getprop ro.kernel.qemu"); os = new DataOutputStream(process.getOutputStream()); BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK")); os.writeBytes("exit\n"); os.flush(); process.waitFor(); qemuKernel = (Integer.valueOf(in.readLine()) == 1); Log.d("com.droider.checkqemu", "检测到模拟器:" + qemuKernel); } catch (Exception e){ qemuKernel = false; Log.d("com.droider.checkqemu", "run failed" + e.getMessage()); } finally { try{ if (os != null) { os.close(); } process.destroy(); } catch (Exception e) { } Log.d("com.droider.checkqemu", "run finally"); } return qemuKernel; } public static String getProp(Context context, String property) { try { ClassLoader cl = context.getClassLoader(); Class SystemProperties = cl.loadClass("android.os.SystemProperties"); Method method = SystemProperties.getMethod("get", String.class); Object[] params = new Object[1]; params[0] = new String(property); return (String)method.invoke(SystemProperties, params); } catch (Exception e) { return null; } } 四、防止重编译。 ...

2014-03-20 · 2 min · 260 words · -

APK保护技术

APK保护技术 http://my.eoe.cn/1177576/archive/10575.html 由于Java字节码的抽象级别较高,因此Android的APK较容易被反编译,而国内对于网络产品保护不力。如果一款应用APK被破解,那么可能会被他人植入广告或者病毒以供他人盈利或窃取用户信息;如果一款游戏APK被破解,那么这款游戏可能会从收费版变成免费版,游戏的支付系统也形同虚设。不管是哪种情况,对于开发者来说,APK被破解绝对是一场噩梦,而自己手动设置各种加密不但耗时耗力,而且不一定能收到很好的效果。本文介绍几种常用的方法,用于保护Java字节码不被反编译。通常,这些方法不能够绝对防止程序被反编译,而是加大反编译的难度而已,因为这些方法都有自己的使用环境和弱点。 1.隔离Java程序 最简单的方法就是让用户不能够访问到Java Class程序,这种方法是最根本的方法,具体实现有多种方式。例如,开发人员可以将关键的Java Class放在服务器端,客户端通过访问服务器的相关接口来获得服务,而不是直接访问Class文件。这样黑客就没有办法反编译Class文件。目前,通过接口提供服务的标准和协议也越来越多,例如 HTTP、Web Service、RPC等。但是有很多应用都不适合这种保护方式,例如对于单机运行的程序就无法隔离Java程序。 2.对Class文件进行加密 2 为了防止Class文件被直接反编译,许多开发人员将一些关键的Class文件进行加密,例如对注册码、序列号管理相关的类等。在使用这些被加密的类之前,程序首先需要对这些类进行解密,而后再将这些类装载到JVM当中。这些类的解密可以由硬件完成,也可以使用软件完成。 在实现时,开发人员往往通过自定义ClassLoader类来完成加密类的装载(注意由于安全性的原因,Applet不能够支持自定义的ClassLoader)。自定义的ClassLoader首先找到加密的类,而后进行解密,最后将解密后的类装载到JVM当中。在这种保护方式中,自定义的ClassLoader是非常关键的类。由于它本身不是被加密的,因此它可能成为黑客最先攻击的目标。如果相关的解密密钥和算法被攻克,那么被加密的类也很容易被解密。 3.转换成本地代码 将程序转换成本地代码也是一种防止反编译的有效方法。因为本地代码往往难以被反编译。开发人员可以选择将整个应用程序转换成本地代码,也可以选择关键模块转换。如果仅仅转换关键部分模块,Java程序在使用这些模块时,需要使用JNI技术进行调用。当然,在使用这种技术保护Java程序的同时,也牺牲了Java的跨平台特性。对于不同的平台,我们需要维护不同版本的本地代码,这将加重软件支持和维护的工作。不过对于一些关键的模块,有时这种方案往往是必要的。为了保证这些本地代码不被修改和替代,通常需要对这些代码进行数字签名。在使用这些本地代码之前,往往需要对这些本地代码进行认证,确保这些代码没有被黑客更改。如果签名检查通过,则调用相关JNI方法。 4.代码混淆 代码混淆是对Class文件进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能(语义)。但是混淆后的代码很难被反编译,即反编译后得出的代码是非常难懂、晦涩的,因此反编译人员很难得出程序的真正语义。从理论上来说,黑客如果有足够的时间,被混淆的代码仍然可能被破解,甚至目前有些人正在研制反混淆的工具。但是从实际情况来看,由于混淆技术的多元化发展,混淆理论的成熟,经过混淆的Java代码还是能够很好地防止反编译。下面我们会详细介绍混淆技术,因为混淆是一种保护Java程序的重要技术。 5.在线加密 APK Protect(http://www.apkprotect.com/)是一个在线对APK程序进行加密的网站,可以支持Java和C+ +语言的保护,能达到反调试、反编译的效果,操作过程简单易用: 仅需上传你的APK,选择加密项目,等待服务器加密 (通常一两个小时左右) 后即可下载加壳的APK,然后再签名上传到应用市场即可。经测试,通过APK Protect加密的APK变得非常难以破解,从而保护了APK。 from eoe.cn

2014-03-20 · 1 min · 27 words · -

favicon

favicon 获取网站favicon http://www.google.com/s2/favicons?domain=google.com home.html 代码如下: 下面两行代码就可以告诉浏览器使用wangyi.ico 作为home.html的图标了:

2014-03-19 · 1 min · 7 words · -

outlook2010邮件签名

outlook2010 邮件签名 outlook2010邮件签名并自动更新日期时间的方法: 菜单-文件->选项->邮件->创建或修改邮件的签名: 按钮 签名->新建 此 致 致礼! 深圳市xxx有限公司: 研发部: 牛凯 地址: 深圳市xxx 固定电话: 0755-xxxx 联系手机: 137xxx 邮箱地址: 时间: { TIME @ “yyyy年M月d日星期 W” }{ TIME @ “H时m分” } 如何得到时间格式写法的参考? 1.开始->新建电子邮件->新窗口中: 插入->日期和时间->选择语言和格式,确定->可得到签名中想要的格式。 签名中设置自动更新时间的步骤: 1 在要插入日期的签名编辑中,按Ctrl + F9 出现域 { } , 2 在此域中输入大括号内的内容 { TIME @ “yyyy年M月d日星期 W” } 然后点保存编辑,ok了。 3 新建邮件中看不到日期时间只看到格式,但是发送出去的是自动更新的时间。

2014-03-19 · 1 min · 53 words · -

Java获取客户端真实IP地址的两种方法

Java获取客户端真实IP地址的两种方法 http://dpn525.iteye.com/blog/1132318 在JSP里,获取客户端的IP地址的方法是: request.getRemoteAddr () ,这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。 在JSP里,获取客户端的IP地址的方法是: request.getRemoteAddr () ,这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。 如果使用了反向代理软件,将http://192.168.1.110: 2046/ 的URL反向代理为 http://www.javapeixun.com.cn / 的URL时,用request.getRemoteAddr () 方法获取的IP地址是: 127.0.0.1或192.168.1.110,而并不是客户端的真实IP。 经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问http://www.javapeixun.com.cn/index.jsp/ 时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问http://192.168.1.110: 2046/index.jsp ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr () 的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。 于是可得出获得客户端真实IP地址的方法一: Java代码 收藏代码 public String getRemortIP(HttpServletRequest request) { if (request.getHeader(“x-forwarded-for”) == null) { return request.getRemoteAddr(); } return request.getHeader(“x-forwarded-for”); } 可是当我访问http://www.5a520.cn /index.jsp/ 时,返回的IP地址始终是unknown,也并不是如上所示的127.0.0.1或192.168.1.110了,而我访问http://192.168.1.110: 2046/index.jsp 时,则能返回客户端的真实IP地址,写了个方法去验证。原因出在了Squid上。squid.conf 的配制文件forwarded_for 项默认是为on,如果 forwarded_for 设成了 off 则: X-Forwarded-For: unknown 于是可得出获得客户端真实IP地址的方法二: Java代码 收藏代码 public String getIpAddr(HttpServletRequest request) { String ip = request.getHeader(“x-forwarded-for”); if(ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)) { ...

2014-03-13 · 2 min · 302 words · -

putty

putty ssh 超时 http://blog.fens.me/putty-timeout/ 用Putty进行SSH连接的时候,如果几分钟没动,就会出现断线的情况,然后Putty客户端就死了。 为了解决这个问题,我们需要让客户端与Server端,一直保持发包状态,就可以避免Putty断线的情况。 操作如下: putty –>Connection –> Seconds Between keepalives –>60 远程桌面 看不到 鼠标指针 https://support.huawei.com/enterprise/zh/knowledge/EKB1000027195 windows版本: windows server 2008 R2 Standard 在控制面板中搜索"鼠标",选择"更改鼠标指针的外观 在"指针"标签页中,在"自定义"栏目里,找到"文本选择"项; 选择"文本选择",然后"浏览"定义鼠标图形,在弹出的对话框中选择"beam_r.cur",确认即可。 根因 鼠标在putty (或者某些黑色编辑器) 中光标不能自动反白,可通过更改光标的样式来解决看不到光标的问题。 win10 控制面板中搜索"鼠标 " 点击 “更改指针大小 和颜色” 选择 黑色

2014-03-13 · 1 min · 39 words · -