<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.lufie.net/styles/feedsky2.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.lufie.net" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feed.feedsky.com/lufie" type="application/rss+xml"></fs:self_link><lastBuildDate>Wed, 09 May 2012 13:15:10 GMT</lastBuildDate><title>路菲尔 Lufie.Net</title><description>有爱就有ACG</description><link>http://blog.creke.net</link><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><language>en</language><pubDate>Wed, 09 May 2012 13:15:10 GMT</pubDate><item><title>Android中Java编写的APK使用apktool反编译并修改smali</title><link>http://item.feedsky.com/~feedsky/lufie/~8014392/636407226/6123365/1/item.html</link><content:encoded>&lt;p&gt;今天装了某个游戏，游戏中有“商店”，可以用金币购买相关物品。而获得金币的途径，是用人民币购买（1元100只）或者安装该公司的其他应用（安装3款得一点点）。&lt;/p&gt;
&lt;p&gt;这显然不科学啊！&lt;/p&gt;
&lt;p&gt;当然，程序在我机子上，我们当然能够用科学的手段来对付不科学的游戏货币商城制度。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1、使用apktool进行反编译，得到smali的字节码&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;假设游戏安装文件为my_game.apk，我们将把它反编译到mygame目录下。&lt;/p&gt;
&lt;p&gt;在&lt;a href=&quot;http://code.google.com/p/android-apktool/&quot; target=&quot;_blank&quot;&gt;这里&lt;/a&gt;下载apktool和对应的dependencies，把apktool和对应的dependencies加压缩到一起，并将该文件夹添加到path环境变量中。我在使用Windows系统，这时候apktool的解压文件夹有以下内容：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;aapt.exe&lt;/p&gt;
&lt;p&gt;apktool.bat&lt;/p&gt;
&lt;p&gt;apktool.jar&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;然后对my_game.apk进行反编译，运行命令：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;apktool d my_game.apk mygame&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;可以看到apktool将游戏反编译到mygame文件夹中。其中的smali就是对应的字节码。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2、修改smali字节码&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;关于smali字节码的寄存器可以参考&lt;a href=&quot;http://code.google.com/p/smali/wiki/Registers&quot; target=&quot;_blank&quot;&gt;这里&lt;/a&gt;，类型、函数和成员可以参考&lt;a href=&quot;http://code.google.com/p/smali/wiki/TypesMethodsAndFields&quot; target=&quot;_blank&quot;&gt;这里&lt;/a&gt;，操作符号可以参考&lt;a href=&quot;http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html&quot; target=&quot;_blank&quot;&gt;这里&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;当然，由于程序已经混淆，所以不能从文件名和包名中猜测相关信息。这时候有好几个办法定位到要修改的地方。如调试设断点，在&lt;a href=&quot;http://code.google.com/p/android-apktool/wiki/SmaliDebugging&quot; target=&quot;_blank&quot;&gt;这里&lt;/a&gt;有教程。还可以通过资源和字符串定位，这是我现在使用的方法，因为我的调试环境还没搭好……&lt;/p&gt;
&lt;p&gt;我注意到，某一个与购买相关的按钮图片的id编号为“0&amp;#215;7f020093”，于是在smali中搜索，最后在某个文件夹，也就对应Java的某个包中找到g.smali，这个文件包含了字符串“0&amp;#215;7f020093”。然后，点击购买时，会提示“金币不足,无法购买”，这是文本信息。也就是说，可以在g.smali中搜索该字符串，或者字符串子串来进行程序上下文的定位。当然，直接搜索中文字符串是一无所获的，因为反编译器将中文以utf8的裸编码格式表现。这时候在g.smali中搜索“\u91d1\u5e01\u4e0d\u8db3,\u65e0\u6cd5\u8d2d\u4e70”，找到详细位置！具体代码片段如下：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;sget-object v0, La/f/c;-&amp;gt;s:La/a/b/g; &lt;/p&gt;
&lt;p&gt;iget-object v9, v0, La/a/b/g;-&amp;gt;j:Ld/a/b; &lt;/p&gt;
&lt;p&gt;iget v10, p2, La/d/n;-&amp;gt;f:I &lt;/p&gt;
&lt;p&gt;iget v0, v9, Ld/a/b;-&amp;gt;v:I &lt;/p&gt;
&lt;p&gt;if-ge v0, v10, :cond_0 &lt;/p&gt;
&lt;p&gt;invoke-static {}, Lcom/gale/manager/f;-&amp;gt;a()Lcom/gale/manager/f; &lt;/p&gt;
&lt;p&gt;move-result-object v0 &lt;/p&gt;
&lt;p&gt;const-string v1, &amp;quot;\u91d1\u5e01\u4e0d\u8db3,\u65e0\u6cd5\u8d2d\u4e70&amp;quot; &lt;/p&gt;
&lt;p&gt;invoke-virtual {v0, v1}, Lcom/gale/manager/f;-&amp;gt;a(Ljava/lang/String;)V &lt;/p&gt;
&lt;p&gt;:goto_0     &lt;br /&gt;return-void &lt;/p&gt;
&lt;p&gt;:cond_0     &lt;br /&gt;neg-int v0, v10 &lt;/p&gt;
&lt;p&gt;iput v0, v9, Ld/a/b;-&amp;gt;x:I &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;需要关注的是“if-ge”这句，意思是如果v0大于等于v10，则跳到cond_0执行，否则显示“金币不足，无法购买”并返回。&lt;/p&gt;
&lt;p&gt;我们可以直接将“if-ge”改成“if-le”解决问题，不过这时金币会在购买后变负数，说不定会把游戏crash。所以，更好的修改方法如下：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; sget-object v0, La/f/c;-&amp;gt;s:La/a/b/g; &lt;/p&gt;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; iget-object v9, v0, La/a/b/g;-&amp;gt;j:Ld/a/b; &lt;/p&gt;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; iget v10, p2, La/d/n;-&amp;gt;f:I &lt;/p&gt;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; iget v0, v9, Ld/a/b;-&amp;gt;v:I &lt;/p&gt;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; if-ge v0, v10, :cond_0     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; goto/16 :cond_0 &lt;/p&gt;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; :goto_0     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return-void &lt;/p&gt;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; :cond_0     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; move v0, v10 &lt;/p&gt;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; iput v0, v9, Ld/a/b;-&amp;gt;x:I&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;意思是，即使当前金币小于购买所需金币，也跳到条件成立的地方执行。另外，执行时会将玩家的金币数加上所需金币的相反数，即“neg-int v0, v10”，将其改为“move v0, v10”就可以每次都把玩家的金币数加上所需金币数。最终效果则是，即使金币不足也可以购买，并且越买钱越多。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3、打包、签名和安装修改后的apk&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;修改完了，就可以打包回apk了。执行以下命令：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;apktool b mygame&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在mygame目录下的dist在会看到打包好的apk。&lt;/p&gt;
&lt;p&gt;当然，现在一般是无法安装的，因为apk还没有签名。下面就来签名。签名需要keystore文件，我已经有专用的keystore了，如果还没有，请参阅&lt;a href=&quot;http://developer.android.com/guide/publishing/app-signing.html&quot; target=&quot;_blank&quot;&gt;这里&lt;/a&gt;进行生成。&lt;/p&gt;
&lt;p&gt;执行以下命令为重新编译的my_game.apk签名：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;jarsigner -verbose -keystore creke.keystore my_game.apk Alias_name&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最后，在安装到手机前，需要把手机中的已有版本先卸载，因为如果签名不同，是不能覆盖安装的，会提示“应用程序未安装”错误。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4、其他&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Windows下的aapt似乎不能对非本地磁盘进行读写，比如我原来在内存盘中进行操作，apktool总是提示aapt出错，不能打包apk。后来放到本地磁盘中进行才一切正常。&lt;/p&gt;
&lt;p&gt;最后说一句，好的游戏从来不会用奇怪的货币和商城来吸引玩家或者玩家的钱财。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/636407226/lufie/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/lufie/~8014392/636407226/6123365/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.creke.net/786.html/feed</wfw:commentRss><slash:comments>2</slash:comments><description>今天装了某个游戏，游戏中有“商店”，可以用金币购买相关物品。而获得金币的途径，是用人民币购买（1元100只）或者安装该公司的其他应用（安装3款得一点点）。  这显然不科学啊！  当然，程序在我机子上，我们当然能够用科学的手段来对付不科学的游戏货币商城制度。  1、使用apktool进行反编译，得到...&lt;img src=&quot;http://www1.feedsky.com/t1/636407226/lufie/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/lufie/~8014392/636407226/6123365/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>APK</category><category>反编译</category><category>JAVA</category><category>decompile</category><category>Android</category><category>所谓技术</category><category>apktool</category><category>smali</category><pubDate>Wed, 09 May 2012 21:15:10 +0800</pubDate><author>creke</author><comments>http://blog.creke.net/786.html#comments</comments><guid isPermaLink="false">http://blog.creke.net/786.html</guid><dc:creator>creke</dc:creator><fs:srclink>http://blog.creke.net/786.html</fs:srclink><fs:srcfeed>http://lufie.net/feed/</fs:srcfeed><fs:itemid>feedsky/lufie/~8014392/636407226/6123365</fs:itemid></item><item><title>PHP与JAVA使用AES128位加密通信</title><link>http://item.feedsky.com/~feedsky/lufie/~8014392/636407227/6123365/1/item.html</link><content:encoded>&lt;p&gt;本来JAVA和JSP之间加密通信好好的，相同的函数，相同的处理，不会有其他大问题。不过有时候就是蛋疼啊，于是就有了PHP与JAVA间使用AES进行加密通信。&lt;/p&gt;
&lt;p&gt;PHP的AES128位由mcrypt模块提供，称为MCRYPT_RIJNDAEL_128。&lt;/p&gt;
&lt;p&gt;JAVA的AES默认就是128位的。&lt;/p&gt;
&lt;p&gt;加密模式有好几种，不同的语言不同的库支持的情况不同。这里选择的是安全且通用的CBC模式。&lt;/p&gt;
&lt;p&gt;至于padding，这是最头疼的问题，因为PHP的padding与Java的padding不一样。如果使用NoPadding，则默认又用不了CBC模式。所以，最好的解决方法是自己padding——在原文末尾加上若干个空格，使原文凑齐16的倍数的长度。当然，原文末尾也可能是空格结束啊，那怎么办？没办法，只有强制原文末尾加上一个换行。这样子，每次解密后，将最右边的换行以及其右边的空格裁剪掉，就得到原文了。&lt;/p&gt;
&lt;p&gt;另外，为了兼容，在加密和解密时，需要将内容转换成16进制的字符数组。这样一来，即使加密/解密的内容不是普通文本，而是二进制数据，也可以轻松传送啦。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JAVA方面&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;初始化代码：&lt;/p&gt;
&lt;pre&gt;        &lt;span style=&quot;color: #0000ff&quot;&gt;try&lt;/span&gt; {
            cipherEnc = Cipher.getInstance(&amp;quot;&lt;span style=&quot;color: #8b0000&quot;&gt;AES/CBC/NoPadding&lt;/span&gt;&amp;quot;);
        } &lt;span style=&quot;color: #0000ff&quot;&gt;catch&lt;/span&gt; (NoSuchAlgorithmException ex) {
            ex.printStackTrace();
        } &lt;span style=&quot;color: #0000ff&quot;&gt;catch&lt;/span&gt; (NoSuchPaddingException ex) {
            ex.printStackTrace();
        }
        &lt;span style=&quot;color: #0000ff&quot;&gt;try&lt;/span&gt; {
            cipherDec = Cipher.getInstance(&amp;quot;&lt;span style=&quot;color: #8b0000&quot;&gt;AES/CBC/NoPadding&lt;/span&gt;&amp;quot;);
        } &lt;span style=&quot;color: #0000ff&quot;&gt;catch&lt;/span&gt; (NoSuchAlgorithmException ex) {
            ex.printStackTrace();
        } &lt;span style=&quot;color: #0000ff&quot;&gt;catch&lt;/span&gt; (NoSuchPaddingException ex) {
            ex.printStackTrace();
        }

        key = &lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; SecretKeySpec(keyStr.getBytes(), &amp;quot;&lt;span style=&quot;color: #8b0000&quot;&gt;AES&lt;/span&gt;&amp;quot;);
        iv = &lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; IvParameterSpec(ivStr.getBytes());&lt;/pre&gt;
&lt;p&gt;加密解密及其核心函数：&lt;/p&gt;
&lt;pre&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt; String padRight(String s, &lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt; n) {
        &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; String.format(&amp;quot;&lt;span style=&quot;color: #8b0000&quot;&gt;%1$-&lt;/span&gt;&amp;quot; + n + &amp;quot;&lt;span style=&quot;color: #8b0000&quot;&gt;s&lt;/span&gt;&amp;quot;, s);
    }

    &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt; String padLeft(String s, &lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt; n) {
        &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; String.format(&amp;quot;&lt;span style=&quot;color: #8b0000&quot;&gt;%1$#&lt;/span&gt;&amp;quot; + n + &amp;quot;&lt;span style=&quot;color: #8b0000&quot;&gt;s&lt;/span&gt;&amp;quot;, s);
    }

    &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; String encrypt(SecretKeySpec enc_key, IvParameterSpec enc_iv, String str){
        &lt;span style=&quot;color: #0000ff&quot;&gt;byte&lt;/span&gt;[] ret = &lt;span style=&quot;color: #0000ff&quot;&gt;null&lt;/span&gt;;

        &lt;span style=&quot;color: #0000ff&quot;&gt;try&lt;/span&gt; {
            cipherEnc.init(Cipher.ENCRYPT_MODE, enc_key, enc_iv);
            ret = cipherEnc.doFinal(padRight(str,
                    ((&lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt;)Math.ceil(str.length() / 16.0))*16).getBytes());
        } &lt;span style=&quot;color: #0000ff&quot;&gt;catch&lt;/span&gt; (Exception ex) {
            ex.printStackTrace();
            &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;null&lt;/span&gt;;
        }

        &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; byteArray2HexString(ret);
    }

    &lt;span style=&quot;color: #008000&quot;&gt;/*
     * str is Hex String
     */&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; String decrypt(SecretKeySpec dec_key, IvParameterSpec dec_iv, String str){
        &lt;span style=&quot;color: #0000ff&quot;&gt;byte&lt;/span&gt;[] ret = &lt;span style=&quot;color: #0000ff&quot;&gt;null&lt;/span&gt;;

        &lt;span style=&quot;color: #0000ff&quot;&gt;try&lt;/span&gt; {
            cipherDec.init(Cipher.DECRYPT_MODE, dec_key, dec_iv);
            ret = cipherDec.doFinal(hexString2ByteArray(str));
        } &lt;span style=&quot;color: #0000ff&quot;&gt;catch&lt;/span&gt; (Exception ex) {
            ex.printStackTrace();
            &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;null&lt;/span&gt;;
        }

        &lt;span style=&quot;color: #0000ff&quot;&gt;try&lt;/span&gt; {
			&lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; String(ret, &amp;quot;&lt;span style=&quot;color: #8b0000&quot;&gt;UTF-8&lt;/span&gt;&amp;quot;);
		} &lt;span style=&quot;color: #0000ff&quot;&gt;catch&lt;/span&gt; (UnsupportedEncodingException e) {
			&lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;null&lt;/span&gt;;
		}
    }

    &lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;final&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;char&lt;/span&gt;[] HEX_CHAR_TABLE = {
        '0', '1', '2', '3', '4', '5', '6', '7',
        '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
    };

    &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt; String byteArray2HexString(&lt;span style=&quot;color: #0000ff&quot;&gt;byte&lt;/span&gt;[] b) {
        &lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt; (b == &lt;span style=&quot;color: #0000ff&quot;&gt;null&lt;/span&gt;) {
            &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;null&lt;/span&gt;;
        }
        &lt;span style=&quot;color: #0000ff&quot;&gt;final&lt;/span&gt; StringBuilder hex = &lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; StringBuilder(2 * b.length);
        &lt;span style=&quot;color: #0000ff&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color: #0000ff&quot;&gt;final&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;byte&lt;/span&gt; by : b) {
            hex.append(HEX_CHAR_TABLE[(by &amp;amp; 0xF0) &amp;gt;&amp;gt; 4]).append(HEX_CHAR_TABLE[(by &amp;amp; 0x0F)]);
        }
        &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; hex.toString();
    }

    &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;byte&lt;/span&gt;[] hexString2ByteArray(String s) {
        &lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt; (s == &lt;span style=&quot;color: #0000ff&quot;&gt;null&lt;/span&gt;) {
            &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;null&lt;/span&gt;;
        }
        &lt;span style=&quot;color: #0000ff&quot;&gt;byte&lt;/span&gt; high, low;
        &lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt; len = s.length() / 2;
        &lt;span style=&quot;color: #0000ff&quot;&gt;byte&lt;/span&gt;[] b = &lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;byte&lt;/span&gt;[len];
        &lt;span style=&quot;color: #0000ff&quot;&gt;for&lt;/span&gt;(&lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt; i=0, k=0; i&amp;lt;len; i++, k+=2)
        {
            high = (&lt;span style=&quot;color: #0000ff&quot;&gt;byte&lt;/span&gt;) (Character.digit(s.charAt(k), 16) &amp;amp; 0x0F);
            low = (&lt;span style=&quot;color: #0000ff&quot;&gt;byte&lt;/span&gt;) (Character.digit(s.charAt(k+1), 16) &amp;amp; 0x0F);
            b[i] = (&lt;span style=&quot;color: #0000ff&quot;&gt;byte&lt;/span&gt;) ((high&amp;lt;&amp;lt;4) | low);
        }

        &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; b;
    }&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;PHP方面&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;加密解密部分及其核心函数&lt;/p&gt;
&lt;pre&gt;	static function encrypt($enc_key, $enc_iv, $data){
		$pad = str_pad($data, ceil(strlen($data)/16.0)*16, &amp;quot; &amp;quot;);

		$method = MCRYPT_RIJNDAEL_128;
		$mode = MCRYPT_MODE_CBC;
		$td = mcrypt_module_open($method, '', $mode, '');
		mcrypt_generic_init ( $td , $enc_key , $enc_iv);
		$encrypt = mcrypt_generic($td, $pad);
		mcrypt_generic_deinit($td);
		mcrypt_module_close($td);

		return bin2hex($encrypt);
	}

	static function decrypt($dec_key, $dec_iv, $data){
		$method = MCRYPT_RIJNDAEL_128;
		$mode = MCRYPT_MODE_CBC;
		$td = mcrypt_module_open($method, '', $mode, '');
		mcrypt_generic_init ( $td , $dec_key , $dec_iv);
		$decrypt = mdecrypt_generic($td, hex2bin($data));
		mcrypt_generic_deinit($td);
		mcrypt_module_close($td);

		return $decrypt;
	}

if(!function_exists('hex2bin'))
{
	/**
	 * Converts the hex representation of data to binary
	 *
	 * http://www.php.net/manual/en/function.hex2bin.php
	 *
	 * @param   string  $str        Hexadecimal representation of data
	 *
	 * @return  string              Returns the binary representation of the given data
	 */
	function hex2bin($data)
	{
		return pack(&amp;quot;H*&amp;quot; , $data);
	}
}&lt;/pre&gt;
&lt;p&gt;就是这样啦。什么？不懂怎么用？那就看看AES的文献，看看Java和PHP的文档再说吧。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/636407227/lufie/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/lufie/~8014392/636407227/6123365/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.creke.net/784.html/feed</wfw:commentRss><slash:comments>2</slash:comments><description>本来JAVA和JSP之间加密通信好好的，相同的函数，相同的处理，不会有其他大问题。不过有时候就是蛋疼啊，于是就有了PHP与JAVA间使用AES进行加密通信。  PHP的AES128位由mcrypt模块提供，称为MCRYPT_RIJNDAEL_128。  JAVA的AES默认就是128位的。  加密模式有好几种，不同的语言不同的库支持的情况不同。...&lt;img src=&quot;http://www1.feedsky.com/t1/636407227/lufie/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/lufie/~8014392/636407227/6123365/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>JAVA</category><category>RIJNDAEL</category><category>PHP</category><category>所谓技术</category><category>加密</category><category>通信</category><category>AES</category><category>128位</category><pubDate>Thu, 08 Mar 2012 21:47:22 +0800</pubDate><author>creke</author><comments>http://blog.creke.net/784.html#comments</comments><guid isPermaLink="false">http://blog.creke.net/784.html</guid><dc:creator>creke</dc:creator><fs:srclink>http://blog.creke.net/784.html</fs:srclink><fs:srcfeed>http://lufie.net/feed/</fs:srcfeed><fs:itemid>feedsky/lufie/~8014392/636407227/6123365</fs:itemid></item><item><title>Virtualbox虚拟硬盘lvm分区压缩体积</title><link>http://item.feedsky.com/~feedsky/lufie/~8014392/636407228/6123365/1/item.html</link><content:encoded>&lt;p&gt;Virtualbox虚拟硬盘的压缩要碰到“0”才会进行压缩。所以很蛋疼。&lt;/p&gt;
&lt;p&gt;在虚拟机上运行&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;su -&lt;/p&gt;
&lt;p&gt;dd if=/dev/zero of=fillfile bs=1M&lt;/p&gt;
&lt;p&gt;rm fillfile &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果不常用swap，把swap分区也压缩一下&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;swapon -s&lt;/p&gt;
&lt;p&gt;swapoff -a #卸载/dev/VolGroup00/LogVol01&lt;/p&gt;
&lt;p&gt;swapon -s&lt;/p&gt;
&lt;p&gt;mkfs.ext3 /dev/VolGroup00/LogVol01&lt;/p&gt;
&lt;p&gt;mount /dev/VolGroup00/LogVol01 /root/tmp&lt;/p&gt;
&lt;p&gt;cd /root/tmp&lt;/p&gt;
&lt;p&gt;dd if=/dev/zero of=fillfile bs=1M&lt;/p&gt;
&lt;p&gt;rm fillfile&lt;/p&gt;
&lt;p&gt;shutdown -hP now &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在主机上运行&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;VBoxManage modifyhd /path/to/your.vdi &amp;#8211;compact &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;记得启动虚拟机，把swap挂上&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;mkswap /dev/VolGroup00/LogVol01&lt;/p&gt;
&lt;p&gt;swapon -a &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;理论上应该没问题，但是我在虚拟机内看到实际使用了2.5G，压缩后的虚拟硬盘文件大小是4G，这差值是怎么回事？不晓得。&lt;/p&gt;
&lt;p&gt;所以说，还是将/、/home、SWAP三者分别放在不同的虚拟硬盘上比较好管理。还有，CentOS默认使用的lvm逻辑卷现在支持的工具太少了，维护起来相当麻烦。&lt;/p&gt;
&lt;p&gt;参考：&lt;a href=&quot;http://blog.markloiseau.com/2010/10/how-to-compact-a-virtualbox-ubuntu-guests-vdi-file/&quot; target=&quot;_blank&quot;&gt;Via1&lt;/a&gt;，&lt;a href=&quot;http://www.cnblogs.com/iroultron/archive/2011/12/24/2300585.html&quot; target=&quot;_blank&quot;&gt;Via2&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/636407228/lufie/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/lufie/~8014392/636407228/6123365/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.creke.net/783.html/feed</wfw:commentRss><slash:comments>2</slash:comments><description>Virtualbox虚拟硬盘的压缩要碰到“0”才会进行压缩。所以很蛋疼。  在虚拟机上运行     su -    dd if=/dev/zero of=fillfile bs=1M    rm fillfile    如果不常用swap，把swap分区也压缩一下     swapon -s    swapoff -a #卸载/dev/VolGroup00/LogVol01    swapon -s    mkfs.ext3 /dev/VolGroup00...&lt;img src=&quot;http://www1.feedsky.com/t1/636407228/lufie/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/lufie/~8014392/636407228/6123365/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>体积</category><category>lvm</category><category>分区</category><category>所谓技术</category><category>压缩</category><category>Virtualbox</category><category>虚拟硬盘</category><pubDate>Thu, 23 Feb 2012 00:37:11 +0800</pubDate><author>creke</author><comments>http://blog.creke.net/783.html#comments</comments><guid isPermaLink="false">http://blog.creke.net/783.html</guid><dc:creator>creke</dc:creator><fs:srclink>http://blog.creke.net/783.html</fs:srclink><fs:srcfeed>http://lufie.net/feed/</fs:srcfeed><fs:itemid>feedsky/lufie/~8014392/636407228/6123365</fs:itemid></item><item><title>在Virtualbox下自定义Android-x86的分辨率</title><link>http://item.feedsky.com/~feedsky/lufie/~8014392/636407229/6123365/1/item.html</link><content:encoded>&lt;p&gt;没写安装配置笔记，反倒先写了如何自定义Android-x86的分辨率，哈。&lt;/p&gt;
&lt;p&gt;1、在虚拟机添加自定义分辨率&lt;/p&gt;
&lt;p&gt;在虚拟机关闭以后进行。&lt;/p&gt;
&lt;p&gt;方法一：对应的虚拟机的xml文件的“&amp;lt;ExtraData&amp;gt;”下新开一行，加上以下内容&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&amp;lt;ExtraDataItem name=&amp;quot;CustomVideoMode1&amp;quot; value=&amp;quot;480&amp;#215;800x16&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;lt;ExtraDataItem name=&amp;quot;CustomVideoMode2&amp;quot; value=&amp;quot;320&amp;#215;480x16&amp;quot;/&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;方法二：执行命令，其中“VM name”替换为你自己的虚拟机的名字&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;VBoxManage setextradata &amp;quot;VM name&amp;quot; &amp;quot;CustomVideoMode1&amp;quot; &amp;quot;480&amp;#215;800x16&amp;quot;     &lt;br /&gt;VBoxManage setextradata &amp;quot;VM name&amp;quot; &amp;quot;CustomVideoMode2&amp;quot; &amp;quot;320&amp;#215;480x16&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;2、修改grub的menu.lst&lt;/p&gt;
&lt;p&gt;启动虚拟机，到debug mode下，编辑文件：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;/mnt/grub/menu.lst&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果是手机分辨率则复制MDPI的几行，平板分辨率则复制HDPI的内容。把title改为自己想要的启动项名字，如“Android-x86 480&amp;#215;800x16”，在“kernel”后加上：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;UVESA_MODE=480&amp;#215;800&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;320&amp;#215;480的分辨率也类似进行。&lt;/p&gt;
&lt;p&gt;3、在debug mode下重启Android-x86&lt;/p&gt;
&lt;p&gt;运行命令&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;/system/bin/reboot&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;即可&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/636407229/lufie/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/lufie/~8014392/636407229/6123365/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.creke.net/782.html/feed</wfw:commentRss><slash:comments>0</slash:comments><description>没写安装配置笔记，反倒先写了如何自定义Android-x86的分辨率，哈。  1、在虚拟机添加自定义分辨率  在虚拟机关闭以后进行。  方法一：对应的虚拟机的xml文件的“&amp;#60;ExtraData&amp;#62;”下新开一行，加上以下内容     &amp;#60;ExtraDataItem name=&amp;#34;CustomVideoMode1&amp;#34; value=&amp;#34;480x800x16&amp;#038;quot...&lt;img src=&quot;http://www1.feedsky.com/t1/636407229/lufie/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/lufie/~8014392/636407229/6123365/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>所谓技术</category><pubDate>Sun, 19 Feb 2012 01:42:21 +0800</pubDate><author>creke</author><comments>http://blog.creke.net/782.html#comments</comments><guid isPermaLink="false">http://blog.creke.net/782.html</guid><dc:creator>creke</dc:creator><fs:srclink>http://blog.creke.net/782.html</fs:srclink><fs:srcfeed>http://lufie.net/feed/</fs:srcfeed><fs:itemid>feedsky/lufie/~8014392/636407229/6123365</fs:itemid></item><item><title>从火车票提取完整实名信息</title><link>http://item.feedsky.com/~feedsky/lufie/~8014392/636407230/6123365/1/item.html</link><content:encoded>&lt;p&gt;这里所说的完整的实名信息，包含姓名和身份证号码。从身份证号码可以知道籍贯、出生年月、性别。当然，进入相关数据库后，可以知道的东西就更多了。&lt;/p&gt;
&lt;p&gt;网络上很多地方都在稀里哗啦地泄露着各个中国公民的真实姓名与身份证号码的配套信息，甚至包括相关照片。这个……在这里就不讨论了，就此打住。&lt;/p&gt;
&lt;p&gt;这篇文章想说的是，从火车票中提取完整实名信息是多么的容易。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1、被隐藏的4位身份证号码&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;以前的实名制火车票是不会隐藏身份证号码的，全部打印在票面上。如下图：&lt;/p&gt;
&lt;p&gt;&lt;a title=&quot;huochepiao1.jpg&quot; href=&quot;http://www.flickr.com/photos/71508457@N00/6713478757/&quot;&gt;&lt;img border=&quot;0&quot; hspace=&quot;0&quot; alt=&quot;huochepiao1.jpg&quot; src=&quot;http://farm8.staticflickr.com/7142/6713478757_34a3d61f78.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;后来，似乎觉得这样显示身份证信息不好，于是就隐去其中的4位。但是，加上了旅客的真实姓名。如下图：&lt;/p&gt;
&lt;p&gt;&lt;a title=&quot;huochepiao2.jpg&quot; href=&quot;http://www.flickr.com/photos/71508457@N00/6713484153/&quot;&gt;&lt;img border=&quot;0&quot; hspace=&quot;0&quot; alt=&quot;huochepiao2.jpg&quot; src=&quot;http://farm8.staticflickr.com/7012/6713484153_a7babb33c1.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2、恢复被隐藏的4位&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在这里，我先介绍一下身份证的格式。&lt;/p&gt;
&lt;p&gt;现在的身份证为18位，前6位为地址码，如上图中的370112是山东省历城区。后跟着8位日期码，如上图中的1981****，表明身份证的主人是1981年的某月某日出生的。其中的月和日被“*”隐去。后面的两位是顺序号编码，即00。接着以为性别码，即1。最后的一位是校验码，算法如下：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;S = Ai * Wi, i = 2, &amp;#8230; , 18      &lt;br /&gt;Y = mod(S, 11)       &lt;br /&gt;i: 表示号码字符从右至左包括校验码字符在内的位置序号       &lt;br /&gt;Ai:表示第i位置上的身份证号码字符值       &lt;br /&gt;Wi:表示第i位置上的加权因子       &lt;br /&gt;i: 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1       &lt;br /&gt;Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1 &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;可见被隐藏的4位信息，是身份证持有人的生日中的月份和日期。每年有多少天？最多366天。这下明白我的意思没？也就是说，我们只需要枚举最多366次，就可以将隐藏的信息还原，得到真实的身份证信息。而这366次枚举，还必须满足一个条件——前17位计算得到验证码必须和第18位得到的验证码匹配。&lt;/p&gt;
&lt;p&gt;到了这里，我们还需要考虑另一个问题，在这366次枚举中，匹配的概率是多少？我没有认真计算匹配的概率，但假设得到的验证码的概率为平均分布的情况下，366次尝试得到的可能结果为：366*(1/11)=33.3。&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;我们使用下面的程序进行枚举：&lt;/p&gt;
&lt;pre&gt;#include &amp;lt;iostream&amp;gt;

&lt;span style=&quot;color: #0000ff&quot;&gt;using&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;namespace&lt;/span&gt; std;

&lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt; days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
&lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt; nums[20];

&lt;span style=&quot;color: #0000ff&quot;&gt;bool&lt;/span&gt; verifyID(&lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt; nums[])
{
    &lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt; iS = 0;
    &lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt; iW[]={0, 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
    &lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt; verCode[] = {1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2};

    &lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt; i;

    &lt;span style=&quot;color: #0000ff&quot;&gt;for&lt;/span&gt;(i=1;i&amp;lt;=17;i++)
    {
        iS += nums[i]* iW[i];
    }
    &lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt; iY = iS%11;   

	&lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt;(nums[18]==verCode[iY])
	{
		&lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;true&lt;/span&gt;;
	}
	&lt;span style=&quot;color: #0000ff&quot;&gt;else&lt;/span&gt;
	{
		&lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;false&lt;/span&gt;;
	}
}

&lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; printNum(&lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt; nums[])
{
	&lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt; i;
	&lt;span style=&quot;color: #0000ff&quot;&gt;for&lt;/span&gt;(i=1;i&amp;lt;=17;i++)
	{
		printf(&amp;quot;&lt;span style=&quot;color: #8b0000&quot;&gt;%d&lt;/span&gt;&amp;quot;, nums[i]);
	}
	(nums[18]==10)?(printf(&amp;quot;&lt;span style=&quot;color: #8b0000&quot;&gt;X&lt;/span&gt;&amp;quot;)):(printf(&amp;quot;&lt;span style=&quot;color: #8b0000&quot;&gt;%d&lt;/span&gt;&amp;quot;,nums[18]));
	printf(&amp;quot;&lt;span style=&quot;color: #8b0000&quot;&gt;\n&lt;/span&gt;&amp;quot;);
}

&lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt; main()
{
	&lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt; i,j;
	&lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt; year,count;
	&lt;span style=&quot;color: #0000ff&quot;&gt;char&lt;/span&gt; buf[128],buf2[2];

	printf(&amp;quot;&lt;span style=&quot;color: #8b0000&quot;&gt;前六位地区码：&lt;/span&gt;&amp;quot;);
	scanf(&amp;quot;&lt;span style=&quot;color: #8b0000&quot;&gt;%s&lt;/span&gt;&amp;quot;,buf);

	nums[1]=buf[0]-'0';
	nums[2]=buf[1]-'0';
	nums[3]=buf[2]-'0';
	nums[4]=buf[3]-'0';
	nums[5]=buf[4]-'0';
	nums[6]=buf[5]-'0';

	printf(&amp;quot;&lt;span style=&quot;color: #8b0000&quot;&gt;年份：&amp;quot;&lt;/span&gt;&amp;quot;);
	scanf(&amp;quot;&lt;span style=&quot;color: #8b0000&quot;&gt;%s&lt;/span&gt;&amp;quot;,buf);

	nums[7]=buf[0]-'0';
	nums[8]=buf[1]-'0';
	nums[9]=buf[2]-'0';
	nums[10]=buf[3]-'0';

	year=nums[7]*1000+nums[8]*100+nums[9]*10+nums[10];
	&lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt;(year%400==0 || (year%400!=0 &amp;amp;&amp;amp; year%4==0))&lt;span style=&quot;color: #008000&quot;&gt;//闰¨¨°年¨o&lt;/span&gt;
	{
		days[2]=29;
	}
	&lt;span style=&quot;color: #0000ff&quot;&gt;else&lt;/span&gt;
	{
		days[2]=28;
	}

	printf(&amp;quot;&lt;span style=&quot;color: #8b0000&quot;&gt;最后四位：&lt;/span&gt;&amp;quot;);
	scanf(&amp;quot;&lt;span style=&quot;color: #8b0000&quot;&gt;%s&lt;/span&gt;&amp;quot;,buf);

	nums[15]=buf[0]-'0';
	nums[16]=buf[1]-'0';
	nums[17]=buf[2]-'0';
	nums[18]=(buf[3]=='x' || buf[4]=='X')?10:(buf[3]-'0');

	count=0;
	&lt;span style=&quot;color: #0000ff&quot;&gt;for&lt;/span&gt;(i=1;i&amp;lt;=12;i++)
	{
		&lt;span style=&quot;color: #0000ff&quot;&gt;for&lt;/span&gt;(j=1;j&amp;lt;=days[i];j++)
		{
			nums[11]=i/10;
			nums[12]=i%10;
			nums[13]=j/10;
			nums[14]=j%10;

			&lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt;(verifyID(nums))
			{
				printNum(nums);
				count++;
			}
		}
	}

	printf(&amp;quot;&lt;span style=&quot;color: #8b0000&quot;&gt;共%d个结果\n&lt;/span&gt;&amp;quot;, count);

	&lt;span style=&quot;color: #008000&quot;&gt;//system(&amp;quot;pause&amp;quot;);&lt;/span&gt;

	&lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; 0;
}&lt;/pre&gt;
&lt;p&gt;运行结果如下：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;前六位地区码：370112&lt;br /&gt;
    &lt;br /&gt;年份：1981&lt;/p&gt;
&lt;p&gt;最后四位：0010&lt;/p&gt;
&lt;p&gt;70112198101020010&lt;/p&gt;
&lt;p&gt;70112198101100010&lt;/p&gt;
&lt;p&gt;70112198101290010&lt;/p&gt;
&lt;p&gt;70112198102090010&lt;/p&gt;
&lt;p&gt;70112198102170010&lt;/p&gt;
&lt;p&gt;70112198102250010&lt;/p&gt;
&lt;p&gt;70112198103050010&lt;/p&gt;
&lt;p&gt;70112198103130010&lt;/p&gt;
&lt;p&gt;70112198103210010&lt;/p&gt;
&lt;p&gt;70112198104010010&lt;/p&gt;
&lt;p&gt;70112198104280010&lt;/p&gt;
&lt;p&gt;70112198105080010&lt;/p&gt;
&lt;p&gt;70112198105160010&lt;/p&gt;
&lt;p&gt;70112198105240010&lt;/p&gt;
&lt;p&gt;70112198106040010&lt;/p&gt;
&lt;p&gt;70112198106120010&lt;/p&gt;
&lt;p&gt;70112198106200010&lt;/p&gt;
&lt;p&gt;70112198107190010&lt;/p&gt;
&lt;p&gt;70112198107270010&lt;/p&gt;
&lt;p&gt;70112198108070010&lt;/p&gt;
&lt;p&gt;70112198108150010&lt;/p&gt;
&lt;p&gt;70112198108230010&lt;/p&gt;
&lt;p&gt;70112198108310010&lt;/p&gt;
&lt;p&gt;70112198109030010&lt;/p&gt;
&lt;p&gt;70112198109110010&lt;/p&gt;
&lt;p&gt;70112198110090010&lt;/p&gt;
&lt;p&gt;70112198110170010&lt;/p&gt;
&lt;p&gt;70112198110250010&lt;/p&gt;
&lt;p&gt;70112198111050010&lt;/p&gt;
&lt;p&gt;70112198111130010&lt;/p&gt;
&lt;p&gt;70112198111210010&lt;/p&gt;
&lt;p&gt;70112198112010010&lt;/p&gt;
&lt;p&gt;70112198112280010&lt;/p&gt;
&lt;p&gt;共33个结果&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;3、更方便得到身份证号码的方法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;以下面的车票为例。&lt;/p&gt;
&lt;p&gt;&lt;a title=&quot;huochepiao_3.jpg&quot; href=&quot;http://www.flickr.com/photos/71508457@N00/6714764979/&quot;&gt;&lt;img border=&quot;0&quot; hspace=&quot;0&quot; alt=&quot;huochepiao_3.jpg&quot; src=&quot;http://farm8.staticflickr.com/7142/6714764979_2dbc74bfa8_m.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;车票上的身份证号码部分的信息被PS了很多哦。&lt;/p&gt;
&lt;p&gt;但是，我们扫描一下右边的二维码，得到：&lt;/p&gt;
&lt;p&gt;480176011454143443488249648788273804579014484911756460444584907044800460033197910200023053897628805389762880538976288053897628805389762880820000&lt;/p&gt;
&lt;p&gt;是的，里面的某部分内容就是被PS被“*”掉的身份证号码。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4、批量高技术方案&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;12306，不解释。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5、总结&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;个人别凑热闹晒车票，晒前也拜托好好打个马赛克，重分打个马赛克。还有，某些垄断组织好歹加强一下安全措施。&lt;/p&gt;
&lt;p&gt;本文点到即止，仅作学习交流用途。&lt;/p&gt;
&lt;p&gt;不多说了，就这些。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/636407230/lufie/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/lufie/~8014392/636407230/6123365/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.creke.net/781.html/feed</wfw:commentRss><slash:comments>13</slash:comments><description>这里所说的完整的实名信息，包含姓名和身份证号码。从身份证号码可以知道籍贯、出生年月、性别。当然，进入相关数据库后，可以知道的东西就更多了。  网络上很多地方都在稀里哗啦地泄露着各个中国公民的真实姓名与身份证号码的配套信息，甚至包括相关照片。这个……在这里就不讨论了，就此打住。  这...&lt;img src=&quot;http://www1.feedsky.com/t1/636407230/lufie/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/lufie/~8014392/636407230/6123365/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>实名制</category><category>提取</category><category>梦溪笔记</category><category>实名</category><category>信息</category><category>火车票</category><category>完整</category><pubDate>Wed, 18 Jan 2012 00:18:46 +0800</pubDate><author>creke</author><comments>http://blog.creke.net/781.html#comments</comments><guid isPermaLink="false">http://blog.creke.net/781.html</guid><dc:creator>creke</dc:creator><fs:srclink>http://blog.creke.net/781.html</fs:srclink><fs:srcfeed>http://lufie.net/feed/</fs:srcfeed><fs:itemid>feedsky/lufie/~8014392/636407230/6123365</fs:itemid></item><item><title>CentOS安装git</title><link>http://item.feedsky.com/~feedsky/lufie/~8014392/636407231/6123365/1/item.html</link><content:encoded>&lt;p&gt;CentOS默认源是没有git的，所以希望通过yum install来安装的童鞋们，不要在错误的道路上越走越远……&lt;/p&gt;
&lt;p&gt;所以，要从源安装，对应的命令：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;yum -y install zlib-devel openssl-devel perl cpio expat-devel gettext-devel&lt;/p&gt;
&lt;p&gt;wget &lt;a href=&quot;http://git-core.googlecode.com/files/git-1.7.7.5.tar.gz&quot;&gt;http://git-core.googlecode.com/files/git-1.7.7.5.tar.gz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;./configure &amp;#8211;prefix=/usr/local/git&lt;/p&gt;
&lt;p&gt;make&lt;/p&gt;
&lt;p&gt;make install&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;然后对执行文件进行链接，当然，如果安装在/usr/local目录的话，就不用这步了。&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;ln -s /usr/local/git/bin/git /usr/local/bin/git&lt;/p&gt;
&lt;p&gt;ln -s /usr/local/git/bin/gitk /usr/local/bin/gitk&lt;/p&gt;
&lt;p&gt;ln -s /usr/local/git/bin/git-shell /usr/local/bin/git-shell&lt;/p&gt;
&lt;p&gt;ln -s /usr/local/git/bin/git-upload-pack /usr/local/bin/git-upload-pack&lt;/p&gt;
&lt;p&gt;ln -s /usr/local/git/bin/git-cvsserver /usr/local/bin/git-cvsserver&lt;/p&gt;
&lt;p&gt;ln -s /usr/local/git/bin/git-receive-pack /usr/local/bin/git-receive-pack&lt;/p&gt;
&lt;p&gt;ln -s /usr/local/git/bin/git-upload-archive /usr/local/bin/git-upload-archive&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;常见问题&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1、如果出现“git: error while loading shared libraries: libiconv.so.2: cannot open shared object file: No such file or directory”&lt;/p&gt;
&lt;p&gt;在确认已经安装iconv库的情况下，执行以下命令：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;echo &amp;quot;/usr/local/lib&amp;quot; &amp;gt; /etc/ld.so.conf.d/git.conf&lt;/p&gt;
&lt;p&gt;/sbin/ldconfig&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;2、如果在“git clone &lt;a href=&quot;https://***&amp;rdquo;时出现&amp;ldquo;error:14090086:SSL&quot;&gt;https://***”时出现“error:14090086:SSL&lt;/a&gt; routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed while accessing”&lt;/p&gt;
&lt;p&gt;在使用git前加上“GIT_SSL_NO_VERIFY=true”的环境变量，即：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;env GIT_SSL_NO_VERIFY=true git clone https://***&lt;/p&gt;
&lt;/blockquote&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/636407231/lufie/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/lufie/~8014392/636407231/6123365/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.creke.net/780.html/feed</wfw:commentRss><slash:comments>1</slash:comments><description>CentOS默认源是没有git的，所以希望通过yum install来安装的童鞋们，不要在错误的道路上越走越远……  所以，要从源安装，对应的命令：     yum -y install zlib-devel openssl-devel perl cpio expat-devel gettext-devel    wget http://git-core.googlecode.com/files/git-1.7.7.5.tar.gz    ./co...&lt;img src=&quot;http://www1.feedsky.com/t1/636407231/lufie/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/lufie/~8014392/636407231/6123365/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>Linux</category><category>安装</category><category>git</category><category>所谓技术</category><category>install</category><category>CentOS</category><pubDate>Mon, 09 Jan 2012 20:06:01 +0800</pubDate><author>creke</author><comments>http://blog.creke.net/780.html#comments</comments><guid isPermaLink="false">http://blog.creke.net/780.html</guid><dc:creator>creke</dc:creator><fs:srclink>http://blog.creke.net/780.html</fs:srclink><fs:srcfeed>http://lufie.net/feed/</fs:srcfeed><fs:itemid>feedsky/lufie/~8014392/636407231/6123365</fs:itemid></item><item><title>firefox蛋疼升级到9.0.1后提示“附加组件不兼容”解决办法</title><link>http://item.feedsky.com/~feedsky/lufie/~8014392/636407232/6123365/1/item.html</link><content:encoded>&lt;p&gt;firefox蛋疼升级到9.0.1后提示“附加组件不兼容”解决办法&lt;/p&gt;
&lt;p&gt;访问about:config-&amp;gt;我保证我会小心-&amp;gt;右击“新建”-&amp;gt;“布尔值”-&amp;gt;名称中填写“extensions.checkCompatibility.9.0”-&amp;gt;值的内容为“false”。重启firefox即可屏蔽兼容性检查，直接启用插件。 将来升级到10的话，将上面的“extensions.checkCompatibility.9.0”改为“extensions.checkCompatibility.10.0”即可。&lt;/p&gt;
&lt;p&gt;参考： &lt;a href=&quot;http://kb.mozillazine.org/Extensions.checkCompatibility&quot;&gt;http://kb.mozillazine.org/Extensions.checkCompatibility&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;需要注意的是，在“附加组件管理器”中搜索某个插件，可能会提示“找不到任何匹配的附加组件”，这是因为，即使设置了安装插件是不检查兼容性，但搜索时自动过滤了Firefox认为不兼容的插件。这时，需要移步去&lt;a href=&quot;https://addons.mozilla.org/&quot;&gt;https://addons.mozilla.org/&lt;/a&gt;搜索对应插件。&lt;/p&gt;
&lt;p&gt;在about:config怎么删除一个首选项名称：如果是自己添加的，在键上点右键→ 重置，重新启动firefox之后就没有了。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/636407232/lufie/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/lufie/~8014392/636407232/6123365/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.creke.net/778.html/feed</wfw:commentRss><slash:comments>2</slash:comments><description>firefox蛋疼升级到9.0.1后提示“附加组件不兼容”解决办法  访问about:config-&amp;#62;我保证我会小心-&amp;#62;右击“新建”-&amp;#62;“布尔值”-&amp;#62;名称中填写“extensions.checkCompatibility.9.0”-&amp;#62;值的内容为“false”。重启firefox即可屏蔽兼容性检查，直接启用插件。 将来升级到10的话，将上面的“ext...&lt;img src=&quot;http://www1.feedsky.com/t1/636407232/lufie/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/lufie/~8014392/636407232/6123365/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>不兼容</category><category>firefox</category><category>解决</category><category>升级</category><category>所谓技术</category><category>提示</category><category>办法</category><category>附加组件</category><category>兼容</category><pubDate>Sat, 24 Dec 2011 15:59:27 +0800</pubDate><author>creke</author><comments>http://blog.creke.net/778.html#comments</comments><guid isPermaLink="false">http://blog.creke.net/778.html</guid><dc:creator>creke</dc:creator><fs:srclink>http://blog.creke.net/778.html</fs:srclink><fs:srcfeed>http://lufie.net/feed/</fs:srcfeed><fs:itemid>feedsky/lufie/~8014392/636407232/6123365</fs:itemid></item><item><title>关于SSL证书通用名（CN）通配符的实验</title><link>http://item.feedsky.com/~feedsky/lufie/~8014392/636407233/6123365/1/item.html</link><content:encoded>&lt;p&gt;&lt;strong&gt;实验目的&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;什么是通配符SSL证书？威瑞信的解释：SSL通配符证书是在一个单一的证书中，在通用名（域名）中包含一个“*”通配符字段。这使得该证书可以保护无限数量的多个子域名（主机）。例如，一个通配符证书*. domain.com ，可用于www.domain.com ， mail.domain.com ，pay.domain.com …&lt;/p&gt;
&lt;p&gt;如果使用自己认证的CA，颁发一个通用名为*.com或者*.net的证书，能不能分别匹配所有的.com或者.net的网站？再拓展一下，如果颁发一个通用名为*的证书能不能匹配任何网站？&lt;/p&gt;
&lt;p&gt;本实验探索浏览器对SSL通配符证书的匹配情况，对以上所提出的疑问进行解答。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实验要求&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1、用自己生成，并在授权信任的的CA生成*.net和*两种证书&lt;/p&gt;
&lt;p&gt;2、配置对应的WEB网站&lt;/p&gt;
&lt;p&gt;3、在不同的浏览器中访问对应WEB网站，观察结果。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实验内容&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;对OpenSSL及WEB服务器的具体操作参考&lt;a href=&quot;http://blog.creke.net/762.html&quot; target=&quot;_blank&quot;&gt;为nginx配置https并自签名证书&lt;/a&gt;一文。&lt;/p&gt;
&lt;p&gt;1、生成相关CA，并在各个浏览器和系统中进行授权信任，步骤略。&lt;/p&gt;
&lt;p&gt;2、*.creke.net、*.net.cn、*.net和*四种SSL通配符证书。&lt;/p&gt;
&lt;p&gt;3、配置WEB服务器，使得creke.net、ssl1.creke.net、ssl1.recgo.com与sslhost1对应*.net的证书；使得ssl2.creke.net、ssl2.recgo.com与sslhost2对应*的证书；使得blog.creke.net与ssl1.blog.creke.net对应*.creke.net的证书；使得creke.net.cn对应*.net.cn的证书。注意，由于SSL不能用基于域名方式的方法来支持多个SSL，只能用多个IP或者多个端口。在这里，我们将不同的域名对应不同的端口。&lt;/p&gt;
&lt;p&gt;4、在本地host解析以上各个域名&lt;/p&gt;
&lt;p&gt;5、在IE、Firefox、Chrome、Opera、Safari五大浏览器中访问第三部配置的8个网站。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实验结果&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;除了blog.creke.net和creke.net.cn能够正常认证外，其余的8个网站均提示证书错误。所有五大浏览器结果一致。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实验结论&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1、浏览器对于通配符*只匹配域名中的某一级，即通配符*不匹配“.”。如*.creke.net匹配blog.creke.net，但不匹配ssl1.blog.creke.net。&lt;/p&gt;
&lt;p&gt;2、通配符后面的域名必须有两级或以上。如*.creke.net和*.net.cn都是可用的证书；而*.net和*都是不可用的，任何域名都无法通过认证。&lt;/p&gt;
&lt;p&gt;3、通过进一步实验得知，通配符不允许为空。如：*.creke.net是不能匹配creke.net的。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/636407233/lufie/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/lufie/~8014392/636407233/6123365/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.creke.net/777.html/feed</wfw:commentRss><slash:comments>0</slash:comments><description>实验目的  什么是通配符SSL证书？威瑞信的解释：SSL通配符证书是在一个单一的证书中，在通用名（域名）中包含一个“*”通配符字段。这使得该证书可以保护无限数量的多个子域名（主机）。例如，一个通配符证书*. domain.com ，可用于www.domain.com ， mail.domain.com ，pay.domain.com …  如果使用...&lt;img src=&quot;http://www1.feedsky.com/t1/636407233/lufie/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/lufie/~8014392/636407233/6123365/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>CN</category><category>通配符</category><category>通用名</category><category>梦溪笔记</category><category>证书</category><category>关于</category><category>SSL</category><category>实验</category><pubDate>Wed, 21 Dec 2011 16:49:45 +0800</pubDate><author>creke</author><comments>http://blog.creke.net/777.html#comments</comments><guid isPermaLink="false">http://blog.creke.net/777.html</guid><dc:creator>creke</dc:creator><fs:srclink>http://blog.creke.net/777.html</fs:srclink><fs:srcfeed>http://lufie.net/feed/</fs:srcfeed><fs:itemid>feedsky/lufie/~8014392/636407233/6123365</fs:itemid></item><item><title>CentOS下安装使用start-stop-daemon</title><link>http://item.feedsky.com/~feedsky/lufie/~8014392/636407234/6123365/1/item.html</link><content:encoded>&lt;p&gt;CentOS是没有start-stop-daemon的，因为start-stop-daemon在debian的dpkg包里。要安装的话，需要自己折腾。&lt;/p&gt;
&lt;p&gt;相关命令如下：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;wget &lt;a href=&quot;http://developer.axis.com/download/distribution/apps-sys-utils-start-stop-daemon-IR1_9_18-2.tar.gz&quot;&gt;http://developer.axis.com/download/distribution/apps-sys-utils-start-stop-daemon-IR1_9_18-2.tar.gz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;tar zxf apps-sys-utils-start-stop-daemon-IR1_9_18-2.tar.gz&lt;/p&gt;
&lt;p&gt;mv apps/sys-utils/start-stop-daemon-IR1_9_18-2/ ./&lt;/p&gt;
&lt;p&gt;rm -rf apps&lt;/p&gt;
&lt;p&gt;cd start-stop-daemon-IR1_9_18-2/&lt;/p&gt;
&lt;p&gt;cc start-stop-daemon.c -o start-stop-daemon&lt;/p&gt;
&lt;p&gt;cp start-stop-daemon /usr/local/bin/start-stop-daemon&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;至此安装完成。可以看到：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;[root@localhost ~]# start-stop-daemon &amp;#8211;help     &lt;br /&gt;start-stop-daemon 1.9.18 for Debian &amp;#8211; small and fast C version written by      &lt;br /&gt;Marek Michalkiewicz &amp;lt;marekm@i17linuxb.ists.pwr.wroc.pl&amp;gt;, public domain. &lt;/p&gt;
&lt;p&gt;Usage:     &lt;br /&gt;&amp;#160; start-stop-daemon -S|&amp;#8211;start options &amp;#8230; &amp;#8212; arguments &amp;#8230;      &lt;br /&gt;&amp;#160; start-stop-daemon -K|&amp;#8211;stop options &amp;#8230;      &lt;br /&gt;&amp;#160; start-stop-daemon -H|&amp;#8211;help      &lt;br /&gt;&amp;#160; start-stop-daemon -V|&amp;#8211;version &lt;/p&gt;
&lt;p&gt;Options (at least one of &amp;#8211;exec|&amp;#8211;pidfile|&amp;#8211;user is required):     &lt;br /&gt;&amp;#160; -x|&amp;#8211;exec &amp;lt;executable&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; program to start/check if it is running      &lt;br /&gt;&amp;#160; -p|&amp;#8211;pidfile &amp;lt;pid-file&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pid file to check      &lt;br /&gt;&amp;#160; -c|&amp;#8211;chuid &amp;lt;name|uid[:group|gid]&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; change to this user/group before starting process      &lt;br /&gt;&amp;#160; -u|&amp;#8211;user &amp;lt;username&amp;gt;|&amp;lt;uid&amp;gt;&amp;#160;&amp;#160;&amp;#160; stop processes owned by this user      &lt;br /&gt;&amp;#160; -n|&amp;#8211;name &amp;lt;process-name&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; stop processes with this name      &lt;br /&gt;&amp;#160; -s|&amp;#8211;signal &amp;lt;signal&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; signal to send (default TERM)      &lt;br /&gt;&amp;#160; -a|&amp;#8211;startas &amp;lt;pathname&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; program to start (default is &amp;lt;executable&amp;gt;)      &lt;br /&gt;&amp;#160; -N|&amp;#8211;nicelevel &amp;lt;incr&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; add incr to the process&amp;#8217;s nice level      &lt;br /&gt;&amp;#160; -b|&amp;#8211;background&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; force the process to detach      &lt;br /&gt;&amp;#160; -m|&amp;#8211;make-pidfile&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; create the pidfile before starting      &lt;br /&gt;&amp;#160; -R|&amp;#8211;retry &amp;lt;schedule&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; check whether processes die, and retry      &lt;br /&gt;&amp;#160; -t|&amp;#8211;test&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; test mode, don&amp;#8217;t do anything      &lt;br /&gt;&amp;#160; -o|&amp;#8211;oknodo&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; exit status 0 (not 1) if nothing done      &lt;br /&gt;&amp;#160; -q|&amp;#8211;quiet&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; be more quiet      &lt;br /&gt;&amp;#160; -v|&amp;#8211;verbose&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; be more verbose      &lt;br /&gt;Retry &amp;lt;schedule&amp;gt; is &amp;lt;item&amp;gt;|/&amp;lt;item&amp;gt;/&amp;#8230; where &amp;lt;item&amp;gt; is one of      &lt;br /&gt; -&amp;lt;signal-num&amp;gt;|[-]&amp;lt;signal-name&amp;gt;&amp;#160; send that signal      &lt;br /&gt; &amp;lt;timeout&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wait that many seconds      &lt;br /&gt; forever&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; repeat remainder forever      &lt;br /&gt;or &amp;lt;schedule&amp;gt; may be just &amp;lt;timeout&amp;gt;, meaning &amp;lt;signal&amp;gt;/&amp;lt;timeout&amp;gt;/KILL/&amp;lt;timeout&amp;gt; &lt;/p&gt;
&lt;p&gt;Exit status:&amp;#160; 0 = done&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1 = nothing done (=&amp;gt; 0 if &amp;#8211;oknodo)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 3 = trouble&amp;#160;&amp;#160; 2 = with &amp;#8211;retry, processes wouldn&amp;#8217;t die&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本文参考了&lt;a href=&quot;http://shriikant.blogspot.com/2011/08/start-stop-daemon-script-for-centos-5.html&quot; target=&quot;_blank&quot;&gt;此文档&lt;/a&gt;。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/636407234/lufie/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/lufie/~8014392/636407234/6123365/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.creke.net/776.html/feed</wfw:commentRss><slash:comments>2</slash:comments><description>CentOS是没有start-stop-daemon的，因为start-stop-daemon在debian的dpkg包里。要安装的话，需要自己折腾。  相关命令如下：     wget http://developer.axis.com/download/distribution/apps-sys-utils-start-stop-daemon-IR1_9_18-2.tar.gz    tar zxf apps-sys-utils-start-stop-daemon-IR1_9_18-...&lt;img src=&quot;http://www1.feedsky.com/t1/636407234/lufie/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/lufie/~8014392/636407234/6123365/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>Linux</category><category>梦溪笔记</category><category>安装</category><category>使用</category><category>CentOS</category><category>start-stop-daemon</category><pubDate>Tue, 20 Dec 2011 16:48:17 +0800</pubDate><author>creke</author><comments>http://blog.creke.net/776.html#comments</comments><guid isPermaLink="false">http://blog.creke.net/776.html</guid><dc:creator>creke</dc:creator><fs:srclink>http://blog.creke.net/776.html</fs:srclink><fs:srcfeed>http://lufie.net/feed/</fs:srcfeed><fs:itemid>feedsky/lufie/~8014392/636407234/6123365</fs:itemid></item><item><title>PHP的curl/libcurl连接https/SSL网站</title><link>http://item.feedsky.com/~feedsky/lufie/~8014392/636407235/6123365/1/item.html</link><content:encoded>&lt;p&gt;在PHP中使用libcurl连接https/SSL网站，可以用以下代码测试是否连接畅通：&lt;/p&gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;&amp;lt;?&lt;/span&gt;
$curl = &lt;a style=&quot;color: #ffa500&quot; href=&quot;http://www.php.net/curl_init&quot;&gt;curl_init&lt;/a&gt;();
&lt;a style=&quot;color: #ffa500&quot; href=&quot;http://www.php.net/curl_setopt&quot;&gt;curl_setopt&lt;/a&gt;($curl, CURLOPT_URL, '&lt;span style=&quot;color: #8b0000&quot;&gt;https://passport.baidu.com/?login&lt;/span&gt;');
&lt;a style=&quot;color: #ffa500&quot; href=&quot;http://www.php.net/curl_setopt&quot;&gt;curl_setopt&lt;/a&gt;($curl, CURLOPT_POST, &lt;a style=&quot;color: #0000ff&quot; href=&quot;http://www.php.net/false&quot;&gt;false&lt;/a&gt;);
$curl_res = &lt;a style=&quot;color: #ffa500&quot; href=&quot;http://www.php.net/curl_exec&quot;&gt;curl_exec&lt;/a&gt;($curl);
&lt;a style=&quot;color: #0000ff&quot; href=&quot;http://www.php.net/echo&quot;&gt;echo&lt;/a&gt; $curl_res;
&lt;a style=&quot;color: #0000ff&quot; href=&quot;http://www.php.net/if&quot;&gt;if&lt;/a&gt; (&lt;a style=&quot;color: #ffa500&quot; href=&quot;http://www.php.net/curl_errno&quot;&gt;curl_errno&lt;/a&gt;($curl)) {
	&lt;a style=&quot;color: #0000ff&quot; href=&quot;http://www.php.net/echo&quot;&gt;echo&lt;/a&gt; '&lt;span style=&quot;color: #8b0000&quot;&gt;Error: &lt;/span&gt;' . &lt;a style=&quot;color: #ffa500&quot; href=&quot;http://www.php.net/curl_error&quot;&gt;curl_error&lt;/a&gt;($curl);
}
&lt;a style=&quot;color: #ffa500&quot; href=&quot;http://www.php.net/curl_close&quot;&gt;curl_close&lt;/a&gt;($curl);
&lt;span style=&quot;color: #0000ff&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;如果显示正常，则证明连接畅通。&lt;/p&gt;
&lt;p&gt;如果显示“Error: couldn&amp;#8217;t connect to host”，则证明出错啦！&lt;/p&gt;
&lt;p&gt;首先，进入phpinfo页面查看libcurl，看看curl字段是否有OpenSSL支持。如果没有，那就自己折腾PHP的安装吧！&lt;/p&gt;
&lt;p&gt;然后，将libeay32.dll和ssleay32.dll拷贝到windows目录、system32目录；或者如果是命令行运行PHP，则拷贝到当前运行目录；或运行Apache运行PHP，则拷贝到当前运行Apache的目录。&lt;/p&gt;
&lt;p&gt;重启Apache或者PHP，再次执行代码查看是否正常。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/636407235/lufie/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/lufie/~8014392/636407235/6123365/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.creke.net/775.html/feed</wfw:commentRss><slash:comments>0</slash:comments><description>在PHP中使用libcurl连接https/SSL网站，可以用以下代码测试是否连接畅通：
&amp;#60;?
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://passport.baidu.com/?login');
curl_setopt($curl, CURLOPT_POST, false);
$curl_res = curl_exec($curl);
echo $curl_res;
if (curl_errno($curl)) {
	echo 'Error: ' . curl_error($curl);
}
curl_close($curl);
?&amp;#62;
如果显示正常，则证明连接畅通。
如果显示“Error: couldn&amp;#8217;t connect to host”，则证明出错啦！
首先，进入phpinfo页面查看libcurl，看看curl字段是否有OpenSSL支持。如果没有，那就自己折腾PHP的安装吧！
然后，将libeay32.dll和ssleay32.dll拷贝到windows目录、system32目录；或者如果是命令行运行PHP，则拷贝到当前运行目录；或运行Apache运行PHP，则拷贝到当前运行Apache的目录。
重启Apache或者PHP，再次执行代码查看是否正常。&lt;img src=&quot;http://www1.feedsky.com/t1/636407235/lufie/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/lufie/~8014392/636407235/6123365/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>网站</category><category>PHP</category><category>https</category><category>libcurl</category><category>所谓技术</category><category>连接</category><category>SSL</category><category>curl</category><pubDate>Fri, 09 Dec 2011 12:23:40 +0800</pubDate><author>creke</author><comments>http://blog.creke.net/775.html#comments</comments><guid isPermaLink="false">http://blog.creke.net/775.html</guid><dc:creator>creke</dc:creator><fs:srclink>http://blog.creke.net/775.html</fs:srclink><fs:srcfeed>http://lufie.net/feed/</fs:srcfeed><fs:itemid>feedsky/lufie/~8014392/636407235/6123365</fs:itemid></item></channel></rss>
