================================================================
第一次在论坛里发帖,水平有限,写了篇爆的文章,希望大家能给点意见!
非常感谢!
================================================================
【软件名称】: 二笔速成
【加壳类型】:None
【注册方式】:用户名+注册码
【编译语言】:Delphi
【破解方式】: 爆破
【破解工具】:Olldbg,w32dasm,peid,hiew
【破解声明】:此文纯属学习交流,别无它意,本人菜鸟,写此文没有多大的教学意义,只是把自己破解软件的思路写写,希望能得到高手的指点,如果的确有兄弟技术比我要差点的话,更希望本文能给这些兄弟们一些帮助。
【破解过程】:
  根据,大虾们传授的经验,先用peid查查壳,一查,很好没有壳,Delphi编译,呵呵,对Delphi不熟,有点害怕!!
  然后,运行程序,发现程序一开始就要求输入用户名,然后提示本机的机器码,让你输入注册码,如果注册码输错,没任何提示,程序终止!
  看来,下断不容易!
  用w32dasm反汇编,找找线索。在串式数据参考里面发现“请输入注册码”,很好,双击来到
====================================================
004B5A36    68 BC5B4B00       push ebsc.004B5BBC    //光标停在这里
004B5A3B    8D45 EC           lea eax,dword ptr ss:[ebp-14]
004B5A3E    BA 03000000       mov edx,3
004B5A43    E8 C0EEF4FF       call ebsc.00404908
004B5A48    8B55 EC           mov edx,dword ptr ss:[ebp-14]
004B5A4B    33C9              xor ecx,ecx
004B5A4D    B8 945B4B00       mov eax,ebsc.004B5B94
004B5A52    E8 9526F8FF       call ebsc.004380EC
004B5A57    8D43 10           lea eax,dword ptr ds:[ebx+10]
004B5A5A    8B55 F0           mov edx,dword ptr ss:[ebp-10]
004B5A5D    E8 82EBF4FF       call ebsc.004045E4
004B5A62    E8 8DEEFFFF       call ebsc.004B48F4
004B5A67    8BC3              mov eax,ebx
004B5A69    E8 F2D7FFFF       call ebsc.004B3260
004B5A6E    84C0              test al,al       
004B5A70    74 2B             je short ebsc.004B5A9D //这里有可能关键跳转
004B5A72    E8 C1F5FFFF       call ebsc.004B5038
====================================================
好象是关键的地方!不管,破解心切,来到olldbg,在004B5A36下断,运行程序,弹出对话框,要求输入用户名,随便输入一个,点确定,程序停在004B5A36处,单步运行,遇到call跳过,因为要爆破,没必要进入,只要找到关键跳转,跳过call后,程序要求输入注册码,随便输入,单步运行,此时注意到随便输入的注册码被压到寄存器中,看来,爆破应该不难,往下走,到
004B5A70    74 2B             je short ebsc.004B5A9D
这里,发现跳了,呵呵,破解心切,将je改成jne,试试,f9运行程序,呵呵,果然不错,程序进入了界面。
找到了关键,就好解决问题了!
看来作者似乎很给我们这些菜鸟面子!
看看,我们是不是真的爆破了!重新运行程序,发现程序仍然要求输入用户名和注册码,呵呵,看来作者也是有预防的!
不过根据“懒程序员定律”(我自己瞎编的呵呵*^_^*),为了方便,注册码的比较应该是在一个子程序里,呵呵,根据“懒程序员定律”,一般作者如果在程序启动时也要检验注册码的话,会同样调用这个子程序,呵呵!
分析一下上面的代码,我们不难看出,
004B5A69    E8 F2D7FFFF       call ebsc.004B3260
004B5A6E    84C0              test al,al       
004B5A70    74 2B             je short ebsc.004B5A9D 
很明显,在关键跳转前调用了ebsc.004B3260
很好,破解心切,来到ebsc.004B3260下断!
运行程序,中断在004B3260处,观察堆栈,
===================================
0012FB58   004B59DE        返回到 ebsc.004B59DE 来自 ebsc.004B3260
0012FB5C   0012FB8C        指针到下一个 SEH 记录
0012FB60   004B5AD9        SE 句柄
0012FB64   0012FB84
0012FB68   0014A6F0
0012FB6C   004FDC04        ebsc.004FDC04
0012FB70   00000000
0012FB74   00000000
0012FB78   0142D854        ASCII "20021051"     //我们输入的注册码
0012FB7C   0143D0DC        ASCII "82B6DF8BC6EC5357" //机器码
===================================================================

很好,我们离胜利应该不远了!
  来到004B59DE处,下断,运行程序,程序马上停在004B59DE处,
===================================================================
004B59D7    8BC3              mov eax,ebx
004B59D9    E8 82D8FFFF       call ebsc.004B3260  //这里调用注册码比较子程序
004B59DE    84C0              test al,al      //停在这里
004B59E0    74 1A             je short ebsc.004B59FC//在此跳转
004B59E2    8BC3              mov eax,ebx
004B59E4    E8 1FDEF4FF       call ebsc.00403808
004B59E9    8BC6              mov eax,esi
004B59EB    E8 50D9FAFF       call ebsc.00463340
004B59F0    8BC6              mov eax,esi
004B59F2    E8 11DEF4FF       call ebsc.00403808
===================================================================
一看,又有一个比较和跳转,看来我们找到关键了,修改je到jne,运行程序,果然,直接进入程序!
分析一下上面的代码,很容易发现,al的值是关键,而且在004B59DE处的al值是调用ebsc.004B3260得到的结果,我们到ebsc.004B3260处看看:
===================================================================
004B3260    53                push ebx
004B3261    8BD8              mov ebx,eax
004B3263    8BC3              mov eax,ebx
004B3265    E8 8EFFFFFF       call ebsc.004B31F8
004B326A    84C0              test al,al    //又一个比较
004B326C    74 04             je short ebsc.004B3272  //如果注册码不对就跳,这才是程序的关键
004B326E    B0 01             mov al,1
004B3270    5B                pop ebx
004B3271    C3                retn
004B3272    33C0              xor eax,eax
004B3274    5B                pop ebx
004B3275    C3                retn
===================================================================
这个子程序很简单,它调用了 ebsc.004B31F8来比较注册码,将结果存到al中作者多此一举又来个跳转,这样我们只要修改004B326C处的跳转就可以了!
呵呵!
拿出hiew,找到004B326C处,将74改为75,运行程序,没问题!


【总结体会】:呵呵,其实作者的保护力度还是很够的,只是我运气好碰上了!我在用hiew修改的时候,把hiew复制到ebsc.exe所在的文件夹,修改完了以后居然程序不能运行!我以为程序有crc校验,又把改的地方改回来了,发现还是能用,但是用olldbg可以,我就又找了个loader程序的源码,还是不行,我又慢慢的分析了一下程序,发现程序用到了CreateToolhelp32Snapshot函数,呵呵,虽然我不是很清楚这个函数的意思,我知道这个函数跟anti-dbg有关,看来作者还是有准备的,并不想我想的那样!我在CreateToolhelp32Snapshot下断,慢慢单步运行,最后我发现了一些常用的破解工具的名字,像softice等,但是,就是没有olldbg!我的运气好,也是作者的问题,大概作者还不了解olldbg吧!否则,我就要碰壁了!
  我在再次调试的过程中没有解决hiew修改程序不能运行的问题!不过很偶然,我用loader动态改程序的时候,发现,如果在ebsc.exe所在的目录下有非该软件的文件,ebsc.exe就不能运行,因为我用hiew修改ebsc.exe后,把hiew留在那个目录,也许是这个原因导致了程序不能运行!
  我再次修改,并把hiew删除,呵呵,运气好,程序能用了!
  作者在保护软件方面还是花了不少心思的!
  非常感谢大家能读完全文。我特地找了个简单的程序,写写自己的思路,希望高手们能指点小弟一下!