Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 网络安全 > 黑客技术 > 算法分析: <献给初学者> 之五
【标  题】:算法分析: <献给初学者> 之五
【关键字】:初学者,算法分析
【来  源】:网络

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

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

▲破解过程▲
这是一个非明码的注册方式,如果注册不对,它会有提示,又没加过壳,因此反编译是很容易的。但是,也正由于其非明码,所以可能对初学的朋友们来说会有些难度。因此,我尽量把过程写得细些,供大家参考。
首先,设断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。这就是注册码了。应该指出的是,这个软件对注册码长度是没有限制的,哪怕你只在用户名中输入一个字符,那么也可以注册成功!中文名字就更可以啦!只是要注意,中文名字一个字相当于两个字节长度的。
算法分析: <献给初学者> 之二:【上一篇】
算法分析之六:【下一篇】
【相关文章】
  • 算法分析: <献给初学者> 之二
  • 算法分析: <献给初学者> 之三
  • 算法分析: <献给初学者> 之七
  • 成语速查v3.0 算法分析
  • 算法分析 好冷清啊,来一篇破文吧
  • 小护士 V1.52简单算法分析
  • 八字解析_1.21算法分析
  • ToolbarPro 4.61 Cracked And my Keygen算法分析
  • Talisman Desktop v2.6 算法分析
  • 键盘鼠标发声器算法分析
  • 【随机文章】
  • 微软在2.0增加BindingList并实现了IbindingList
  • Dreamweaver快捷键大全
  • SCJP认证套题解析之四
  • 使用网路工具 下
  • 这几天的程序调试
  • 如何彻底清除本地和远程系统日志文件
  • AJAX,CSS,RUBy的小抄
  • linux下常用软件列表 转载
  • I found something interesting related to UNPv1, 3E
  • oracle的导入导出
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.