老文章档案 · 2003 年

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

网络学院 · 破解文章 · 2003-08-19 · 作者:goodbao[P.J.CHINA] · 出处:赢政天下整理收藏

▲软件名称▲ PTI CRACKME

▲下载地址▲

http://ddcrack.myetang.com/crackit/crackme/praetoriancm.zip

▲破解难度▲

个人认为对于初学者说来--很难!!!!!!是那种Keyfile(我称它为钥匙文件)类型的程序(就象大名鼎鼎的SafeClean Utilities),如果没有KEY(钥匙),则无法破解,根本连思路都不可能有!哈哈。。。。。。。

▲破解思路▲

首先,我们要找到那个 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,其他为任意。

大家明白了吗?

收工喽…………………………@!@

--------------------------------------------------------------------------------

神龙宝宝

goodbao[P.J.CHINA][BCG][CNCG]

相关资讯:

·语音界面2.0算法分析及注册机源码!

·侠客系统修改器1.21破解手记--算法分析

·中文拨号上网计时计费器 V4.12注册算法分析

·ClockWise 3.22e注册码算法分析

·CoolClock V1.02注册算法分析

·Directory Scanner v1.5 注册算法分析

·Disk Chief 1.2 简单注册算法分析

·EffeTech HTTP Sniffer 3.2注册算法分析

·eLib2.01算法分析

·EZ MP3 Recorder 1.15 注册算法分析

相关软件:

→ 特别推荐

→ 热点TOP10

我为人人《《==》》人人为我

关于我们 |

帮助(?)|

广告服务 |

版权声明 |

商业合作 |

发展历程 |

加盟我们 |

联系我们

Copyright (C) 1998-2004 winzheng.com All Rights Reserved.

特别感谢 蓝芒科技 提供下载站及论坛服务器

2003-2004 年,宽带刚刚普及,下载站的文章区是许多人学电脑的第一课堂。
🕰 → 🤖 从那时到现在

当年一篇教程能让一台电脑焕然一新;今天的效率工具换成了 AI。 想知道当下最可靠的 AI 模型怎么选?看 赢政指数——我们用了 28 年的选软件严谨,现在用来评测大模型。

档案性质声明:本页为赢政天下(1998-2011)老文章的历史档案复原, 内容反映当年发表时的原貌——包括当年的技术表述、软件版本与观点,部分方法在今天已不适用或不合规,仅作互联网历史记录与研究用途, 不提供任何形式的下载。原始数据经由公共网络存档(Internet Archive)复原。发现问题请联系我们
← 返回老文章档案 · 软件史档案馆 · 赢政天下站史