• 标 题:学算法的看过来 》》》算法分析: <献给初学者> 之五 (5千字)
  • 作 者:ccmc[P.J.CHINA]
  • 时 间:2002-6-7 13:37:08
  • 链 接:http://bbs.pediy.com

算法分析:  <献给初学者> 之五

◆ 作  者 ◆ goodbao[P.J.CHINA]

▲软件名称▲  网际搜索 NetSearch V1.0

▲软件简介▲  一款互联网搜索软件,能有效的对网站、软件、新闻、音乐、图书、购物、股票等进行搜索,而不用烦索的登录到各大网站,直接在本软件内部输入关键字进行搜索,大大的节省了上网时间和费用。

▲破解难度▲  非明码破解。算法难度初级。

▲破解背景▲  这几天真的非常背呀!机器总是死机、重启,开不开又关不成!唉,命好苦呃。。。。索性上网找了个软柿子,拼命地狠捏了一通,算是解了心头之恨!!!!呵呵。。“高不成、低不就”的我在这里就再现一回眼,把它贴了出来啦!

▲破解过程▲
    这是一个非明码的注册方式,如果注册不对,它会有提示,又没加过壳,因此反编译是很容易的。但是,也正由于其非明码,所以可能对初学的朋友们来说会有些难度。因此,我尽量把过程写得细些,供大家参考。
    首先,设断Bpx hmemcpy,然后F5退出,然后填写名与码,然后点击注册认证,会中断。然后,清断,然后12下F12(因为13下会出错),就会来到如下地方:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004AC9C6(C)
|
:004ACA3B 8B45F4                  mov eax, dword ptr [ebp-0C]======>我们停在这儿。

:004ACA3E E87974F5FF              call 00403EBC======>取注册名的长度并保存在EAX中。

:004ACA43 8BF0                    mov esi, eax========>ESI=EAX=注册名的长度
:004ACA45 85F6                    test esi, esi=======>测试ESI是否为0。即:判断是否什么都没输入。
:004ACA47 7E38                    jle 004ACA81========>什么都没输入就跳了,那就玩完。。
:004ACA49 C745F001000000          mov [ebp-10], 00000001====>给[ebp-10]赋值为01,下边要用到它进行一次传送,然后作为循环计算时的计数器。

===================循环计算开始===================

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004ACA7F(C)
|
:004ACA50 8D45EC                  lea eax, dword ptr [ebp-14]
:004ACA53 50                      push eax
:004ACA54 B901000000              mov ecx, 00000001=============>ECX=01
:004ACA59 8B55F0                  mov edx, dword ptr [ebp-10]===>EDX=[ebp-10],就是上边提到的已经被赋值为01的那个。这里给EDX赋值为01,其作用就是为下边即将进行的循环过程计数。

:004ACA5C 8B45F4                  mov eax, dword ptr [ebp-0C]===>EAX=用户名
:004ACA5F E86076F5FF        call 04040C4===============>依次取用户名的每一个字符送给EAX

:004ACA64 8B45EC                  mov eax, dword ptr [ebp-14]===>EAX=用户名第一个字符
:004ACA67 E81476F5FF              call 00404080=================>取字符的$
:004ACA6C 8A00                    mov al, byte ptr [eax]========>AL=所取字符的$
:004ACA6E 25FF000000              and eax, 000000FF=============>EAX和000000FF进行与运算,事实上就是把EAX的值写为上面所取字符的16进制值。

:004ACA73 03D8                    add ebx, eax==================>EBX=EBX+EAX。什么意思呢?就是说,依次取了我们输入的用户名的字符后,把所取的字符值存入了EAX,然后把这个值与EBX相加,结果存入了EBX。EBX在初始时,值是0,因此,第一次运行到这里,就是把我们所取的第一个用户名$给了EBX。下次开始再运行到这里时,就是把后面的计算结果与每次所取的字符值依次相加后,放入EBX了。呵呵。。。。因此,第一次时,EBX=EAX

:004ACA75 81C351EBC900            add ebx, 00C9EB51=============>上面的结果EBX与00C9EB51相加,再把计算的和存在EBX中。
:004ACA7B FF45F0                  inc [ebp-10]==================>[ebp-10]加1,开始计数。
:004ACA7E 4E                      dec esi=======================>ESI减1。前面ESI已经被赋值为用户名$长度了,因此,这里减1,意味着已经有一个字符被取算完成。

:004ACA7F 75CF                    jne 004ACA50==================>没取完跳回,取完继续。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004ACA47(C)
|
:004ACA81 8D55E8                  lea edx, dword ptr [ebp-18]
:004ACA84 8B45FC                  mov eax, dword ptr [ebp-04]
:004ACA87 8B8000090000            mov eax, dword ptr [eax+00000900]
:004ACA8D E8FA07F8FF              call 0042D28C=====================>取注册码个数
:004ACA92 8B45E8                  mov eax, dword ptr [ebp-18]=======>EAX=[ebp-18]=输入的注册码
:004ACA95 E8F6C0F5FF              call 00408B90=====================>取注册码的值存入EAX
:004ACA9A 3BD8                    cmp ebx, eax======================>比较EBX与EAX。即比较前面计算的结果值与注册码的值是否相等
:004ACA9C 7519                    jne 004ACAB7======================>不相等,就完蛋啦!
:004ACA9E C645FB01                mov [ebp-05], 01
:004ACAA2 B8B49A4C00              mov eax, 004C9AB4
:004ACAA7 8B55F4                  mov edx, dword ptr [ebp-0C]
:004ACAAA E8E171F5FF              call 00403C90
:004ACAAF 891DB89A4C00            mov dword ptr [004C9AB8], ebx
:004ACAB5 EB04                    jmp 004ACABB

▲算法总结▲
        用户名与注册码的关系应该是这样的:比如,我取用户名为ABC。那么,先经过如下计算得到EBX的值为41+00C9EB51+42+00C9EB51+43+00C9EB51=25DC2B9。然后,将其转化为10进制值:39699129。这就是注册码了。应该指出的是,这个软件对注册码长度是没有限制的,哪怕你只在用户名中输入一个字符,那么也可以注册成功!中文名字就更可以啦!只是要注意,中文名字一个字相当于两个字节长度的。呵呵。。。。
    收工喽…………………………@!@

--------------------------------------------------------------------------------
   神龙宝宝
goodbao[P.J.CHINA][BCG][CNCG]