??xml version="1.0" encoding="utf-8" standalone="yes"?>eeuss在线观看,日本在线播放一区二区三区,日韩精品不卡一区二区http://www.aygfsteel.com/Todd/category/44949.htmlzh-cnWed, 08 Feb 2012 21:14:00 GMTWed, 08 Feb 2012 21:14:00 GMT60?】freebsd 安装Q环境,资料http://www.aygfsteel.com/Todd/archive/2012/02/09/369634.htmlToddToddWed, 08 Feb 2012 17:26:00 GMThttp://www.aygfsteel.com/Todd/archive/2012/02/09/369634.htmlhttp://www.aygfsteel.com/Todd/comments/369634.htmlhttp://www.aygfsteel.com/Todd/archive/2012/02/09/369634.html#Feedback0http://www.aygfsteel.com/Todd/comments/commentRss/369634.htmlhttp://www.aygfsteel.com/Todd/services/trackbacks/369634.html1.中文使用手册 必备
http://www.freebsd.org/doc/zh_CN/books/handbook/index.html
开发手?br />http://www.freebsd.org/doc/en/books/developers-handbook/index.html
2.pȝ安装
pȝ安装包FreeBSD-8.2-RELEASE-i386-disc1.iso 地址Q?br />ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/ISO-IMAGES/8.2/
或者用网易的镜像地址下蝲Q?br />http://mirrors.163.com/FreeBSD/ISO-IMAGES-i386/8.2/
使用虚拟光驱加蝲iso文gQ在vm中加载安?br />安装步骤参见《手册》地址Q?br />http://www.freebsd.org/doc/zh_CN/books/handbook/using-sysinstall.html
我用标准安装,安装步骤很详l,若要ssh,标准安装中带ssh,查下rc.conf?pre class="SCREEN">sshd_enable="YES"
gcc也是自带装好的,可以hello验证?br />#include <stdio.h>
int main()
{
        printf("hello,todd^^\n");
        return 0;
}
>gcc hello.c -o hello
>./hello
>hello,todd^^
Ƨ了






Todd 2012-02-09 01:26 发表评论
]]>
囑փ旋{公式 http://www.aygfsteel.com/Todd/archive/2011/04/16/348387.htmlToddToddFri, 15 Apr 2011 17:10:00 GMThttp://www.aygfsteel.com/Todd/archive/2011/04/16/348387.htmlhttp://www.aygfsteel.com/Todd/comments/348387.htmlhttp://www.aygfsteel.com/Todd/archive/2011/04/16/348387.html#Feedback0http://www.aygfsteel.com/Todd/comments/commentRss/348387.htmlhttp://www.aygfsteel.com/Todd/services/trackbacks/348387.html   假设囑փ的左上角为(left, top),右下角ؓQright, bottom)Q则囑փ上Q意点Qx0, y0Q绕其中心(xcenter, ycenter)时针旋?#952;角度后,新的坐标位置Qx′, y′Q的计算公式为:

xcenter = (right Q?left Q?1) Q?2 Q?left;
ycenter = (bottom Q?top Q?1) Q?2 Q?top;
x′ = (x0 Q?xcenter) cosθ Q?(y0 Q?ycenter) sinθ Q?xcenter;
y′ = (x0 Q?xcenter) sinθ Q?(y0 Q?ycenter) cosθ Q?ycenter;


逆时?θ

Todd 2011-04-16 01:10 发表评论
]]>
vs2008 生成“cl.exe”时出错。“MessageBoxW? 不能参?2 从“char *”{换ؓ“LPCWSTR?/title><link>http://www.aygfsteel.com/Todd/archive/2011/04/14/348264.html</link><dc:creator>Todd</dc:creator><author>Todd</author><pubDate>Wed, 13 Apr 2011 18:48:00 GMT</pubDate><guid>http://www.aygfsteel.com/Todd/archive/2011/04/14/348264.html</guid><wfw:comment>http://www.aygfsteel.com/Todd/comments/348264.html</wfw:comment><comments>http://www.aygfsteel.com/Todd/archive/2011/04/14/348264.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Todd/comments/commentRss/348264.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Todd/services/trackbacks/348264.html</trackback:ping><description><![CDATA[使用vs2008 ~译Q?br /> 1Q生?#8220;cl.exe”时出错?br /> ================<br /> Microsoft Visual Studio 9.0\VC\bin下的c1.exe没有加蝲Q相关环境变量丢失导?br /> 工具->选项->目与解x?>VC++目录Q可执行文g?br /> d$(VCInstallDir)binQ?br /> 问题解决<br /> <br /> <br /> 2Q?#8220;MessageBoxW”: 不能参?2 ?#8220;char *”转换?#8220;LPCWSTR”<br /> =======================================================<br /> vs2008字符集问题,默认使用?Unicode 字符集;<br /> WinUser.h下的一D代?br /> #ifdef UNICODE<br /> #define MessageBox  MessageBoxW<br /> #else<br /> #define MessageBox  MessageBoxA<br /> #endif // !UNICODE<br /> ׃MessageBox 是调用MessageBoxW<br /> 所以直接用MessageBoxA函数Q问题解? <img src ="http://www.aygfsteel.com/Todd/aggbug/348264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Todd/" target="_blank">Todd</a> 2011-04-14 02:48 <a href="http://www.aygfsteel.com/Todd/archive/2011/04/14/348264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jni javac++ 参数传递问题解?/title><link>http://www.aygfsteel.com/Todd/archive/2010/05/23/321655.html</link><dc:creator>Todd</dc:creator><author>Todd</author><pubDate>Sun, 23 May 2010 05:18:00 GMT</pubDate><guid>http://www.aygfsteel.com/Todd/archive/2010/05/23/321655.html</guid><wfw:comment>http://www.aygfsteel.com/Todd/comments/321655.html</wfw:comment><comments>http://www.aygfsteel.com/Todd/archive/2010/05/23/321655.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Todd/comments/commentRss/321655.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Todd/services/trackbacks/321655.html</trackback:ping><description><![CDATA[一Q问? <br /> 1.多参数回? <br /> 2.参数传递出Cؕ? <br /> <br /> 二,解决 <br /> 1.使用byte[]数组传入c++,在生成的头文仉׃变成jbyteArray cd <br /> 例如Qjava 中参敎ͼbyte[]account,头文仉参数变成jbyteArray accountQ? <br /> 通过c++修改完account的值后Qjava要获取该|直接使用 <br /> jbyte* jbAccount = (env)->GetByteArrayElements(env, account, 0); <br /> char* szAccount = (char*)jbAccount; <br /> 指针的地址q不是account的地址Q最后赋下值才? <br /> env->SetByteArrayRegion(account,0,strlen(szAccount),jbyte* jbAccount); <br /> <br /> 2.String.getBytes()生成的byte数组传入c++后,在字W串的结会有多余ؕ码, <br /> 解决办法是,传入byte数组Ӟ把数l的长度lengthQ也传入c++, <br /> 令接受的数组strBuff[length]='\0';卛_解决问题 <img src ="http://www.aygfsteel.com/Todd/aggbug/321655.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Todd/" target="_blank">Todd</a> 2010-05-23 13:18 <a href="http://www.aygfsteel.com/Todd/archive/2010/05/23/321655.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>矛与盄较量Q?Q——奇妙的Base64~码http://www.aygfsteel.com/Todd/archive/2010/05/20/321432.htmlToddToddWed, 19 May 2010 17:48:00 GMThttp://www.aygfsteel.com/Todd/archive/2010/05/20/321432.htmlhttp://www.aygfsteel.com/Todd/comments/321432.htmlhttp://www.aygfsteel.com/Todd/archive/2010/05/20/321432.html#Feedback0http://www.aygfsteel.com/Todd/comments/commentRss/321432.htmlhttp://www.aygfsteel.com/Todd/services/trackbacks/321432.html阅读全文

Todd 2010-05-20 01:48 发表评论
]]>
矛与盄较量Q?Q——CRC实践?/title><link>http://www.aygfsteel.com/Todd/archive/2010/05/20/321431.html</link><dc:creator>Todd</dc:creator><author>Todd</author><pubDate>Wed, 19 May 2010 17:47:00 GMT</pubDate><guid>http://www.aygfsteel.com/Todd/archive/2010/05/20/321431.html</guid><wfw:comment>http://www.aygfsteel.com/Todd/comments/321431.html</wfw:comment><comments>http://www.aygfsteel.com/Todd/archive/2010/05/20/321431.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Todd/comments/commentRss/321431.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Todd/services/trackbacks/321431.html</trackback:ping><description><![CDATA[<a >下蝲本节例子E序</a> (13.4 KB)<br /> <strong>Q特别感谢汇~高?<font color="red">dREAMtHEATER</font> Ҏ的代码作Z相当好的优化Q请参观他的<a target="_blank">主页</a>Q?/strong><br /> <br /> 上一节里我们介绍了CRC-32的实现原理,可是原理不能当饭吃吧Q下面让我们来看看CRC是怎么应用到文件保护上?#8230;…<br /> <br /> Q由于本文涉及到的源代码比较多,so请各位读者自行下载代码进行分析)<br /> <br /> ? 《原理篇》里面,我们已经知道Q通过对一个字W串q行CRC-32转换Q最后可以得C?个字节长的CRC-32|而且无论该字W串有多长,最l生? 的CRC-32值都肯定?个字节长。这q了我们一个启C:是否能够在一个文件的某个地方储存q个CRC-32|然后在文件运行的时候,再读取这? CRC-32|q行比较Q?br /> <br /> {案是肯定的。让我们先来看看PE文g的结构:Q什么?你不懂PE文gl构Q!?#8230;…先去扄资料看看吧,到处都有的哦Q?br /> <br /> ? PE的可选映像头QIMAGE_OPTIONAL_HEADERQ里面,有一个保留字D:Win32VersionQ根据MSDN的资料,它的g般是 0Q而且它的长度?个DWORD。呵呵,你是不是已经惛_什么了呢?对了Q它的长度和我们要储存的CRC-32正好是相{的Q而且它的值是不变的,一? ?Q别问我Z么啊Q我也不知道Q。这q我们提供了一个储存CRC-32I间的可能,而实际上Q有很多Win32病毒也是利用q个 Win32Verion保留字段来储存它们的感染标志的?br /> <br /> 好了Q明了目标Q我们来看看具体应该怎么实现Q?br /> <br /> 1、先写一? W三方的E序Q我假设它叫“AddCRC32ToFile.exe”。我们可以利用这个程序,打开一个文Ӟ假设q个文g叫做 “CRC32_Test.exe”Q然?#8220;AddCRC32ToFile.exe”׃计算?#8220;CRC32_Test.exe”的CRC-32|q把q? 个CRC-32值写?#8220;CRC32_Test.exe”的Win32Version处。(其实q步要到最后才做的Q?br /> <br /> 2、写好需要进行保? 的程序,在这里我假设它叫?#8220;CRC32_Test.exe”Q记住一定要在这个程序里面加入CRC-32的校验模块。这个校验模块的工作q程是这? 的:a、先d自n文g的所有内容,储存在一个字W串中,然后把这个字W串的Win32Version处的4个字节改??Q再把字W串q行CRC- 32转换Q这时我们就得到了一?#8220;原始”文g的CRC-32|b、读取自w文件的Win32Version处的|q个值是我们通过 “AddCRC32ToFile.exe”写进ȝ。最后我们把步骤a和b中得到的两个CRC-32D行比较,如果相等的话Q说明文件没有被修改q;? 之就说明文g已经被修改了?br /> <br /> 很复杂是吧?其实好好想一惻I没啥困难的。关键是要按照以下步骤进行:<br /> <br /> 1、一定要先在 “CRC32_Test.exe”里面写好所有的模块Q然后才?#8220;AddCRC32ToFile.exe”?#8220;CRC32_Test.exe”的CRC- 32值写?#8220;CRC32_Test.exe”的Win32Version处,否则最后得到的l果肯定是不正确的。顺序一定不能搞错!Q!<br /> <br /> 2、今后一旦修改了“CRC32_Test.exe”的内容(比如重新~译了一ơ)Q就一定要再用“AddCRC32ToFile.exe”重新把CRC-32值写?#8220;CRC32_Test.exe”中去Q否则结果也是会不正的?br /> <br /> 其实Ҏ不止q一U,q有以下的几U是可行的:<br /> 1、把CRC-32的值写入一个单独的DLL文g中(或者别的什么ؕ七八p的地方Q随你的便)Q然后在q行的时候读取DLL文g中储存好的CRC-32|q行比较?br /> 2、把CRC-32的D加到.exe文g的最后,在运行的时候读取这最后的4个字节的内容Q进行比较。不q我觉得q样做不太好Q呵呵,因ؓ增加了文件的长度?br /> ……<br /> <br /> 我的Ҏ的缺点分析:<br /> CRC-32的值其实可以由Cracker自行计算得出后,重新写入到Win32Version处。这L话,我们做的工作岂不是没有意义了Q?br /> ? 实解决的Ҏq是有的Q我们可以在计算CRC-32g前,寚w要进行{换的字符串加Ҏ脚,例如对这个字W串q行UM、xor{操作,或者把自己的生? {信息加入到字符串中Q随你的便什么都行,M不是单纯的文件的内容p了,然后在最后比较的时候,也用同样的方法反计算出CRC-32倹{这样得到的 CRC-32׃是由文g的内容计出来的Q相信对Cracker的阻力也会加大不?br /> <br /> ȝQ?br /> 应用CRC原理到文件的自校验保护中Q是一U很灉|的手D,可用的方法有很多U。本文只是抛砖引玉,希望高手能给出更好的解决ҎQƈ请发信到<a href="mailto:lcother@163.net?subject=%E8%80%81%E7%BD%97%EF%BC%8C%E6%9C%89%E5%85%B3CRC-32%E7%9A%84%E9%97%AE%E9%A2%98%E6%83%B3%E8%B7%9F%E4%BD%A0%E7%A0%94%E7%A9%B6%EF%BC%81" title="共同研究Q?>lcother@163.net</a>Q我们共同研IӞ多谢Q!Q? <img src ="http://www.aygfsteel.com/Todd/aggbug/321431.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Todd/" target="_blank">Todd</a> 2010-05-20 01:47 <a href="http://www.aygfsteel.com/Todd/archive/2010/05/20/321431.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>矛与盄较量Q?Q——CRC原理?/title><link>http://www.aygfsteel.com/Todd/archive/2010/05/20/321430.html</link><dc:creator>Todd</dc:creator><author>Todd</author><pubDate>Wed, 19 May 2010 17:45:00 GMT</pubDate><guid>http://www.aygfsteel.com/Todd/archive/2010/05/20/321430.html</guid><wfw:comment>http://www.aygfsteel.com/Todd/comments/321430.html</wfw:comment><comments>http://www.aygfsteel.com/Todd/archive/2010/05/20/321430.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Todd/comments/commentRss/321430.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Todd/services/trackbacks/321430.html</trackback:ping><description><![CDATA[<a >下蝲本节例子E序</a> (4.29 KB)<br /> <strong>Q特别感谢汇~高?<font color="red">dREAMtHEATER</font> Ҏ的代码作Z相当好的优化Q请参观他的<a target="_blank">主页</a>Q?/strong><br /> <br /> 上一节我们介l了花指令,不过花指令毕竟是一U很单的东西Q基本上入了门的Cracker都可以对付得了。所以,我们很有必要l自q软g加上更好的保护。CRC校验是其中的一U不错的Ҏ?br /> <br /> CRC 是什么东西呢Q其实我们大安不应该会对它陌生Q回忆一下?你用qRAR和ZIP{压~Y件吗Q它们是不是常常会给你一个恼人的“CRC校验错误”信息 呢?我想你应该明白了吧,CRC是块数据的计算|它的全称?#8220;Cyclic Redundancy Check”Q中文名?#8220;循环冗余?#8221;Q?#8220;CRC校验”是“循环冗余校验”。(哇,真拗口,希望大家不要当我是唐僧,呵呵。^_^Q?br /> <br /> CRC 有什么用呢?它的应用范围很广泛,最常见的就是在|络传输中进行信息的校对。其实我们大可以把它应用到Y件保护中去,因ؓ它的计算是非帔R帔R怸格的? 严格C么程度呢Q你的程序只要被改动了一个字节(甚至只是大小写的改动Q,它的值就会跟原来的不同。HohoQ是不是很厉宛_Q所以只要给你的“?#8221;E? 序计好CRC|储存在某个地方,然后在程序中随机地再Ҏ件进行CRC校验Q接着跟第一ơ生成ƈ保存好的CRCD行比较,如果相等的话p明你的程 序没有被修改/破解q,如果不等的话Q那么很可能你的E序遭到了病毒的感染Q或者被Cracker?6q制工具暴力破解q了?br /> <br /> 废话说完了,我们先来看看CRC的原理?br /> Q由于CRC实现h有一定的隑ֺQ所以具体怎样用它来保护文Ӟ留待下一节再讌Ӏ)<br /> <br /> 首先看两个式子:<br /> 式一Q? / 3 = 3          Q余?= 0Q?br /> 式二Q?9 + 2 ) / 3 = 3   Q余?= 2Q?br /> <br /> 在小学里我们q道,除法q算是被减数重复地减去除数Xơ,然后留下余数?br /> 所以上面的两个式子可以用二q制计算为:Q什么?你不会二q制计算Q我倒~~~Q?br /> <br /> 式一Q?br /> 1001        --> 9<br /> 0011    -   --> 3<br /> ---------<br /> 0110        --> 6<br /> 0011    -   --> 3<br /> ---------<br /> 0011        --> 3<br /> 0011    -   --> 3<br /> ---------<br /> 0000        --> 0Q余?br /> 一共减?ơ,所以商?Q而最后一ơ减出来的结果是0Q所以余Cؓ0<br /> <br /> 式二Q?br /> 1011        --> 11<br /> 0011    -   --> 3<br /> ---------<br /> 1000        --> 8<br /> 0011    -   --> 3<br /> ---------<br /> 0101        --> 5<br /> 0011    -   --> 3<br /> ---------<br /> 0010        --> 2,余数<br /> 一共减?ơ,所以商?Q而最后一ơ减出来的结果是2Q所以余Cؓ2<br /> <br /> 看明白了吧?很好Qlet’s go on!<br /> <br /> 二进制减法运的规则是,如果遇到0-1的情况,那么要从高位?Q就变成?10+0)-1=1<br /> CRCq算有什么不同呢Q让我们看下面的例子Q?br /> <br /> q次用式?0 / 9Q不q请读者注意最后的余数Q?br /> <br /> 11110        --> 30<br /> 1001    -    --> 9<br /> ---------<br />  1100        --> 12    Q很奇怪吧Qؓ什么不?1呢?Q?br />  1001   -    --> 9<br />  --------<br />   101        --> 5Q余?--> the CRC!<br /> <br /> q个式子的计过E是不是很奇怪呢Q它不是直接减的Q而是用XOR的方式来q算Q程序员应该都很熟悉XOR吧)Q最后得C个余数?br /> <br /> 对啦Q这个就是CRC的运方法,明白了吗QCRC的本质是q行XORq算Q运的q程我们不用它Q因过E对最后的l果没有意义Q我们真正感兴趣的只是最l得到的余数Q这个余数就是CRC倹{?br /> <br /> q行一个CRCq算我们需要选择一个除敎ͼq个除数我们叫它?#8220;poly”Q宽度W是最高位的位|,所以我刚才丄例子中的除数9Q这个poly 1001的W?Q而不?Q注意最高位L1。(别问Z么,q个是规定)<br /> <br /> 如果我们惌一个位串的CRC码,我们想确定每一个位都被处理q,因此Q我们要在目标位串后面加上W?位。现在让我们ҎCRC的规范来改写一下上面的例子Q?br /> <br /> Poly                    =    1001Q宽度W = 3<br /> 位串Bitstring           =    11110<br /> Bitstring + W zeroes    =    11110 + 000 = 11110000<br /> <br /> 11110000<br /> 1001||||    -<br /> -------------<br />  1100|||<br />  1001|||    -<br />  ------------<br />   1010||<br />   1001||    -<br />   -----------<br />    0110|<br />    0000|    -<br />    ----------<br />     1100<br />     1001    -<br />     ---------<br />      101        --> 5Q余?--> the CRC!<br /> <br /> q有两点重要声明如下Q?br /> 1、只有当Bitstring的最高位?Q我们才它与polyq行XORq算Q否则我们只是将Bitstring左移一位?br /> 2、XORq算的结果就是被操作位串Bitstring与poly的低W位进行XORq算Q因为最高位Mؓ0?br /> <br /> 呵呵Q是不是有点头晕脑胀的感觉了Q看不懂的话Q再从头看一遍,其实是很好理解的。(是一个XORq算嘛!Q?br /> <br /> <br /> 好啦Q原理介l到q里Q下面我讲讲具体怎么~程?br /> <br /> ׃速度的关p,CRC的实C要是通过查表法,对于CRC-16和CRC-32Q各自有一个现成的表,大家可以直接引入到程序中使用。(׃q两个表太长Q在q里不列出来了,误者自行在|络上查找,很容易找到的。)<br /> <br /> 如果我们没有q个表怎么办呢Q或者你跟我一P懒得自己输入Q不用急,我们可以“自己动手Q丰?#8221;?br /> 你可能会_自己~程来生成这个表Q会不会太慢了?其实大可不必担心Q因为我们是在汇~代码的U别q行q算的,而这个表只有区区256个双字,Ҏ影响不了速度?br /> <br /> q个表的C语言描述如下Q?br /> <br /> <table bgcolor="#fbedbb" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td><a name="L1"><font color="#ff0000">for</font> <font color="#ff00ff">(</font>i <font color="#3080ca">=</font> <font color="#802000">0</font><font color="#9932cd"><strong>;</strong></font> i <font color="#3080ca"><</font> <font color="#802000">256</font><font color="#9932cd"><strong>;</strong></font> i<font color="#3080ca">++</font><font color="#ff00ff">)</font><br /> </a><a name="L2"><font color="#db3098">{</font><br /> </a><a name="L3">    crc <font color="#3080ca">=</font> i<font color="#9932cd"><strong>;</strong></font><br /> </a><a name="L4">    <font color="#ff0000">for</font> <font color="#ff00ff">(</font>j <font color="#3080ca">=</font> <font color="#802000">0</font><font color="#9932cd"><strong>;</strong></font> j <font color="#3080ca"><</font> <font color="#802000">8</font><font color="#9932cd"><strong>;</strong></font> j<font color="#3080ca">++</font><font color="#ff00ff">)</font><br /> </a><a name="L5">    <font color="#db3098">{</font><br /> </a><a name="L6">        <font color="#ff0000">if</font> <font color="#ff00ff">(</font>crc <font color="#3080ca">&</font> <font color="#802000">1</font><font color="#ff00ff">)</font><br /> </a><a name="L7">            crc <font color="#3080ca">=</font> <font color="#ff00ff">(</font>crc <font color="#3080ca">>></font> <font color="#802000">1</font><font color="#ff00ff">)</font> <font color="#3080ca">^</font> <font color="#802000">0xEDB88320</font><font color="#9932cd"><strong>;</strong></font><br /> </a><a name="L8">        <font color="#ff0000">else</font><br /> </a><a name="L9">            crc <font color="#3080ca">>>=</font> <font color="#802000">1</font><font color="#9932cd"><strong>;</strong></font><br /> </a><a name="L10">    <font color="#db3098">}</font><br /> </a><a name="L11">    crc32tbl<font color="#871f78">[</font>i<font color="#871f78">]</font> <font color="#3080ca">=</font> crc<font color="#9932cd"><strong>;</strong></font><br /> </a><a name="L12"><font color="#db3098">}</font></a></td> </tr> </tbody> </table> <br /> 生成表之后,可以进行运了?br /> 我们的算法如下:<br /> 1、将寄存器向双Ud一个字节?br /> 2、将刚移出的那个字节与我们的字符串中的新字节q行XORq算Q得Z个指向Dtable[0..255]的烦引?br /> 3、将索引所指的表g寄存器做XORq算?br /> 4、如果数据没有全部处理完Q则跛_步骤1?br /> <br /> q个法的C语言描述如下Q?br /> <br /> <table bgcolor="#fbedbb" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td><a name="L1">    temp <font color="#3080ca">=</font> <font color="#ff00ff">(</font>oldcrc <font color="#3080ca">^</font> abyte<font color="#ff00ff">)</font> <font color="#3080ca">&</font> <font color="#802000">0x000000FF</font><font color="#9932cd"><strong>;</strong></font><br /> </a><a name="L2">    crc  <font color="#3080ca">=</font> <font color="#ff00ff">(</font><font color="#ff00ff">(</font> oldcrc <font color="#3080ca">>></font> <font color="#802000">8</font><font color="#ff00ff">)</font> <font color="#3080ca">&</font> <font color="#802000">0x00FFFFFF</font><font color="#ff00ff">)</font> <font color="#3080ca">^</font> crc32tbl<font color="#871f78">[</font>temp<font color="#871f78">]</font><font color="#9932cd"><strong>;</strong></font><br /> </a><a name="L3">    <font color="#ff0000">return</font> crc<font color="#9932cd"><strong>;</strong></font></a></td> </tr> </tbody> </table> <br /> 好啦Q所有的东东都说完啦Q最后献上一个完整的Win32Asm例子Q请读者仔l研I吧Q?br /> Q汇~方面的CRC-32资料极少啊,我个Z面给出的是很宝贵的资料。)<br /> <br /> <br /> <table bgcolor="#fbedbb" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td><a name="L1"><font color="#238e23">;****************************************************</font><br /> </a><a name="L2"><font color="#238e23">;E序名称Q演CCRC32原理</font><br /> </a><a name="L3"><font color="#238e23">;作者:|聪</font><br /> </a><a name="L4"><font color="#238e23">;日期Q?002-8-24</font><br /> </a><a name="L5"><font color="#238e23">;出处Qhttp://laoluoc.yeah.netQ老罗的缤U天圎ͼ</font><br /> </a><a name="L6"><font color="#238e23">;注意事项Q如Ʋ{载,请保持本E序的完_q注明:转蝲?#8220;老罗的缤U天?#8221;Qhttp://laoluoc.yeah.netQ?/font><br /> </a><a name="L7"><font color="#238e23">;</font><br /> </a><a name="L8"><font color="#238e23">;特别感谢Win32ASM高手—?dREAMtHEATER 为我的代码作了相当好的优化!</font><br /> </a><a name="L9"><font color="#238e23">;请各位前?http://NoteXPad.yeah.net 下蝲他的y?#8220;cool C?#8221;—?NoteXPad 来试用!Q?00% Win32ASM ~写Q?/font><br /> </a><a name="L10"><font color="#238e23">;</font><br /> </a><a name="L11"><font color="#238e23">;****************************************************</font><br /> </a><a name="L12"><br /> </a><a name="L13"><font color="#9932cd"><strong>.</strong></font><font color="#802000">386</font><br /> </a><a name="L14"><font color="#9932cd"><strong>.</strong></font><font color="#ff0000">model</font> <font color="#ff0000">flat</font><font color="#9932cd"><strong>,</strong></font> <font color="#ff0000">stdcall</font><br /> </a><a name="L15"><font color="#ff0000">option</font> <font color="#ff0000">casemap</font><font color="#3080ca">:</font>none<br /> </a><a name="L16"><br /> </a><a name="L17"><font color="#ff8000">include</font> windows.inc<br /> </a><a name="L18"><font color="#ff8000">include</font> kernel32.inc<br /> </a><a name="L19"><font color="#ff8000">include</font> user32.inc<br /> </a><a name="L20"><font color="#ff8000">includelib</font> kernel32.lib<br /> </a><a name="L21"><font color="#ff8000">includelib</font> user32.lib<br /> </a><a name="L22"><br /> </a><a name="L23">WndProc            <font color="#ff0000">proto</font> <font color="#3080ca">:</font><font color="#ff0000">DWORD</font><font color="#9932cd"><strong>,</strong></font> <font color="#3080ca">:</font><font color="#ff0000">DWORD</font><font color="#9932cd"><strong>,</strong></font> <font color="#3080ca">:</font><font color="#ff0000">DWORD</font><font color="#9932cd"><strong>,</strong></font> <font color="#3080ca">:</font><font color="#ff0000">DWORD</font><br /> </a><a name="L24">init_crc32table    <font color="#ff0000">proto</font><br /> </a><a name="L25">arraycrc32         <font color="#ff0000">proto</font><br /> </a><a name="L26"><br /> </a><a name="L27"><font color="#9932cd"><strong>.</strong></font><font color="#ff0000">const</font><br /> </a><a name="L28">IDC_BUTTON_OPEN        <font color="#ff0000">equ</font>    <font color="#802000">3000</font><br /> </a><a name="L29">IDC_EDIT_INPUT         <font color="#ff0000">equ</font>    <font color="#802000">3001</font><br /> </a><a name="L30"><br /> </a><a name="L31"><font color="#9932cd"><strong>.</strong></font><font color="#ff0000">data</font><br /> </a><a name="L32">szDlgName         <font color="#ff0000">db</font>    <font color="#0000ff">"lc_dialog"</font><font color="#9932cd"><strong>,</strong></font> <font color="#802000">0</font><br /> </a><a name="L33">szTitle           <font color="#ff0000">db</font>    <font color="#0000ff">"CRC demo by LC"</font><font color="#9932cd"><strong>,</strong></font> <font color="#802000">0</font><br /> </a><a name="L34">szTemplate        <font color="#ff0000">db</font>    <font color="#0000ff">"字符?""%s"" ?CRC32 值是Q?X"</font><font color="#9932cd"><strong>,</strong></font> <font color="#802000">0</font><br /> </a><a name="L35">crc32tbl          <font color="#ff0000">dd</font>    <font color="#802000">256</font> <font color="#ff0000">dup</font><font color="#ff00ff">(</font><font color="#802000">0</font><font color="#ff00ff">)</font>    <font color="#238e23">;CRC-32 table</font><br /> </a><a name="L36">szBuffer          <font color="#ff0000">db</font>    <font color="#802000">255</font> <font color="#ff0000">dup</font><font color="#ff00ff">(</font><font color="#802000">0</font><font color="#ff00ff">)</font><br /> </a><a name="L37"><br /> </a><a name="L38"><font color="#9932cd"><strong>.</strong></font><font color="#ff0000">data</font><font color="#3080ca">?</font><br /> </a><a name="L39">szText            <font color="#ff0000">db</font>    <font color="#802000">300</font> <font color="#ff0000">dup</font><font color="#ff00ff">(</font><font color="#3080ca">?</font><font color="#ff00ff">)</font><br /> </a><a name="L40"><br /> </a><a name="L41"><font color="#9932cd"><strong>.</strong></font><font color="#ff0000">code</font><br /> </a><a name="L42">main<font color="#3080ca">:</font><br /> </a><a name="L43">    <font color="#ff0000">invoke</font> GetModuleHandle<font color="#9932cd"><strong>,</strong></font> NULL<br /> </a><a name="L44">    <font color="#ff0000">invoke</font> DialogBoxParam<font color="#9932cd"><strong>,</strong></font> <font color="#ff0000">eax</font><font color="#9932cd"><strong>,</strong></font> <font color="#ff0000">offset</font> szDlgName<font color="#9932cd"><strong>,</strong></font> <font color="#802000">0</font><font color="#9932cd"><strong>,</strong></font> WndProc<font color="#9932cd"><strong>,</strong></font> <font color="#802000">0</font><br /> </a><a name="L45">    <font color="#ff0000">invoke</font> ExitProcess<font color="#9932cd"><strong>,</strong></font> <font color="#ff0000">eax</font><br /> </a><a name="L46"><br /> </a><a name="L47">WndProc <font color="#ff0000">proc</font> <font color="#ff0000">uses</font> <font color="#ff0000">ebx</font> hWnd<font color="#3080ca">:</font>HWND<font color="#9932cd"><strong>,</strong></font> uMsg<font color="#3080ca">:</font>UINT<font color="#9932cd"><strong>,</strong></font> wParam<font color="#3080ca">:</font>WPARAM<font color="#9932cd"><strong>,</strong></font> lParam<font color="#3080ca">:</font>LPARAM<br /> </a><a name="L48"><br /> </a><a name="L49">    <font color="#9932cd"><strong>.</strong></font><font color="#ff0000">if</font> uMsg <font color="#3080ca">=</font><font color="#3080ca">=</font> WM_CLOSE<br /> </a><a name="L50">        <font color="#ff0000">invoke</font> EndDialog<font color="#9932cd"><strong>,</strong></font> hWnd<font color="#9932cd"><strong>,</strong></font> <font color="#802000">0</font><br /> </a><a name="L51">        <br /> </a><a name="L52">    <font color="#9932cd"><strong>.</strong></font><font color="#ff0000">elseif</font> uMsg <font color="#3080ca">=</font><font color="#3080ca">=</font> WM_COMMAND<br /> </a><a name="L53">        <font color="#ff0000">mov</font> <font color="#ff0000">eax</font><font color="#9932cd"><strong>,</strong></font>wParam<br /> </a><a name="L54">        <font color="#ff0000">mov</font> <font color="#ff0000">edx</font><font color="#9932cd"><strong>,</strong></font><font color="#ff0000">eax</font><br /> </a><a name="L55">        <font color="#ff0000">shr</font> <font color="#ff0000">edx</font><font color="#9932cd"><strong>,</strong></font><font color="#802000">16</font><br /> </a><a name="L56">        <font color="#ff0000">movzx</font> <font color="#ff0000">eax</font><font color="#9932cd"><strong>,</strong></font> <font color="#ff0000">ax</font><br /> </a><a name="L57">        <font color="#9932cd"><strong>.</strong></font><font color="#ff0000">if</font> <font color="#ff0000">edx</font> <font color="#3080ca">=</font><font color="#3080ca">=</font> BN_CLICKED<br /> </a><a name="L58">            <font color="#9932cd"><strong>.</strong></font><font color="#ff0000">IF</font> <font color="#ff0000">eax</font> <font color="#3080ca">=</font><font color="#3080ca">=</font> IDCANCEL<br /> </a><a name="L59">                <font color="#ff0000">invoke</font> EndDialog<font color="#9932cd"><strong>,</strong></font> hWnd<font color="#9932cd"><strong>,</strong></font> NULL<br /> </a><a name="L60">            <font color="#9932cd"><strong>.</strong></font><font color="#ff0000">ELSEIF</font> <font color="#ff0000">eax</font> <font color="#3080ca">=</font><font color="#3080ca">=</font> IDC_BUTTON_OPEN <font color="#3080ca">|</font><font color="#3080ca">|</font> <font color="#ff0000">eax</font> <font color="#3080ca">=</font><font color="#3080ca">=</font> IDOK        <br /> </a><a name="L61">                <font color="#238e23">;******************************************</font><br /> </a><a name="L62">                <font color="#238e23">;关键代码开始:Q当当当?#8230;…Q?/font><br /> </a><a name="L63">                <font color="#238e23">;******************************************</font><br /> </a><a name="L64">                <font color="#238e23">;取得用户输入的字W串Q?/font><br /> </a><a name="L65">                <font color="#ff0000">invoke</font> GetDlgItemText<font color="#9932cd"><strong>,</strong></font> hWnd<font color="#9932cd"><strong>,</strong></font> IDC_EDIT_INPUT<font color="#9932cd"><strong>,</strong></font> <font color="#ff0000">addr</font> szBuffer<font color="#9932cd"><strong>,</strong></font> <font color="#802000">255</font><br /> </a><a name="L66"><br /> </a><a name="L67">                <font color="#238e23">;初始化crc32tableQ?/font><br /> </a><a name="L68">                <font color="#ff0000">invoke</font> init_crc32table<br /> </a><a name="L69"><br /> </a><a name="L70">                <font color="#238e23">;下面赋值给寄存器ebxQ以便进行crc32转换Q?/font><br /> </a><a name="L71">                <font color="#238e23">;EBX是待转换的字W串的首地址Q?/font><br /> </a><a name="L72">                <font color="#ff0000">lea</font> <font color="#ff0000">ebx</font><font color="#9932cd"><strong>,</strong></font> szBuffer<br /> </a><a name="L73"><br /> </a><a name="L74">                <font color="#238e23">;q行crc32转换Q?/font><br /> </a><a name="L75">                <font color="#ff0000">invoke</font> arraycrc32<br /> </a><a name="L76"><br /> </a><a name="L77">                <font color="#238e23">;格式化输出:</font><br /> </a><a name="L78">                <font color="#ff0000">invoke</font> wsprintf<font color="#9932cd"><strong>,</strong></font> <font color="#ff0000">addr</font> szText<font color="#9932cd"><strong>,</strong></font> <font color="#ff0000">addr</font> szTemplate<font color="#9932cd"><strong>,</strong></font> <font color="#ff0000">addr</font> szBuffer<font color="#9932cd"><strong>,</strong></font> <font color="#ff0000">eax</font><br /> </a><a name="L79"><br /> </a><a name="L80">                <font color="#238e23">;好啦Q让我们昄l果Q?/font><br /> </a><a name="L81">                <font color="#ff0000">invoke</font> MessageBox<font color="#9932cd"><strong>,</strong></font> hWnd<font color="#9932cd"><strong>,</strong></font> <font color="#ff0000">addr</font> szText<font color="#9932cd"><strong>,</strong></font> <font color="#ff0000">addr</font> szTitle<font color="#9932cd"><strong>,</strong></font> MB_OK<br /> </a><a name="L82">            <font color="#9932cd"><strong>.</strong></font><font color="#ff0000">ENDIF</font><br /> </a><a name="L83">        <font color="#9932cd"><strong>.</strong></font><font color="#ff0000">endif</font><br /> </a><a name="L84">    <font color="#9932cd"><strong>.</strong></font><font color="#ff0000">ELSE</font><br /> </a><a name="L85">        <font color="#ff0000">mov</font> <font color="#ff0000">eax</font><font color="#9932cd"><strong>,</strong></font>FALSE<br /> </a><a name="L86">        <font color="#ff0000">ret</font><br /> </a><a name="L87">    <font color="#9932cd"><strong>.</strong></font><font color="#ff0000">ENDIF</font><br /> </a><a name="L88">    <font color="#ff0000">mov</font> <font color="#ff0000">eax</font><font color="#9932cd"><strong>,</strong></font>TRUE<br /> </a><a name="L89">    <font color="#ff0000">ret</font><br /> </a><a name="L90">WndProc <font color="#ff0000">endp</font><br /> </a><a name="L91"><br /> </a><a name="L92"><font color="#238e23">;**********************************************************</font><br /> </a><a name="L93"><font color="#238e23">;函数功能Q生成CRC-32?/font><br /> </a><a name="L94"><font color="#238e23">;**********************************************************</font><br /> </a><a name="L95">init_crc32table    <font color="#ff0000">proc</font><br /> </a><a name="L96"><br /> </a><a name="L97">        <font color="#238e23">;如果用C语言来表C,应该如下Q?/font><br /> </a><a name="L98">        <font color="#238e23">;</font><br /> </a><a name="L99">        <font color="#238e23">;    for (i = 0; i < 256; i++)</font><br /> </a><a name="L100">        <font color="#238e23">;    {</font><br /> </a><a name="L101">        <font color="#238e23">;        crc = i;</font><br /> </a><a name="L102">        <font color="#238e23">;        for (j = 0; j < 8; j++)</font><br /> </a><a name="L103">        <font color="#238e23">;        {</font><br /> </a><a name="L104">        <font color="#238e23">;            if (crc & 1)</font><br /> </a><a name="L105">        <font color="#238e23">;                crc = (crc >> 1) ^ 0xEDB88320;</font><br /> </a><a name="L106">        <font color="#238e23">;            else</font><br /> </a><a name="L107">        <font color="#238e23">;                crc >>= 1;</font><br /> </a><a name="L108">        <font color="#238e23">;        }</font><br /> </a><a name="L109">        <font color="#238e23">;        crc32tbl[i] = crc;</font><br /> </a><a name="L110">        <font color="#238e23">;    }</font><br /> </a><a name="L111">        <font color="#238e23">;</font><br /> </a><a name="L112">        <font color="#238e23">;呵呵Q让我们把上面的语句Ҏassembly的:</font><br /> </a><a name="L113"><br /> </a><a name="L114">        <font color="#ff0000">mov</font>     <font color="#ff0000">ecx</font><font color="#9932cd"><strong>,</strong></font> <font color="#802000">256</font>        <font color="#238e23">; repeat for every DWORD in table</font><br /> </a><a name="L115">        <font color="#ff0000">mov</font>     <font color="#ff0000">edx</font><font color="#9932cd"><strong>,</strong></font> <font color="#802000">0EDB88320h</font><br /> </a><a name="L116"><font color="#802000">$BigLoop</font><font color="#3080ca">:</font><br /> </a><a name="L117">        <font color="#ff0000">lea</font>     <font color="#ff0000">eax</font><font color="#9932cd"><strong>,</strong></font> <font color="#871f78">[</font><font color="#ff0000">ecx</font><font color="#3080ca">-</font><font color="#802000">1</font><font color="#871f78">]</font><br /> </a><a name="L118">        <font color="#ff0000">push</font>    <font color="#ff0000">ecx</font><br /> </a><a name="L119">        <font color="#ff0000">mov</font>     <font color="#ff0000">ecx</font><font color="#9932cd"><strong>,</strong></font> <font color="#802000">8</font><br /> </a><a name="L120"><font color="#802000">$SmallLoop</font><font color="#3080ca">:</font><br /> </a><a name="L121">        <font color="#ff0000">shr</font>     <font color="#ff0000">eax</font><font color="#9932cd"><strong>,</strong></font> <font color="#802000">1</font><br /> </a><a name="L122">        <font color="#ff0000">jnc</font>     @F<br /> </a><a name="L123">        <font color="#ff0000">xor</font>     <font color="#ff0000">eax</font><font color="#9932cd"><strong>,</strong></font> <font color="#ff0000">edx</font><br /> </a><a name="L124">@@<font color="#3080ca">:</font><br /> </a><a name="L125">        <font color="#ff0000">dec</font>     <font color="#ff0000">ecx</font><br /> </a><a name="L126">        <font color="#ff0000">jne</font>     <font color="#802000">$SmallLoop</font><br /> </a><a name="L127">        <font color="#ff0000">pop</font>     <font color="#ff0000">ecx</font><br /> </a><a name="L128">        <font color="#ff0000">mov</font>     <font color="#871f78">[</font>crc32tbl<font color="#3080ca">+</font><font color="#ff0000">ecx</font><font color="#3080ca">*</font><font color="#802000">4</font><font color="#3080ca">-</font><font color="#802000">4</font><font color="#871f78">]</font><font color="#9932cd"><strong>,</strong></font> <font color="#ff0000">eax</font><br /> </a><a name="L129">        <font color="#ff0000">dec</font>     <font color="#ff0000">ecx</font><br /> </a><a name="L130">        <font color="#ff0000">jne</font>     <font color="#802000">$BigLoop</font><br /> </a><a name="L131"><br /> </a><a name="L132">        <font color="#ff0000">ret</font><br /> </a><a name="L133">init_crc32table      <font color="#ff0000">endp</font><br /> </a><a name="L134"><br /> </a><a name="L135"><br /> </a><a name="L136"><font color="#238e23">;**************************************************************</font><br /> </a><a name="L137"><font color="#238e23">;函数功能Q计CRC-32</font><br /> </a><a name="L138"><font color="#238e23">;**************************************************************</font><br /> </a><a name="L139">arraycrc32    <font color="#ff0000">proc</font><br /> </a><a name="L140"><br /> </a><a name="L141">        <font color="#238e23">;计算 CRC-32 Q我采用的是把整个字W串当作一个数l,然后把这个数l的首地址赋值给 EBXQ把数组的长度赋值给 ECXQ然后@环计,q回|计算出来?CRC-32 |储存?EAX 中:</font><br /> </a><a name="L142">        <font color="#238e23">;</font><br /> </a><a name="L143">        <font color="#238e23">; 参数Q?/font><br /> </a><a name="L144">        <font color="#238e23">;       EBX = address of first byte</font><br /> </a><a name="L145">        <font color="#238e23">; q回|</font><br /> </a><a name="L146">        <font color="#238e23">;       EAX = CRC-32 of the entire array</font><br /> </a><a name="L147">        <font color="#238e23">;       EBX = ?</font><br /> </a><a name="L148">        <font color="#238e23">;       ECX = 0</font><br /> </a><a name="L149">        <font color="#238e23">;       EDX = ?</font><br /> </a><a name="L150"><br /> </a><a name="L151">        <font color="#ff0000">mov</font>     <font color="#ff0000">eax</font><font color="#9932cd"><strong>,</strong></font> <font color="#3080ca">-</font><font color="#802000">1</font> <font color="#238e23">; 先初始化eax</font><br /> </a><a name="L152">        <font color="#ff0000">or</font>      <font color="#ff0000">ebx</font><font color="#9932cd"><strong>,</strong></font> <font color="#ff0000">ebx</font><br /> </a><a name="L153">        <font color="#ff0000">jz</font>      <font color="#802000">$Done</font>   <font color="#238e23">; 避免出现I指?/font><br /> </a><a name="L154">@@<font color="#3080ca">:</font><br /> </a><a name="L155">        <font color="#ff0000">mov</font>     <font color="#ff0000">dl</font><font color="#9932cd"><strong>,</strong></font> <font color="#871f78">[</font><font color="#ff0000">ebx</font><font color="#871f78">]</font><br /> </a><a name="L156">        <font color="#ff0000">or</font>      <font color="#ff0000">dl</font><font color="#9932cd"><strong>,</strong></font> <font color="#ff0000">dl</font><br /> </a><a name="L157">        <font color="#ff0000">je</font>      <font color="#802000">$Done</font>    <font color="#238e23">;判断是否对字W串扫描完毕</font><br /> </a><a name="L158">        <br /> </a><a name="L159">         <font color="#238e23">;q里我用查表法来计算 CRC-32 Q因此非常快速:</font><br /> </a><a name="L160">        <font color="#238e23">;因ؓq是assembly代码Q所以不需要给q个q程传递参敎ͼ只需要把oldcrc赋值给EAXQ以及把byte赋值给DLQ?/font><br /> </a><a name="L161">        <font color="#238e23">;</font><br /> </a><a name="L162">        <font color="#238e23">; 在C语言中的形式Q?/font><br /> </a><a name="L163">        <font color="#238e23">;</font><br /> </a><a name="L164">        <font color="#238e23">;   temp = (oldcrc ^ abyte) & 0x000000FF;</font><br /> </a><a name="L165">        <font color="#238e23">;   crc  = (( oldcrc >> 8) & 0x00FFFFFF) ^ crc32tbl[temp];</font><br /> </a><a name="L166">        <font color="#238e23">;</font><br /> </a><a name="L167">        <font color="#238e23">; 参数Q?/font><br /> </a><a name="L168">        <font color="#238e23">;       EAX = old CRC-32</font><br /> </a><a name="L169">        <font color="#238e23">;        DL = a byte</font><br /> </a><a name="L170">        <font color="#238e23">; q回|</font><br /> </a><a name="L171">        <font color="#238e23">;       EAX = new CRC-32</font><br /> </a><a name="L172">        <font color="#238e23">;       EDX = ?</font><br /> </a><a name="L173">               <br /> </a><a name="L174">        <font color="#ff0000">xor</font>     <font color="#ff0000">dl</font><font color="#9932cd"><strong>,</strong></font> <font color="#ff0000">al</font><br /> </a><a name="L175">        <font color="#ff0000">movzx</font>   <font color="#ff0000">edx</font><font color="#9932cd"><strong>,</strong></font> <font color="#ff0000">dl</font><br /> </a><a name="L176">        <font color="#ff0000">shr</font>     <font color="#ff0000">eax</font><font color="#9932cd"><strong>,</strong></font> <font color="#802000">8</font><br /> </a><a name="L177">        <font color="#ff0000">xor</font>     <font color="#ff0000">eax</font><font color="#9932cd"><strong>,</strong></font> <font color="#871f78">[</font>crc32tbl<font color="#3080ca">+</font><font color="#ff0000">edx</font><font color="#3080ca">*</font><font color="#802000">4</font><font color="#871f78">]</font><br /> </a><a name="L178">        <br /> </a><a name="L179">        <font color="#ff0000">inc</font>     <font color="#ff0000">ebx</font>        <br /> </a><a name="L180">        <font color="#ff0000">jmp</font>     @B<br /> </a><a name="L181"><br /> </a><a name="L182"><font color="#802000">$Done</font><font color="#3080ca">:</font><br /> </a><a name="L183">        <font color="#ff0000">not</font>     <font color="#ff0000">eax</font><br /> </a><a name="L184">        <font color="#ff0000">ret</font><br /> </a><a name="L185">arraycrc32      <font color="#ff0000">endp</font><br /> </a><a name="L186"><br /> </a><a name="L187"><font color="#ff0000">end</font> main<br /> </a><a name="L188"><font color="#238e23">;********************    over    ********************</font><br /> </a><a name="L189"><font color="#238e23">;by LC</font></a></td> </tr> </tbody> </table> <br /> <br /> 下面是它的资源文Ӟ<br /> <br /> <table bgcolor="#fbedbb" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td><strong><br /> #include "resource.h"<br /> <br /> #define IDC_BUTTON_OPEN    3000<br /> #define IDC_EDIT_INPUT 3001<br /> #define IDC_STATIC -1<br /> <br /> LC_DIALOG DIALOGEX 10, 10, 195, 60<br /> STYLE DS_SETFONT | DS_CENTER | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | <br />     WS_SYSMENU<br /> CAPTION "lc’s assembly framework"<br /> FONT 9, "宋体", 0, 0, 0x0<br /> BEGIN<br />     LTEXT           "误入一个字W串Q区分大写Q:",IDC_STATIC,11,7,130,10<br />     EDITTEXT        IDC_EDIT_INPUT,11,20,173,12,ES_AUTOHSCROLL<br />     DEFPUSHBUTTON   "Ca&lc",IDC_BUTTON_OPEN,71,39,52,15<br /> END</strong></td> </tr> </tbody> </table> <br /> <br /> 如果你能够完全理解本节的内容Q那么请留意我的下一Ԍ我将具体介绍如何q用CRC-32对你的文件进行保护。(呵呵Q好戏在后头……Q? <img src ="http://www.aygfsteel.com/Todd/aggbug/321430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Todd/" target="_blank">Todd</a> 2010-05-20 01:45 <a href="http://www.aygfsteel.com/Todd/archive/2010/05/20/321430.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>矛与盄较量Q?Q——花指o【{自老罗?/title><link>http://www.aygfsteel.com/Todd/archive/2010/05/20/321429.html</link><dc:creator>Todd</dc:creator><author>Todd</author><pubDate>Wed, 19 May 2010 17:44:00 GMT</pubDate><guid>http://www.aygfsteel.com/Todd/archive/2010/05/20/321429.html</guid><wfw:comment>http://www.aygfsteel.com/Todd/comments/321429.html</wfw:comment><comments>http://www.aygfsteel.com/Todd/archive/2010/05/20/321429.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Todd/comments/commentRss/321429.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Todd/services/trackbacks/321429.html</trackback:ping><description><![CDATA[<p> 有矛有盾?br /> 所以我们要讨论加密技术?br /> <br /> 我们知道Q所有的~译型语 aQ例如VC、BCB、Delphi和Win32ASM……最l都会把源代码编译成机器能识别的0?——因此也能够反过来把q些0?反编译成汇编? 码。反~译有什么用呢?试想惻I你辛辛苦苦写了一个perfect的Y件出来,正准备把它卖?00万䆾Q忽Ӟ在市面上出现了很多仿制你的东 ?#8230;…hohoQ不知道你会怎么惛_Q反正我是会Ʋ哭无泪的。还有另外一U情况,你的软g是用注册码的形式来授权的Q每份license要卖30个美刀? 呵呵Q正当你在考虑着一q后是去加利尼亚还是夏威夷度假的时候,你的软g被Crack了——也是_你一分钱都不会得?#8230;…Q啊Q我惌楼啦Q!Q?br /> <br /> 所以我们要讨论如何l自qE序加密。这ơ就先说说最单的花指令?br /> <br /> 在解释这?#8220;花指?#8221;之前Q不妨先做几个小的实验?br /> <br /> 我们先来写一个程序,命名为hua.asmQ内容如下:<br /> <br /> <table bgcolor="#cccccc" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td>;***************************************************************<br /> ;花指令实?<br /> ;作者:|聪<br /> ;日期Q?002-8-21<br /> ;***************************************************************<br /> .386<br /> .model flat, stdcall<br /> option casemap:none<br /> <br /> include "masm32"include"windows.inc<br /> include "masm32"include"kernel32.inc<br /> include "masm32"include"user32.inc<br /> includelib "masm32"lib"kernel32.lib<br /> includelib "masm32"lib"user32.lib<br /> <br /> .data<br /> szText        db    "嘿嘿Q这是一个花指oE序……", 0<br /> szCaption    db    "花指令演C?by LC 2002-8-21", 0<br /> <br /> .code<br /> main:<br />     jmp Do_It<br /> Do_It:<br />     invoke MessageBox, NULL, addr szText, addr szCaption, MB_OK<br />     invoke ExitProcess, 0<br /> end main</td> </tr> </tbody> </table> <br /> <br /> 然后用W32Dasm v10来反~译它,得到的结果如下:Q由于篇q所限,q里只列出关键部分)<br /> <br /> <br /> <table bgcolor="#cccccc" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td>+++++++++++++++++++ ASSEMBLY CODE LISTING ++++++++++++++++++<br /> //********************** Start of Code in Object .text **************<br /> Program Entry Point = 00401000 (hua.exe File Offset:00001600)<br /> <br /> <br /> <br /> //******************** Program Entry Point ********<br /> :00401000 EB00                    jmp 00401002<br /> <br /> * Referenced by a (U)nconditional or ?onditional Jump at Address:<br /> |:00401000(U)<br /> |<br /> :00401002 6A00                    push 00000000<br /> <br /> * Possible StringData Ref from Data Obj ->"花指令演C?by LC 2002-8-21"<br />                                   |<br /> :00401004 681F304000              push 0040301F<br /> <br /> * Possible StringData Ref from Data Obj ->"嘿嘿Q这是一个花指oE序……"<br />                                   |<br /> :00401009 6800304000              push 00403000<br /> :0040100E 6A00                    push 00000000<br /> <br /> * Reference To: USER32.MessageBoxA, Ord:01BBh<br />                                   |<br /> :00401010 E80D000000              Call 00401022<br /> :00401015 6A00                    push 00000000<br /> <br /> * Reference To: KERNEL32.ExitProcess, Ord:0075h<br />                                   |<br /> :00401017 E800000000              Call 0040101C<br /> </td> </tr> </tbody> </table> <br /> <br /> 哇,好夸张啊Q你可能会说。反~译出来的代码几乎是跟源代码一一对应的,q样一来?我们的程序还有什么秘密可a呢?完全可以从反~译的结果中理解E序的功能?br /> <br /> 而且我们q可以在W32Dasm?#8220;String Data References”中得刎ͼ<br /> <table bgcolor="#cccccc" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td>"嘿嘿Q这个是一个花指oE序……"<br /> "花指令演C?by LC 2002-8-21"<br /> </td> </tr> </tbody> </table> <br /> <br /> 把刚才的源程序稍做修改,来做W二个实验:<br /> <br /> <br /> <table bgcolor="#cccccc" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td>;***************************************************************<br /> ;花指令实?<br /> ;作者:|聪<br /> ;日期Q?002-8-21<br /> ;***************************************************************<br /> .386<br /> .model flat, stdcall<br /> option casemap:none<br /> <br /> include "masm32"include"windows.inc<br /> include "masm32"include"kernel32.inc<br /> include "masm32"include"user32.inc<br /> includelib "masm32"lib"kernel32.lib<br /> includelib "masm32"lib"user32.lib<br /> <br /> .data<br /> szText        db    "嘿嘿Q这是一个花指oE序……", 0<br /> szCaption    db    "花指令演C?by LC 2002-8-21", 0<br /> <br /> .code<br /> main:<br />     jz Do_It    ;注意q里和第一个实验中的源E序的区?br />     jnz Do_It    ;注意q里和第一个实验中的源E序的区?br /> Do_It:<br />     invoke MessageBox, NULL, addr szText, addr szCaption, MB_OK<br /> end main<br /> </td> </tr> </tbody> </table> <br /> <br /> 用W32Dasm反编译一下:<br /> <br /> <table bgcolor="#cccccc" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td>+++++++++++++++++++ ASSEMBLY CODE LISTING ++++++++++++++++++<br /> //********************** Start of Code in Object .text **************<br /> Program Entry Point = 00401000 (hua.exe File Offset:00001600)<br /> <br /> <br /> <br /> //******************** Program Entry Point ********<br /> :00401000 7402                    je 00401004<br /> :00401002 7500                    jne 00401004<br /> <br /> * Referenced by a (U)nconditional or ?onditional Jump at Addresses:<br /> |:00401000?, :00401002?<br /> |<br /> :00401004 6A00                    push 00000000<br /> <br /> * Possible StringData Ref from Data Obj ->"花指令演C?by LC 2002-8-21"<br />                                   |<br /> :00401006 681F304000              push 0040301F<br /> <br /> * Possible StringData Ref from Data Obj ->"嘿嘿Q这是一个花指oE序……"<br />                                   |<br /> :0040100B 6800304000              push 00403000<br /> :00401010 6A00                    push 00000000<br /> <br /> * Reference To: USER32.MessageBoxA, Ord:01BBh<br />                                   |<br /> :00401012 E801000000              Call 00401018<br /> </td> </tr> </tbody> </table> <br /> <br /> 可以看出Q这时的W32Dasm反编译出来的汇编指oq是正确的。但是W32Dasm其实已经逐渐落入我们设下?#8220;陷阱”了?br /> <br /> 下面我们来做W三个实验,把源E序ҎQ?br /> <br /> <table bgcolor="#cccccc" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td>;***************************************************************<br /> ;花指令实?<br /> ;作者:|聪<br /> ;日期Q?002-8-21<br /> ;***************************************************************<br /> .386<br /> .model flat, stdcall<br /> option casemap:none<br /> <br /> include "masm32"include"windows.inc<br /> include "masm32"include"kernel32.inc<br /> include "masm32"include"user32.inc<br /> includelib "masm32"lib"kernel32.lib<br /> includelib "masm32"lib"user32.lib<br /> <br /> .data<br /> szText        db    "嘿嘿Q这是一个花指oE序……", 0<br /> szCaption    db    "花指令演C?by LC 2002-8-21", 0<br /> <br /> .code<br /> main:<br />     jz Do_It    ;注意q里和第一个实验中的源E序的区?br />     jnz Do_It    ;注意q里和第一个实验中的源E序的区?br />     db 0E8h        ;注意q里和第二个实验中的源程序的区别<br /> Do_It:<br />     invoke MessageBox, NULL, addr szText, addr szCaption, MB_OK<br />     invoke ExitProcess, 0<br /> end main<br /> </td> </tr> </tbody> </table> <br /> <br /> 我们来看看W32Dasm中反~译出来的东西:<br /> <br /> <table bgcolor="#cccccc" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td>+++++++++++++++++++ ASSEMBLY CODE LISTING ++++++++++++++++++<br /> //********************** Start of Code in Object .text **************<br /> Program Entry Point = 00401000 (hua.exe File Offset:00001600)<br /> <br /> <br /> <br /> //******************** Program Entry Point ********<br /> :00401000 7403                    je 00401005<br /> :00401002 7501                    jne 00401005<br /> :00401004 E86A00681D              call 1DA81073<br /> :00401009 304000                  xor byte ptr [eax+00], al<br /> <br /> * Possible StringData Ref from Data Obj ->"嘿嘿Q这是一个花指oE序……"<br />                                   |<br /> :0040100C 6800304000              push 00403000<br /> :00401011 6A00                    push 00000000<br /> <br /> * Reference To: USER32.MessageBoxA, Ord:01BBh<br />                                   |<br /> :00401013 E80E000000              Call 00401026<br /> :00401018 6A00                    push 00000000<br /> <br /> * Reference To: KERNEL32.ExitProcess, Ord:0075h<br />                                   |<br /> :0040101A E801000000              Call 00401020<br /> </td> </tr> </tbody> </table> <br /> <br /> 呵呵Q很明显了,q时?00401004 ?00401009 行出错了Q而且q时查看“String Data References”Q也只剩下了Q?br /> <table bgcolor="#cccccc" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td>"嘿嘿Q这是一个花指oE序……"</td> </tr> </tbody> </table> <br /> <br /> 让我们进一步隐藏信息,做第四个实验Q?br /> <br /> <table bgcolor="#cccccc" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td>;***************************************************************<br /> ;花指令实?<br /> ;作者:|聪<br /> ;日期Q?002-8-21<br /> ;***************************************************************<br /> .386<br /> .model flat, stdcall<br /> option casemap:none<br /> <br /> include "masm32"include"windows.inc<br /> include "masm32"include"kernel32.inc<br /> include "masm32"include"user32.inc<br /> includelib "masm32"lib"kernel32.lib<br /> includelib "masm32"lib"user32.lib<br /> <br /> .data<br /> szText        db    "嘿嘿Q这是一个花指oE序……", 0<br /> szCaption    db    "花指令演C?by LC 2002-8-21", 0<br /> <br /> .code<br /> main:<br />     jz Do_It    ;注意q里和第一个实验中的源E序的区?br />     jnz Do_It    ;注意q里和第一个实验中的源E序的区?br />     db 0E8h        ;注意q里和第二个实验中的源程序的区别<br /> Do_It:<br />     lea eax, szText        ;注意q里和第三个实验中的源程序的区别<br />     lea ebx, szCaption    ;注意q里和第三个实验中的源程序的区别<br />     invoke MessageBox, NULL, eax, ebx, MB_OK    ;注意q里和第三个实验中的源程序的区别<br />     invoke ExitProcess, 0<br /> end main<br /> </td> </tr> </tbody> </table> <br /> <br /> ~译Q再用W32Dasm反编译,得到的是Q?br /> <br /> <table bgcolor="#cccccc" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td>+++++++++++++++++++ ASSEMBLY CODE LISTING ++++++++++++++++++<br /> //********************** Start of Code in Object .text **************<br /> Program Entry Point = 00401000 (hua.exe File Offset:00001600)<br /> <br /> <br /> <br /> //******************** Program Entry Point ********<br /> :00401000 7403                    je 00401005<br /> :00401002 7501                    jne 00401005<br /> :00401004 E88D050030              call 30401596<br /> :00401009 40                      inc eax<br /> :0040100A 008D1D1D3040            add byte ptr [ebp+40301D1D], cl<br /> :00401010 006A00                  add byte ptr [edx+00], ch<br /> :00401013 53                      push ebx<br /> :00401014 50                      push eax<br /> :00401015 6A00                    push 00000000<br /> <br /> * Reference To: USER32.MessageBoxA, Ord:01BBh<br />                                   |<br /> :00401017 E80E000000              Call 0040102A<br /> :0040101C 6A00                    push 00000000<br /> <br /> * Reference To: KERNEL32.ExitProcess, Ord:0075h<br />                                   |<br /> :0040101E E801000000              Call 00401024<br /> </td> </tr> </tbody> </table> <br /> <br /> 呵呵Q这ơ不但面目全非了Q而且“String Data References”按钮已经变成了灰艌Ӏ什么蛛丝马qw没有了?br /> <br /> 各位看官看到q里明白了吗Q其实花指o是Zؓ地构造一?#8220;陷阱”和一些无用的字节。例如第二个实验中的Q?br /> <br /> jz Do_It<br /> jnz Do_It<br /> <br /> 其实q个?jmp Do_It q不是一样吗Q(呵呵Q如果在大学的期末考试里这样写Q一定会被判不及?#8230;…Q?br /> <br /> 是的Q其实程序原有的功能和逻辑q是一LQ我们只不过是换了一U表现Ş式而已。然而,反编译工h没有那么的,它们往往׃把这些指令理解错Q从而错误地定了指令的起始位置?br /> <br /> 要实现这U绝对蟩转的功能Q还可以用很多的ҎQ例如:<br /> <br /> Push Do_It<br /> ret<br /> <br /> <br /> <strong>花指令是很容易理解的Q不q大家要注意适时而用Q不要滥用啊Q能起到qh破解者和隐藏信息的作用就行了Q不然将来要l护代码Ӟ我怕被qh的反而是你自己哦Q呵?#8230;…</strong> </p> <img src ="http://www.aygfsteel.com/Todd/aggbug/321429.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Todd/" target="_blank">Todd</a> 2010-05-20 01:44 <a href="http://www.aygfsteel.com/Todd/archive/2010/05/20/321429.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">˰</a>| <a href="http://" target="_blank">¡</a>| <a href="http://" target="_blank">¤</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʹ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʡ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank">ԭ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˫</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƫ</a>| <a href="http://" target="_blank">޶</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ƹ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʯʨ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ն</a>| <a href="http://" target="_blank">ຣʡ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʵ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>