• 标 题:adbin 1.2 (23千字)
  • 作 者:程式猎人
  • 时 间:2000-9-16 23:03:53
  • 链 接:http://bbs.pediy.com

AdBin V1.2
                                    程式猎人
简介:这个是一个上网加速的软件,它可以将你访问的网站时,可以将广告进行屏障掉,所
以这样就可以增加的上网速度。
追踪:RN:01234567
  对于追踪这个软件,可是花了我几天的时间才将它追踪出来。在前几天,没有将它追踪
出来,因为这个软件在破解过程中的确有一定的难度,所以那几天没有将它追踪出来。
但是昨天我又将它拿出来进行破解,因为我昨天有一种不死不归的感觉。终于将这个软件给
破解出来了,那么现在再想一下,这个软件如果要定位的话,它应当属于中上水平。现在就
来向大家介绍如何在前几天没有将它追踪出来的情况。


:00402676 E8D6080000              call 00402F51
:0040267B A180564100              mov eax, dword ptr [00415680]
:00402680 53                      push ebx

* Possible StringData Ref from Code Obj ->"VWhxVA"
                                  |
:00402681 6852734000              push 00407352
:00402686 57                      push edi

* Possible Reference to Dialog: DialogID_006C
                                  |
:00402687 6A6C                    push 0000006C
:00402689 50                      push eax
:0040268A E883F1FFFF              call 00401812
:0040268F 83F801                  cmp eax, 00000001
:00402692 0F85A8000000            jne 00402740
:00402698 8D45A4                  lea eax, dword ptr [ebp-5C]
:0040269B 50                      push eax
:0040269C E8DF870000              call 0040AE80
:004026A1 83F80A                  cmp eax, 0000000A  ****
:004026A4 59                      pop ecx
:004026A5 7225                    jb 004026CC
:004026A7 8D45A4                  lea eax, dword ptr [ebp-5C]
:004026AA 50                      push eax
:004026AB E8D0870000              call 0040AE80
:004026B0 83F814                  cmp eax, 00000014  ***
:004026B3 59                      pop ecx
:004026B4 7716                    ja 004026CC
:004026B6 8D45A4                  lea eax, dword ptr [ebp-5C]
:004026B9 50                      push eax

* Reference To: ABKernel.SetLic, Ord:001Dh
                                  |
:004026BA FF1500104100            Call dword ptr [00411000]
:004026C0 6A01                    push 00000001

* Reference To: ABKernel.SetEnabled, Ord:001Ch
                                  |
:004026C2 FF151C104100            Call dword ptr [0041101C]
:004026C8 59                      pop ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004025D4(U)
|
:004026C9 59                      pop ecx
:004026CA EB74                    jmp 00402740

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004026A5(C), :004026B4(C)
|
:004026CC 53                      push ebx

* Possible StringData Ref from Data Obj ->"Adbin"
                                  |
:004026CD 6890414100              push 00414190

* Possible StringData Ref from Data Obj ->"The licence code you entered has "
                                        ->"been generated illegally."
                                  |
:004026D2 6870424100              push 00414270
:004026D7 FFD6                    call esi
  现在我们当然是首先按正常的破解过程来破解它,这个软件在我刚刚破解时就发现了它是
一个比较特殊的注册过程。在上面就是这个软件的输入注册码后所进行的工作。在这里我们
将能得到什么呢?如果按照正常的注册比较过程的话,它在上面应当有比较的地方,但是在
这里我们将无法得到比较的地方,仅能得到的是比较你所输入注册码的位数值,在这里我们
可以轻松的得到这个软件所要求的位数,输入的注册码一定要满足A(H)<=RN<=14(H),如果
你没有满足上面的要求,程序会提示你输入的注册码不正确。我现在输入的RN:0123456789
后,程序没有出现提示了。但是我追踪后发现在这里它也仅仅是比较位数,没有进行注册码
的比较。那么这个软件就成了在开始时比较注册码方式的注册方法了。这种软件的破解关键
大于找到软件在那里进行比较的地方。于是就使用W32DASM进行反汇编,想要找到关键的比
较地方,如果要让我这么轻松就找到了,那么这个软件的难度也就无法称为中上水平了。
  在W中发现了
* Possible StringData Ref from Data Obj ->"Software\Paw-Print\Adbin"
  程序使用注册表选项,查找相应的选项,发现了下面比较敏感的选项。
RegistrationEval:VZYmhL4l39KA
RegistrationKey:0123456789
  以我个人的经验来说,只要发现这个关键的地方就可以成功一半了。这样的软件通常在程
序中使用相应的注册键值来进行运算。我于是就在W中对RegistrationKey进行查找,大家一
定会想到了这个结果就是没有查找到。那么我没有查找到这个键值,我可以查找到你使用读
取这个键的函数,我查找读取注册表的函数,但是它没有什么用处,它也无法将引导我向成
功的彼岸,没有办法了。以上就是我前几天没有将这个软件破解出来的过程。昨天我想再尝
试一下破解这个软件,这回我得到使用前几天没有用过方法对它进行破解。
  现在我们再说一些破解方面的事情,对于那种使用先输入注册码,再重新启动后进行比较
的注册过程,对于我们这些破解者来说,破解它们比破解那种直接进行注册码比较的软件增
加了一定的难度,通常就是这点难度使用那些初学者或者是掌握了一定的破解方法和技艺的
人也不好破解。对于这种软件的破解关键就是找到程序在启动时,在那个函数中对我们输入
的注册码进行比较的。我们破解者面对是几千个甚至是几万个函数,我们将如何找到它的比
较地方呢。对于不同的软件应当有着不同的破解方法,但是它有着几个相似的破解方法。那
么我在这里使用的就是过期的破解方法。
  大家现在向上看,你们会发现在注册表中不仅有RegistrationKey这个键值,而且还有Reg
istrationEval这个键值,那么它有什么用处呢。我不是设计者,所以我也不知道,但是破
解经验告诉我,这个键值一定与注册有关,具体什么关系我也只有试一试才知道。于是我将
这个键值中的VZYmhL4l39KA设为空,再重新启动软件,现在软件告诉你它已经过期了。那么
这就说明它的值同注册肯定有关系,我又将它copy回注册表中,重新启动软件,它没有出现
提示过期。现在我就将这个作为我向它发起攻击的突破点。
  现在调出trw,用它对这个软件进行追踪。

:0040B4A6 FF1504124100            Call dword ptr [00411204]
:0040B4AC 50                      push eax
:0040B4AD E8FF7AFFFF              call 00402FB1  <-出错,进入
:0040B4B2 8945A0                  mov dword ptr [ebp-60], eax
:0040B4B5 50                      push eax
  在指出的地方出错,通常我们使用这种方法进行追踪的关键是找到能不能跳过此call的地
方,向上看没有发现,于是就进入call中。下同:

:00403035 8BCB                    mov ecx, ebx
:00403037 E8A0180000              call 004048DC    <-出错,进入
:0040303C A10C584100              mov eax, dword ptr [0041580C]

:00404921 8BCF                    mov ecx, edi
:00404923 E84BC9FFFF              call 00401273    <-出错,进入

:004012C9 8D8D4CFFFFFF            lea ecx, dword ptr [ebp+FFFFFF4C]
:004012CF E824010000              call 004013F8    <-出错,进入


:0040152B FFD7                    call edi
* Reference To: ABKernel.GetStat, Ord:0015h
:0040152D FF1514104100            Call dword ptr [00411014]  <-出错,进入
:00401533 83F801                  cmp eax, 00000001
:00401536 7405                    je 0040153D

  我来到这里就出现地址的变化,因为在通常我们的地址是004?????,而现在进入到00C???
??,这个地址中。我也是现在才明白,这时进入了程序中调用的dll程序了。那么它进入那
个dll中,上面就有答案,
* Reference To: ABKernel.GetStat, Ord:0015h
这个就是关键,它一定进入ABKernel.dll中,因为在W中可以发现程序有这样一个dll文件
。因为我使用Nu来追踪,所以当时不知道它进入了那个dll,我只知道找到比较的地方,,E
xported fn(): GetStat - Ord:0016h
:10003088 E851E0FFFF              call 100010DE  <-出错,进入
:1000308D A158160110              mov eax, dword ptr [10011658]
:10003092 C3                      ret
进入call中如下:
:100010DE E85E1E0000              call 10002F41
:100010E3 85C0                    test eax, eax
:100010E5 740E                    je 100010F5
:100010E7 83251416011000          and dword ptr [10011614], 00000000
:100010EE 83253416011000          and dword ptr [10011634], 00000000

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100010E5(C)
|
:100010F5 E900000000              jmp 100010FA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100010F5(U)
|
:100010FA 833D3416011000          cmp dword ptr [10011634], 00000000
:10001101 750A                    jne 1000110D
:10001103 B920160110              mov ecx, 10011620 
:10001108 E8E3410000              call 100052F0  <-出错,进入

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001101(C)
|
:1000110D 833D1416011000          cmp dword ptr [10011614], 00000000
:10001114 750A                    jne 10001120
:10001116 B900160110              mov ecx, 10011600
:1000111B E8D0410000              call 100052F0      <-出错,进入

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001114(C)
|
:10001120 833D3416011000          cmp dword ptr [10011634], 00000000
:10001127 740D                    je 10001136
:10001129 833D1416011000          cmp dword ptr [10011614], 00000000
:10001130 7404                    je 10001136
:10001132 33C0                    xor eax, eax
:10001134 EB03                    jmp 10001139

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:10001127(C), :10001130(C)
|
:10001136 6A01                    push 00000001
:10001138 58                      pop eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001134(U)
|
:10001139 50                      push eax
:1000113A E89B1F0000              call 100030DA
:1000113F 59                      pop ecx
:10001140 C3                      ret
  当我追踪到上面时,我终于对自己说,这个软件可能要破解成功了。因为现在我已经能够
看到胜利的曙光了。上面有push 01;pop eax这两个命令,所以它有可能表示注册成功。现
在的工作还是进入call中
:100052F0 B8D6D50010              mov eax, 1000D5D6
:100052F5 E8EA150000              call 100068E4
:100052FA 81EC10080000            sub esp, 00000810
:10005300 56                      push esi
:10005301 8BF1                    mov esi, ecx
:10005303 57                      push edi
:10005304 8975E8                  mov dword ptr [ebp-18], esi
:10005307 833E00                  cmp dword ptr [esi], 00000000
:1000530A 0F8561020000            jne 10005571
:10005310 6A01                    push 00000001
:10005312 5F                      pop edi
:10005313 6A00                    push 00000000
:10005315 893E                    mov dword ptr [esi], edi
:10005317 E8B0FCFFFF              call 10004FCC  <-出错,进入
:1000531C 85C0                    test eax, eax
:1000531E 59                      pop ecx
:1000531F 0F844C020000            je 10005571
:10005325 53                      push ebx

  上面有一个比较的地方,也是这个软件出错的地方,故进入call中。

:1000516C 8D45C0                  lea eax, dword ptr [ebp-40]  <-0123456789
:1000516F 50                      push eax
:10005170 E83B100000              call 100061B0
:10005175 83F80A                  cmp eax, 0000000A
:10005178 59                      pop ecx
:10005179 7213                    jb 1000518E
:1000517B 8D45C0                  lea eax, dword ptr [ebp-40]
:1000517E 50                      push eax
:1000517F E82C100000              call 100061B0
:10005184 83F814                  cmp eax, 00000014  ***
:10005187 59                      pop ecx
:10005188 0F86AC000000            jbe 1000523A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10005179(C)
|
:1000518E 6A00                    push 00000000

* Possible StringData Ref from Data Obj ->"Adbin Licence"
                                  |
:10005190 6830070110              push 10010730

* Possible StringData Ref from Data Obj ->"This version of Adbin from Paw-Print "
                                        ->"Software has been tampered with."
                                  |
:10005195 6888060110              push 10010688

* Reference To: USER32.GetActiveWindow, Ord:00DDh
                                  |
:1000519A FF1584E10010            Call dword ptr [1000E184]
:100051A0 50                      push eax

* Reference To: USER32.MessageBoxA, Ord:01BEh
                                  |
:100051A1 FF1580E10010            Call dword ptr [1000E180]
:100051A7 C7055816011004000000    mov dword ptr [10011658], 00000004
:100051B1 EB3D                    jmp 100051F0

  当我来这里我终于对自己说,成功一半了,为什么?你们看到没有在这里我们已经可以看
到我输入的注册码了,它开始检查注册码的位数了。同我们在输入注册码时的一样,这就说
明我已经离比较的地方不远了。向下我就应当可以发现比较的地方。

:1000523A 6A01                    push 00000001
:1000523C 8D45C0                  lea eax, dword ptr [ebp-40]
:1000523F 5F                      pop edi
:10005240 57                      push edi
:10005241 50                      push eax    <-RN:0123456789
:10005242 E8A9FCFFFF              call 10004EF0
:10005247 59                      pop ecx
:10005248 59                      pop ecx
:10005249 33C9                    xor ecx, ecx
:1000524B 3D85050000              cmp eax, 00000585    ***
:10005250 0F9DC1                  setnl cl
:10005253 41                      inc ecx
:10005254 8BC1                    mov eax, ecx
:10005256 3BC7                    cmp eax, edi
:10005258 A358160110              mov dword ptr [10011658], eax
:1000525D 0F8586000000            jne 100052E9
:10005263 6A03                    push 00000003
  到达这里我就知道已经到达这个软件的比较核心了。因为这里有所有我想得到的东西,一
是RN,二是比较命令。现在的任务就是找到实际注册码了,进入call中:

:10004EF0 55                      push ebp
:10004EF1 8BEC                    mov ebp, esp
:10004EF3 83EC28                  sub esp, 00000028
:10004EF6 834DF8FF                or dword ptr [ebp-08], FFFFFFFF
:10004EFA 53                      push ebx
:10004EFB 56                      push esi
:10004EFC 57                      push edi
:10004EFD 8B7D08                  mov edi, dword ptr [ebp+08]
:10004F00 33DB                    xor ebx, ebx
:10004F02 895DFC                  mov dword ptr [ebp-04], ebx
:10004F05 8A07                    mov al, byte ptr [edi]
:10004F07 84C0                    test al, al
:10004F09 747A                    je 10004F85

* Possible StringData Ref from Data Obj ->"n61O0rRxdkVHt5ZwqYUzoNDmCybcghfaMLj4liT8pQ3J2I"
                                        ->"vWP9euS7BKFGEAXs"
                                  |
:10004F0B BEB0040110              mov esi, 100104B0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10004F83(C)
|
:10004F10 0FBEC0                  movsx eax, al
:10004F13 50                      push eax
:10004F14 56                      push esi
:10004F15 E856130000              call 10006270
:10004F1A 59                      pop ecx
:10004F1B 85C0                    test eax, eax
:10004F1D 59                      pop ecx
:10004F1E 0F8490000000            je 10004FB4
:10004F24 2BC3                    sub eax, ebx
:10004F26 2BC6                    sub eax, esi
:10004F28 48                      dec eax
:10004F29 8BC8                    mov ecx, eax
:10004F2B 7903                    jns 10004F30
:10004F2D 83C13E                  add ecx, 0000003E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10004F2B(C)
|
:10004F30 8D5C0B01                lea ebx, dword ptr [ebx+ecx+01]
:10004F34 83FB3E                  cmp ebx, 0000003E
:10004F37 7C0A                    jl 10004F43
:10004F39 8BC3                    mov eax, ebx
:10004F3B 6A3E                    push 0000003E
:10004F3D 99                      cdq
:10004F3E 5B                      pop ebx
:10004F3F F7FB                    idiv ebx
:10004F41 8BDA                    mov ebx, edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10004F37(C)
|
:10004F43 837DF8FF                cmp dword ptr [ebp-08], FFFFFFFF
:10004F47 7505                    jne 10004F4E
:10004F49 894DF8                  mov dword ptr [ebp-08], ecx
:10004F4C EB10                    jmp 10004F5E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10004F47(C)
|
:10004F4E 83F907                  cmp ecx, 00000007
:10004F51 7F61                    jg 10004FB4
:10004F53 8B45FC                  mov eax, dword ptr [ebp-04]
:10004F56 6BC007                  imul eax, 00000007
:10004F59 03C1                    add eax, ecx
:10004F5B 8945FC                  mov dword ptr [ebp-04], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10004F4C(U)
|
:10004F5E 47