回首望望来时路
    不知多少程序开发人做过黑客梦, 至少我做过.印象中的黑客总是无所不能,随心所欲的入侵别人的计算机,控制别人的程序, 破解别人的密码, 使用任何程序不需要注册.呵呵,黑客就是计算机界的超人.不过可惜的是,我并没有成为一名黑客,仅仅是一名普普通通的程序员. 所以生活没有那么精彩,不过还是在这里把自己的微薄经验Share一下, 希望对一些初学者有所帮助.
    ★WinHex一出谁与争锋
    大学时代, 学的是电子信息专业,仅仅学习过C语言和汇编,没有Windows编程的任何概念,学校网络也只能在教育网里游荡. 2000年那个时候市面上关于逆向的书还真是不多,也没银子买. 虽然资源比较匮乏,不过还是能在网上找到一些破解的资料.那时候最常见的资料就是用WinHex来找注册码.不过惭愧的恨, 当时把一些小软件的内存,从开头搜到一个一个看到结尾,也没找到像注册码的字符串. 当时感觉,在别人哪里那么容易的事咋到我这里就这么难的.真是闹不明白.很是失望了一段时间.积极性也很受打击,没有一撅不振也差不多了.直到后来买了<<加密与解密2>>才明白其中的道理,那已经是毕业后的事了.不过前几天倒发现一个软件是用明码比较的.应该可以用这种方法把,不过我没有试.
    ★重拾旧梦
    毕业后有一次在程序员杂志上看到<<加密与解密>>的专题.曾经冰冻的心有开始荡漾起来.这个时候我已经在一家公司里做起了Delphi程序员,也开发了一些C++程序.还读了<<深入浅出MFC>>和<<Windows程序设计>>.所以买了<<加密与解密2>>,读了一下,当时最重要就是进一步了理解了ESP、EBP,和函数调用的方式. 另一个就是知道了OD这个利器。呵呵,用wasmGold版加OD,静态分析动态分析一起上,于搞定了一个小共享程序(一个卸载程序的小工具)。不过可惜现在对于我这个开山之作,已经没啥印象了。
    ★初窥门径
    在有了开山之作以后,随着工作的繁忙,同时也由于没有自己的电脑<大学毕业5年后我才买了现在的笔记本>,激情又归于平淡。后来买了台魅族M6,可以看电影。这时用到一个视频转换软件需要注册,就有了自己试着写个注册机的想法。不过后来一直没有能成功实施。直到去年辞职后,有半年没找到工作。为了找工作方便,买了台笔记本。就把这件事又提上了日程。花了5天功夫,彻底搞明白了该软件的注册算法。就把这次过程总结了下发表在看雪上。在这期间因为使用APISpy这个工具,这个也需要注册,呵呵,也顺便了解了一下。此时兴趣高昂,平时经常用ReadBook看小说,考虑是不是用自己的技术来让自己用起来心安一点(咋说也是有劳动付出了^_^)。
    ★登堂入室
    这个是我以后努力的目标^_^.
    
    ★感悟一丝
    ●首先确定明确的方向
      哲学上有句话:“如果你没有目标,那么最后你走到哪里都无所谓”。前几天,我旁边一位同事在学习汇编,有一天问我能不能教他汇编。我问他,你想学那一部分呢。他说上大学时汇编编译原理没学好,现在觉得很有用,想在学学。我不想打击他的积极性,但是也不希望他走弯路。我就问他一个问题:”你学这个打算用来干什么?“。他答不上来。其实我们很多人都会如此,错把原则性方向(这里我没想好用什么词来表述这种情况)当做目标。对学习我还是倾向后面的”功利性“的概念。首先至少要明白你学习的东西,知道它能做什么。这样才能事半功倍。我不是学计算机的,没有学过《离散数学》、《操作系统》、《编译原理》、《数据库原理》。很多时候也没遇到过困难。当看到《编程高手箴言》里面的basic解释器的时候,我不知道这能用来干什么,当我第一次看到《C++编程艺术》中开发mini C++解释器时,我仍然不知道这有啥用处,能给我什么帮助。当我想了解一下java虚拟机代码时,我突然明白了,这其实就是传说中编译原理要解决的东西么。然后再看看mini C++解释器,很多东西就清楚了(当然并不系统)。
     当然对于新手,可能不知道有啥方向,那么我自己总结了一句话,希望对大家有帮助。
     如果你没有目标,那么你就不停努力,因为目标在中途等你。
    ●工欲善其事,必先利其器
     工具不能替你做事,不能帮你思考。但是它能替你执行,大大节约你的时间。所以一定要仔细了解你手上常用的工具。其次越是强大的工具,对自己的帮助越大。如果不了解自己的工具,很多时候你就不能发挥他的最大作用。在我不会给OD中函数设置标签的时候,我曾经反复的分析同一段函数,做了很多无用功。当我试用过IDA后我发现,原来很多在OD中不能识别的crt函数,IDA都能轻易的识别出来,对照分析可以节约很多时间。Hex_ray能帮助我们识别出除法运算(用乘法模拟的除法)。不过就想尽信书不如无书一样,也不要完全的相信工具。我们使用的工具也是别人写的,受限于他们的经验和能力,也会有他们没考虑到的情况,也会有bug存在。同时,开发者为了保护自己的知识产权,也产生了很多对抗工具的奇思妙想。我用到的Hex_ray在识别的代码中认为&、|、^、~操作运算符满足交换律,也遇到过整数除法识别(汇编代码稍微有点变形)不了的情况。
    不要忘了书也是一种工具。
    ●一叶而知秋
    这里谈谈学和识的问题。学指获取知识,识指利用知识。所以识表示利用知识的创造性,是举一反三年,是一种的生产力。只有在正确的使用时知识才是力量。论语中说”学而不思则罔“,也是这个道理。例如,栈溢出漏洞的原理就是学,你能利用它完成攻击,那在完成攻击的时刻才表现出识。当然你能在代码中比别避免这种错误,表现出的也是识。在<<编写安全的代码>>中,作者提到面试的很多开发者对各种加密算法都了如指掌,但是他们中大多数都不知道怎么用之来正确的保护用户的秘密。知识是无穷的,我们一生也不可能学完,所以我们要再不断学习的基础上来充分发展我们的识,达到一叶而知秋,成为有识之士。
    ●不积小流,无以成江河
     知识是一种积累的过程,就像罗马不是一天建成的一样。所以没事的时候多读书,多学习。书到用处方很少,知识总是在你不经意的时候帮助你。其实经典的书并不多,所以完全是可以读的过来的,不要担心读不懂,更不要担心用不着。隔一段时间读读,总会有不同的收获。<<window核心编程>>这本书我读过好多次,每次都有些收获,从SEH到线程池再到Job,有些东西一时用不到,但是你以后用到时知道哪里可以找得到。当然<<加密与解密>>我也读了不止一遍。
    实践是另一种知识,平时对自己学习到的知识点都实践一次,肯定是不无裨益的。首先,实践可以让你对这个知识有一种感性认识,在以后需要使用是可以更自然,更顺利。其次,实践中会碰到你没有预期的问题,解决问题的过程其实也是一种加深理解知识原理的过程。以后用到的时候,呵呵就省事了。最后实践也可以帮助你在逆向别人的代码的时候,更容易理解别人的代码。在现实世界里,同样的知识并不总是以你熟悉的面貌出现。
    ●带功利性的学习
     这里功利性不是指金钱,而是指能激励你勇气,让你坚持前进的某些东西。可能是虚荣心,也可能是一篇精华,也可能是带看雪logo的T恤。功利要强过兴趣,有更大的催化作用。如果你实在没啥好功利的,那么就问问自己,我学习这个知识能做什么,能解决什么问题。把学习变成一个改进识的问题。
    ●勇气+毅力+阅历+一点点运气
     勇气+毅力+阅历+一点点运气是我们大多数人成功的关键。勇气很重要,负责当你面对大段打算的汇编代码时,你估计立刻就打退堂鼓了。更不要提什么VM, SMC了。真的每次当我看到长度超过1000的汇编代码的函数时,就开始皱眉。毅力是你在
遇到困难时还坚持战斗的关键,我在分析Black magic Vedio的早期,分析了几个月还原地踏步,而最后只用了5天时间就搞定了。阅历只是战胜困难的一个工具,就的靠平时积累。运气……。逆向的成功,我认为其实就是这4个因素。
    ●兵无定式,水无常形
     逆向工作其实是一种和人较力的过程,和下棋用兵是一样的。虽然可能在大方向上有定式,但是在局部则各有攻防。所以不能拘泥于形式。应充分发挥自己的创造性,活用手中的工具,静态分析,动态分析在不同的阶段都可以考虑使用。下断点时,普通断点不行的时候,可以考虑内存断点,硬件断点,条件断点,消息断点甚至脚本等。反正手段不一而足。其实也正是有了这个过程,有时候我们看别人的攻略时,会感到有些步骤来的比较突然,这很可能正是某些尝试的步骤被遗漏了。这里的关键是思考,点子、创意、灵感在这个阶段爆发,促进我们不断成长,推着我们不断进步。
    ●总结自己的每次成功,不管他多么小
     总结自己的每次成功,不管他多么小,发到论坛上,和大家分享下。在所有的财富中,只有知识给予别人之后,自己不会失去。孟子说”独乐乐不若众人同乐“,这样不仅可以让别人分享你的知识和喜悦,还能得到反馈,增强我们自己的知识。
    ●每天进步一点点
    ●与成功的人呆在一起
      这就是大家聚在看雪的动力,也是IT人员涌向硅谷的动力。
   
    ★最后寄语
      借看雪十年之际,回首自己走过的路。道路虽然曲折,但涤去铅华,仍有一丝收获,亦无憾也。
      对走过的路,我们无悔,对未来的路,我们无惧。谨以这句与大家共勉。
      最后感谢看雪陪我成长,祝看雪论坛有更好的发展。