动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
   安全 → 阅读文章

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

作者来源: 
阅读 1329 人次 , 2006-4-26 15:19:00 

▲破解思路▲
首先,我们要找到那个 Key File 文件名和文件类型,因为如果连它的名字和类型都不知道的话,那我们可真就无从下手啦!
那么,如何找到它呢?这里就有个断点设置的问题了。一般地,我们应该设置以下断点:
Bpx CreatefileA
此断点的含义是:确定文件是否存在;打开文件并获得句柄。

因此,我们可以用它来设断。争取找到那个 KEY FILE 的文件名及类型。
然后,我们就要用16进制编辑器来建立一个假的 KEY FILE 文件,推荐使用HexWorkshop。当然啦,如果是文本之类的文件,也可以用文本编辑器的啦!!然而,我们还是推荐用HexWorkshop。
建立好假文件后,就要在文件里面先随便地写入一些东东,保存并退出该钥匙文件。
然后,再重新运行待破解程序,按照正常破解思路去寻找突破口,争取找到其文件中的内容,以便正确构造这个 KEY FILE ,只有这样,才能成功破解。

至于我前面的提到的关于找钥匙文件名称及类型的问题,方法可以有两种:一就是使用FileMon等工具,监视程序启动时对文件的操作,找到钥匙文件的文件名和类型;二就是直接开始调试,在调试状态下找到文件名和类型。其实,两者的作用是一样的,但是如果讲速度的话,还是第一种快些。不过,还是建议初学者尽量学会使用第二种调试的方法。

这次要破解的这个软件我可以告诉大家,它先后有三次提示如下:
第一次为----“Error in test 1”=======>针对找不到钥匙文件弹出的出错信息。
第二次为----“Error in test 2”=======>针对虽有钥匙文件但内容不符弹出的出错信息。
第三次为----“Error in test 3”=======>针对钥匙文件内字符串长度不正确弹出的出错信息

好了,让我们一起出发吧!Let's go!!!!!!(省略去设断及中断过程)


第一步骤:找到钥匙文件的名称及类型

//******************** Program Entry Point ********
:00401000 6A00 push 00000000

* Reference To: KERNEL32.GetModuleHandleA, Ord:0111h
|
:00401002 E86B010000 Call 00401172
:00401007 A39C304000 mov dword ptr [0040309C], eax
:0040100C 80055030400001 add byte ptr [00403050], 01
:00401013 E885000000 call 0040109D==================>进入此CALL
:00401018 7432 je 0040104C====================>跳就完蛋啦!!!
:0040101A A344304000 mov dword ptr [00403044], eax
:0040101F 80055030400001 add byte ptr [00403050], 01
:00401026 E89D000000 call 004010C8
:0040102B 751F jne 0040104C
:0040102D A372304000 mov dword ptr [00403072], eax
:00401032 E8A2000000 call 004010D9
:00401037 83F801 cmp eax, 00000001
:0040103A 7409 je 00401045
:0040103C 80055030400001 add byte ptr [00403050], 01
:00401043 EB07 jmp 0040104C

===============进入00401013处的CALL后来到=============
* Referenced by a CALL at Address:
|:00401013
|
:0040109D 8D3D3B304000 lea edi, dword ptr [0040303B]=====>停在这里
:004010A3 E895000000 call 0040113D
:004010A8 6A00 push 00000000
:004010AA 6880000000 push 00000080
:004010AF 6A03 push 00000003
:004010B1 6A00 push 00000000
:004010B3 6A01 push 00000001
:004010B5 6800000080 push 80000000

* Possible StringData Ref from Data Obj ->"sdrs-sws"
|
:004010BA 683B304000 push 0040303B=====================>得到钥匙文件的名称
及类型:test.txt
是怎么知道的呢?D 0040303B可得到。

* Reference To: KERNEL32.CreateFileA, Ord:0032h
|
:004010BF E89C000000 Call 00401160
:004010C4 83F8FF cmp eax, FFFFFFFF
:004010C7 C3 ret
因此,还犹豫什么呀?赶快建立此钥匙文件吧?建立test.txt,并且在里面随便写入一些东东。比如我写的是goodbao。然后,再来一次调试过程。


第二步骤:找出钥匙文件内字符串的长度

* Reference To: KERNEL32.GetModuleHandleA, Ord:0111h
|
:00401002 E86B010000 Call 00401172
:00401007 A39C304000 mov dword ptr [0040309C], eax
:0040100C 80055030400001 add byte ptr [00403050], 01
:00401013 E885000000 call 0040109D==================>还跳吗???
:00401018 7432 je 0040104C====================>嘻嘻,不跳了吧!!
:0040101A A344304000 mov dword ptr [00403044], eax
:0040101F 80055030400001 add byte ptr [00403050], 01
:00401026 E89D000000 call 004010C8==================>进入此CALL
:0040102B 751F jne 0040104C===================>跳就死啦!!
:0040102D A372304000 mov dword ptr [00403072], eax
:00401032 E8A2000000 call 004010D9
:00401037 83F801 cmp eax, 00000001
:0040103A 7409 je 00401045
:0040103C 80055030400001 add byte ptr [00403050], 01
:00401043 EB07 jmp 0040104C

===============进入00401026处的CALL后来到=============
* Referenced by a CALL at Address:
|:00401026
|
:004010C8 6A00 push 00000000=================>我们停在这里
:004010CA FF3544304000 push dword ptr [00403044]

* Reference To: KERNEL32.GetFileSize, Ord:00FEh
|
:004010D0 E897000000 Call 0040116C=================>得到钥匙文件内字符串的
长度,并存入EAX中保存。
:004010D5 83F80A cmp eax, 0000000A=============>与0A比较一下?
:004010D8 C3 ret===========================>结束并继续执行程序。

那么,比较后,它又执行了什么呢?请随我来看…………
:0040102B 751F jne 0040104C===================>跳就死啦!!
天哪!它比较后的结果居然如此可怕呀!明白了吗?嘻嘻,就是说,如果EAX(即你输入的字符串的长度)与$0A(10进制的10)不相等的话,嘿嘿,那就玩完啦![
因此,我们在第二步骤中得到了一个重要的情报----钥匙文件内的字符串长度必须为10。
好了,休息,休息一会儿…………继续长征!!!!!!


第三步骤:找出钥匙文件内字符串的内容

* Reference To: KERNEL32.GetModuleHandleA, Ord:0111h
|
:00401002 E86B010000 Call 00401172
:00401007 A39C304000 mov dword ptr [0040309C], eax
:0040100C 80055030400001 add byte ptr [00403050], 01
:00401013 E885000000 call 0040109D
:00401018 7432 je 0040104C
:0040101A A344304000 mov dword ptr [00403044], eax
:0040101F 80055030400001 add byte ptr [00403050], 01
:00401026 E89D000000 call 004010C8
:0040102B 751F jne 0040104C=====================>你还敢跳吗?
:0040102D A372304000 mov dword ptr [00403072], eax
:00401032 E8A2000000 call 004010D9====================>进入此CALL
:00401037 83F801 cmp eax, 00000001================>上面CALL的EAX的结果
与$01比较
:0040103A 7409 je 00401045======================>相等则跳,跳就太好 耶!!!!
:0040103C 80055030400001 add byte ptr [00403050], 01
:00401043 EB07 jmp 0040104C=====================>跳就死翘翘!!!

===============进入00401032处的CALL后来到=============
* Referenced by a CALL at Address:
|:00401032
|
:004010D9 6A00 push 00000000
:004010DB 6888304000 push 00403088
:004010E0 6A04 push 00000004
:004010E2 687E304000 push 0040307E
:004010E7 FF3544304000 push dword ptr [00403044]

* Reference To: KERNEL32.ReadFile, Ord:01FDh
|
:004010ED E886000000 Call 00401178
:004010F2 803D7E3040002D cmp byte ptr [0040307E], 2D===>第一位字符与$2D(即10进 制的‘-')比较
:004010F9 7404 je 004010FF===================>相等则继续执行下面
:004010FB 33C0 xor eax, eax
:004010FD EB13 jmp 00401112==================>惨喽!!!!!!!!

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004010F9(C)
|
:004010FF 803D7F30400030 cmp byte ptr [0040307F], 30===>第二位字符与$30(即10
进制的‘0'比较)
:00401106 7404 je 0040110C===================>相等则继续执行下面
:00401108 33C0 xor eax, eax
:0040110A EB06 jmp 00401112==================>跳就死翘翘!!!!

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401106(C)
|
:0040110C B801000000 mov eax, 00000001=============>EAX置为$01
:00401111 C3 ret===========================>退出继续执行下面的程序

呵呵,可见,我们已经成功啦!!!!!

▲破解及算法过程总结▲
一、找到钥匙文件的名称及类型,此例为test.txt文本文件;
二、找出钥匙文件内的字符串长度,此例钥匙中的字符长度必须为10;
三、找出字符串的具体内容,也就是算法了。此例中很简单,就是第一位为-,第二位为0,其他为任意。
大家明白了吗?
收工喽……………………
  
 本文Tags算法  
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:[原创]算法浅探——OpenCanvas V2.24 汉化版(2)
· 下一篇:算法分析: <献给初学者> 之三
· 系统防御战:黑客网络攻击的预防措施
· 防范脚本入侵,你做好准备了吗?
· 安全技术详解 跳板攻击与防御
· PCRE函数库未正确检查正则表达式 存在堆溢出漏洞
· CISCO PIX防火墙管理手册(1)


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077