-
您的位置:首页 → 精文荟萃 → 破解文章 → DLLShow V4.6
DLLShow V4.6
时间:2004/10/15 0:59:00来源:本站整理作者:蓝点我要评论(0)
-
目标 : DLLShow V4.6 - http://www.gregorybraun.com/
工具 : OllyDBG.exe - http://www.suddendischarge.com
这是我的第一片教程,我希望有时间写更多的,我是一个破解新手,搞破解已经花了我
太多的时间了,但我仍然有很长的路要走,我尽力使这篇文章通俗易懂,我认为只有在
你熟悉目标软件的情况下,你才可以破解它,我将开始描述调我们这课需要的试产品。
我不是一个好的 SoftIce 迷,光是熟悉指令和安装就花了我许多时间,我也很喜欢使用
W32dasm 但我尽管使用它在许多场合有很多限制。我升级到Windows2000后,竟然运行不
了32dasm 了,我想找一个和它相同的调试/反编译软件,如果要比 w32dasm 更强大的,
那我就已经找到了,它就是 Ollydbg,做这是:Oleh Yuschuk,这是给像我一样已经等了
很久的人的一个工具,会使用 w32dasm 的你,你也将会掌握它的。
一个伟大的工作即将开始。
干掉它,跟我来吧,做我所作的,并且我尽我所能的解释给你听。
我选择这个目标的原因是它没有一个好用的卸载程序,许多程序员小贩都不把他们的软件
做的很友好:(
让我们开始吧!
到我上面写的那个网站下载一个目标程序。解压缩并且安装它,运行 DLLShow 并且选择
注册选项。你将看见软件需要输入名字,公司和注册码,我们现在已经可以大致确定这是
一个根据姓名和公司名来生成注册码的软件,这也是破解过程中的一个进展。我们要找出
密码,并且看它使如何产生的。
好的,现在我们要输入注册码但我们根本没有正确的注册码,打开 Ollydbg 并且用它打开
软件(DLLShow.exe)。默认的,你将看见4段不同用处的调试窗口,左上角的用于显示反编
译代码,右上角的用于显示寄存器数据这是非常有用的,不像softice,你想查看寄存器中
有疑问的地址,那么这个调试器显示地址的内容,如果程序使ascii码值(姓名或注册码:),
都将显示它并且你不需要转换。(这段翻译的有些难懂,我也很难理解原文)
左下角,显示当前所载入的软件数据在内存中的位置,这对找出数据很有帮助,你将待会儿
将看见我是如何利用它的,右下角显示被各种函数所使用的内存,我也是初学者,也不知道
这个窗口的所有用处,但是现在,我们并不需要知道。
那好,用调试器载入程序,我们需要运行它。选择"Deebug" 并且点击"Run"或按 F9。软件
将像平时一样运行。去注册窗口并且输入名字,公司和注册码我输入的是:
NAME : Hoof Arted
COMPANY : Hoof's Workshop
SERIAL : 77777777
你现在可以是用任何数字作注册码,我喜欢7,而且保持在8个字符,这将是我干得快些,(他
们说7是幸运数字!)
我们知道如果我们点击 “OK”按钮,软件将会弹出一个“愚蠢破解者”的窗口,我们需要知道在
哪里设置断点,我喜欢首先试着用 GetDlgItemTextA ,在 Ollydbg 中设置断点有一些不同,
因为查找函数不像你希望的那样工作,右击左上角的窗口,并且选择 “Search for NAME (LABEL)”
这将出现一个带有许多软件所使用的函数的小窗口,向下拉动滑动条到了USER32.GetDlgItemTextA
并且使它处于高亮状态,右击它选择"Find references to import",;另一个窗口打开了,显示
着软件调用函数的地址,通过按F2在每一个上面都设置一个断点,然后他的左边就会变成红色,
如果有任何地方呼叫这里都会被调试器所暂停。
好的,现在单击目标软件的“OK”按钮。调试器将停在地址 4159FB 这里,我们不关心函数
GetDlgItem function 是如何运行的,所以我们点击地址 4159FB 并且按 F2 来清除断点,然后,
选择下一行再按 F2 来恢复断点。按 F9 来运行软件以通过这个地方,它再次被停下来了,我们
可以看见 ESI 寄存器(右上角) 现在有一个Ascii码"Hoof Arted",真不错!它现在得到我们的
名字了,如果我们再次按 F9,目标软件将再次停在相同的断点,但是这次,ESI 已经是我们的
公司名了,是一个 ASCII。按 F9 第三次 Esi 将显示我们输入的注册码。好,现在我们知道程序
已经得到我们所有的信息了。它将要用这些信息作什么呢?
因为它已经得到了我们输入的所有信息了,我们需要从这儿将它带到软件中,我们不能再按F9运行,
因为要找到我们想要得到的东西,所以我们按 F7 来一步步的运行,直到你到了以下代码处 :
0040D717 |. 8D4C24 40 LEA ECX,DWORD PTR SS:[ESP+40] <<<<<<<<
0040D71B |. 51 PUSH ECX
0040D71C |. E8 25990000 CALL DLLShow.00417046 <<<<<<< Call (a)
0040D721 |. 56 PUSH ESI
0040D722 |. 8BD8 MOV EBX,EAX
0040D724 |. E8 37820000 CALL DLLShow.00415960 <<<<<<< Call (b)
0040D729 |. 83C4 38 ADD ESP,38
0040D72C |. 3D 92A71901 CMP EAX,119A792
0040D731 |.,75 18 JNZ SHORT DLLShow.0040D74B
现在,如果你进入了第一个Call (Call A) 你将看见它对我们的注册码做了些社那么,我们对
暂时不关心这个,设置断点在 0040D721 并按 F9,当我们停在下一行的时候,我们可以看看寄
存器 EAX ,我的显示为 04A2CB71,这个数的十进制是什么?用计算器算一下看看,这是我们
输入的假注册码!call A 是将我们的假注册码转换为16进制, Hmmmm...有趣,可能下一个call
就是计算正确注册码的地方了,按 F7 进入 call 然后停一停,有些东西我需要解释给你听。
正如你所看到的,函数被显示在下面:
00415960 /$ 51 PUSH ECX ;
DLLShow.00426006
00415961 |. 53 PUSH EBX
00415962 |. 8B5C24 0C MOV EBX,DWORD PTR SS:[ESP+C]
00415966 |. 56 PUSH ESI
00415967 |. 33F6 XOR ESI,ESI
00415969 |. 53 PUSH EBX ; /Length Of Name
0041596A |. 897424 0C MOV DWORD PTR SS:[ESP+C],ESI ; |
0041596E |. FF15 B4E04100 CALL DWORD PTR DS:[<&KERNEL32.lstrlen>; \lstrlenA
00415974 |. 85DB TEST EBX,EBX
00415976 |.,74 4F JE SHORT DLLShow.004159C7
00415978 |. 85C0 TEST EAX,EAX
0041597A |.,74 4B JE SHORT DLLShow.004159C7
0041597C |. 33D2 XOR EDX,EDX
0041597E |. 85C0 TEST EAX,EAX
00415980 |.,7E 45 JLE SHORT DLLShow.004159C7
00415982 |. 55 PUSH EBP
00415983 |. 57 PUSH EDI
00415984 |. BE 183E4200 MOV ESI,DLLShow.00423E18 ;ASCII"|b!pz*ls;rn|lf$vi^Axpe)rx5aic&9/2m5lsi4@0dmZw94cmqpfhw"
00415989 |. BF 01000000 MOV EDI,1
0041598E |. 2BF3 SUB ESI,EBX
00415990 |. 8BCB MOV ECX,EBX ;
00415992 |. 2BFB SUB EDI,EBX
00415994 |> 0FBE1C0E MOVSX EBX,BYTE PTR DS:[ESI+ECX] ; 将上面的Ascii依次移动到EBX
00415998 |. 0FBEAC10 E03D4>MOVSX EBP,BYTE PTR DS:[EAX+EDX+423DE0] ; chr(423DE0 + Len + Pos) 放入 EBP
004159A0 |. 0FAFDD IMUL EBX,EBP ; 相乘
004159A3 |. 8D2C0F LEA EBP,DWORD PTR DS:[EDI+ECX]
004159A6 |. 0FAFDD IMUL EBX,EBP ; 相乘结果再乘位数
004159A9 |. 0FBE29 MOVSX EBP,BYTE PTR DS:[ECX] ; 移动名字的字符到EBP
004159AC |. 0FAFDD IMUL EBX,EBP ; 相乘结果再乘以名字字符
004159AF |. 8B6C24 10 MOV EBP,DWORD PTR SS:[ESP+10] ;
004159B3 |. 03EB ADD EBP,EBX ; 累加
004159B5 |. 42 INC EDX ; 下一个字符
004159B6 |. 41 INC ECX
004159B7 |. 3BD0 CMP EDX,EAX ; 名字结束了吗?
004159B9 |. 896C24 10 MOV DWORD PTR SS:[ESP+10],EBP ; 存入[ESP+10]
004159BD |.^7C D5 JL SHORT DLLShow.00415994 ; 跳转,形成循环
004159BF |. 8BC5 MOV EAX,EBP ;
004159C1 |. 5F POP EDI
004159C2 |. 5D POP EBP
004159C3 |. 5E POP ESI
004159C4 |. 5B POP EBX
004159C5 |. 59 POP ECX
004159C6 |. C3 RETN
Ollydbg做的比较好的就是他可以给语句添加注释,你还可以随时更改这些注释,我还
从没有看见其他的调试器可以做到这一点(译者:TRW不就可以?)你只需要对着语句
点击右键然后选择“Comment”即可,那很简单。这样你就不需要把重要的地方记在纸
上了。
好,我们看见那个函数检查了名字的个数(0041596E),然后它就移动下面的 ascii:
"|b!pz*ls;rn|lf$vi^Axpe)rx5aic&9/2m5lsi4@0dmZw94cmqpfhw" (00415984)放进了内
存。那么,这所有的动作说明了什么呢?好的,如果我们熟悉它的话,就会发现它移动
我们上面所说的每个字符一个一个的放入EBX。EBP中的值就是从地址 423de0 + (我们
名字的个数) + (字符的位置)。但是,423de0 里面又是什么呢?让我们把它找出来,
右击左下部的并且选择要去的地址,输入 423de0 然后单击“OK”,你将看到以下片断:
00423DE0 23 73 65 72 42 26 6E 7A 7C 6D 66 4D 31 2F 35 28 #serB&nz|mfM1/5(
00423DF0 21 73 64 24 4D 71 2E 7B 73 5D 2B 73 46 6A 74 4B !sd$Mq.{s]+sFjtK
00423E00 70 7A 53 64 74 7A 6F 58 71 6D 62 5E 41 6C 40 64 pzSdtzoXqmb^Al@d
00423E10 76 3A 73 3F 78 2F 00 00 7C 62 21 70 7A 2A 6C 73 v:s?x/..|b!pz*ls
00423E20 3B 72 6E 7C 6C 66 24 76 69 5E 41 78 70 65 29 72 ;rn|lf$vi^Axpe)r
00423E30 78 35 61 69 63 26 39 2F 32 6D 35 6C 73 69 34 40 x5aic&9/2m5lsi4@
00423E40 30 64 6D 5A 77 39 34 63 6D 71 70 66 68 77 0dmZw94cmqpfhw
这是有用代码的第二段,下一行乘以两个值,我这里是“66”和“7C”,它然后它乘
以总数,用名字的位数1 (H)、2(o).... 它然后用名字的第一个字符和乘积,在我这儿
是48 (H),然后所有的数都这样,我得总数是1E159AD,继续按F7直到呢到达以下片断:
00415400 /$ 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
00415404 |. 56 PUSH ESI
00415405 |. 8B35 84C34200 MOV ESI,DWORD PTR DS:[42C384] ;
DB95DB95 = Hardcoded
0041540B |. 50 PUSH EAX
0041540C |. 81CE 78030000 OR ESI,378 ; Or
with 378 = DB95DBFD
00415412 |. E8 49050000 CALL DLLShow.00415960
00415417 |. 8B4C24 10 MOV ECX,DWORD PTR SS:[ESP+10]
0041541B |. 03F0 ADD ESI,EAX ; Add
Name total and Co total to DB95DBFD
0041541D |. 51 PUSH ECX
0041541E |. E8 3D050000 CALL DLLShow.00415960
00415423 |. 83C4 08 ADD ESP,8
00415426 |. 03C6 ADD EAX,ESI ;
Total = E2F7A8AE
00415428 |. 5E POP ESI
这是在干什么呢?它带着你的总数,并且加上它的 hardcoded,(DB95DB95 OR 378) = DB95DBFD
整个计算此数过程以公司名重复的,两个总和的地址指向 E2F7A8AE 这个数,做的所有事情就是转化
成十进制数。这个数就是注册码了!
按 F9 直到得到错误讯息并且输入一个新的注册码,就是他!!! 你已经破解它了。
现在我们知道注册码被生产了,你可以做一个属于你自己的注册机了,我已经破解这个公司出的许
多软件了,因为他们是很懒惰的。他们使用同一种算法,仅仅是换个ID"DB95DB95".
我希望你能从这个教程中学到一些关于 Ollydbg 的使用方法,这是一个新的调试软件。
|
相关阅读
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破解如何给软件脱壳基础教程
查看所有0条评论>>