您的位置:首页精文荟萃破解文章 → 算法分析: <献给初学者> 之七

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

时间:2004/10/15 0:55:00来源:本站整理作者:蓝点我要评论(0)

 
▲软件名称▲ 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]




    
    
     
    
    
     

相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么

文章评论
发表评论

热门文章 去除winrar注册框方法

最新文章 比特币病毒怎么破解 比去除winrar注册框方法 华为无线路由器HG522-C破解教程(附超级密码JEB格式文件京东电子书下载和阅读限制破解教UltraISO注册码全集(最新)通过Access破解MSSQL获得数据

人气排行 华为无线路由器HG522-C破解教程(附超级密码JEB格式文件京东电子书下载和阅读限制破解教UltraISO注册码全集(最新)qq相册密码破解方法去除winrar注册框方法(适应任何版本)怎么用手机破解收费游戏华为无线猫HG522破解如何给软件脱壳基础教程