首先,我介绍一下我的情况。在近一个月前,还只是一个只懂C#的刚毕业的学生,不会C++,只懂得简单的C,OD、IDA更是从来没有接触过的软件。后来,由于某种原因,开始接触到逆向这方面,发现自己对于这方面还是很感兴趣,所以决心开始学习。我算是个比较幸运的初学者,有个大哥(以下用bbx代替)帮助我学习,按照他指导的道路走下去,减少了很多迷茫。他让我知道,学习还可以有另外一种方式。在此写下,这近一个月来的学习状况与心得,和大家分享一下。(以下学习过程均由bbx指导)
  首先把:
  http://bbs.pediy.com/showthread.php?t=73630
http://bbs.pediy.com/showthread.php?t=73634
用2天的时间看完。目的就是为了让我这种对于这一领域一点了解都没有的人,能够在遇到问题时,知道去看什么,去哪里找答案。2天的时间,对于我这个喜欢把每句每字都弄懂的人来说是根本不可能看完的,所以这就需要改变心态,看完知道有这个东西、有这个知识点就OK啦!以后在学习的时候碰到,可以找到解决的方法就行。
  在看过上面的内容的同时,把里面提到的工具都下载下来。
  以上内容看完后,由于我在网上买的C++书还没有到,所以就做些小练习吧。
  http://bbs.pediy.com/showthread.php?t=35559
  因为不会汇编,所以用了好久都没怎么看懂这些题……O(∩_∩)O~那就再去看本汇编的书吧,同样用以上方法,一天的时间,看完。
  C++书到了,一天的时间看完……O(∩_∩)O~
  由于看的是16位汇编,所以还要再用一天时间看下32位汇编……O(∩_∩)O~
  
  其实看完以上的东西,还是很迷茫,可是这时候bbx却给了我一个小小的程序,要我分析出它的,很没信心,就几天的时间,怎么可能呢……恩……不管了,尝试一下。程序名字叫CrackMe_0006,上传附件有。
  第一次分析程序,虽然说很小,但是却寸步难行,OD、IDA不怎么会用,所以首先就解决这个问题吧,记得在第一天看的(http://bbs.pediy.com/showthread.php?t=21284)一系列教程中就有教OD怎么使用的。CrackMe_0006和教程里的程序不同,所以很多难题不知道该怎么解决。这个程序中,可以用字符参考,找到关键的地方,但是下断点后,运行怎么都运行不到那里,在bbx的指导下,明白了因为DialogBoxParamA函数的运行方式,所以要在对的地方下断,才可以一步步的运行到关键的地方。而寻找下断的位置,可以从上一层找分支,如果不对,就再往上一层,直到运行后点Check有反应了为止。有反应了,可还是出现了问题,在某男的提示下,看了附近的代码,关键就在GetDlgItemTextA 后有一个条件,输入的用户名不能小于4个字符,而我只写了3个。知道为什么了那就F8一步步向下执行,到关键点,在数据窗口跟踪就可以找到弹出成功窗口对比的两个字符串了。
  这个程序还没有完,第二题就是无论是输入什么用户名和密码的情况下都要弹出成功窗口,这个,在OD中改跳转的代码就可以了。第三题,把弹出的成功窗口上内容“GOOD JOB,MAN!”改成“GOOD JOB,LADY!”
  O(∩_∩)O~用了一天的时间,终于完成了,第一个程序现在看看,真的很简单,但是收获却不小,我在这里学会使用了大部分OD和IDA的功能;学会了,在分析程序时,应该活学活用,总是有很多办法能找到你要的答案的;还有知道碰到不懂的函数,该怎么查找,怎么解决。小小的成功,却很激动诶~~~~!

  第二个程序是Project1.exe(见附件)。刚开始,依然用OD教程里的方法找下断点的位置,这次是用函数参考,利用GetWindowTextA寻找关键位置,可是没有找到,所以请教bbx后知道,下断点的话,用越底层的函数就越能找到对的位置,而这样还是不行,所以用到了堆栈窗口:
堆栈是用来传递参数的,如果函数没完成,参数会一直留在堆栈的,所以你看参数,可以知道你该去哪里,函数调用的时候,会把参数和返回地址都存放在堆栈里,所以你在堆栈窗口能看到前面调用这个函数的大概有什么参数(以上均为bbx原话)。所以Ctrl+G找到CreateWindowExA函数下断到创建错误窗口的地方,看堆栈窗口中,会有你想要找到的参数,然后返回到对应的地方,那就是目的地啦……(~ o ~)~zZ理解这一点费了很大的神哦……找到关键的地方,看下附近的代码就会明白了,这个程序也完成了。
  依然是Project1.exe。这个程序是,用不同的用户名,就需要不同的注册码,这次是找出它的算法,然后用C#写出来。(^o^我的老本行哦,该容易点了吧……)首先是找到它算的地方,然后用C#直接写出来就可以,但是期间,遇到很多不明函数,所以就要一个个的查,方法有很多种,主要一点就是利用已知的得到未知的(利用已知的参数和已知的结果,推测出未知的函数;还有就是利用已知的参数和函数推测出未知的结果。)。知道这个函数做什么的,在C#里写就容易多了。而其他计算的地方,完全可以照搬过去,将eax、ebx等寄存器设为int型的就OK了。说是这么说,可是做下来,还是用掉了好几天的时间。(见附件)
  为什么要用C#写出来呢,当然是为了能用VC++写出来啦,这点就是利用我熟悉的高级语言,可以很容易的把这个注册机写出来,然后再用VC++写~~~接下来,在用VC++写的时候,我2天内,没能写出一句话,连窗体都没有。后来知道可以用MFC直接画出窗体,和C#很像,但是里面的函数当然不一样,所以要开始一个一个查MSDN,要么就在网上搜,总之,几天下来,终于写完了……TOT……(见附件)
  经过分析算法,到写出C++的程序,这个过程再次让我熟悉了OD的使用,而每天几行C++的代码,虽然速度很慢,但是也学会了很多,比如怎么去查MSDN,怎么去理解一个函数,以及它的参数……

  近一个月过去了,收获了不少,这种学习方法,让我减少了很多要花费在看书上时间,基础还是很重要的,所以,在学习的过程中,所遇到的知识点,一定要理解,我本人记忆力很差,遇到第一次,可以查,第二次,可以再查,我想大多数人不会再查第三次的。在实践中学习,这种效果确实很好。我想我还是遇到了一个好“老师”了……所以我还是比较幸运的,希望可以把这种方法分享给和我一样,从开始一点都没接触过这一领域的朋友!还有看雪论坛里很多都是精髓,不利用简直浪费了……(*^__^*) 嘻嘻……
  因为第一次发帖,而且学习的时间不长,一些专业术语或者语句,没有讲明白的地方请大家见谅~~~!!!
  最后感谢LD,感谢Q姐,感谢看雪和看雪里的前辈,最重要的是bbx,谢谢你一直在帮助我!
  做程序的很累,请大家注意身体!O(∩_∩)O~